@camstack/addon-auth 1.2.169 → 1.2.170
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 +10 -1
- package/README.md +17 -12
- package/dist/{dist-D_I2DLb2.mjs → dist-E4y3Hyed.mjs} +540 -45
- package/dist/{dist-BNIIRoqG.js → dist-hxTUn06g.js} +540 -45
- package/dist/oidc/auth-oidc.addon.js +1 -1
- package/dist/oidc/auth-oidc.addon.mjs +1 -1
- package/dist/webauthn/_stub.js +1 -1
- package/dist/webauthn/{_virtual_mf-localSharedImportMap___mfe_internal__addon_auth_webauthn_widgets-B9Die94z.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_auth_webauthn_widgets-Dbb4FfU4.mjs} +3 -3
- package/dist/webauthn/_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CjbhzhqS.mjs +26 -0
- package/dist/webauthn/auth-webauthn.addon.js +1 -1
- package/dist/webauthn/auth-webauthn.addon.mjs +1 -1
- package/dist/webauthn/{hostInit-BgRutR_C.mjs → hostInit-Bc063UIg.mjs} +3 -3
- package/dist/webauthn/remoteEntry.js +1 -1
- package/package.json +1 -1
- package/dist/webauthn/_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DIQm_Kjt.mjs +0 -26
|
@@ -5608,7 +5608,7 @@ var ZodIssueCode = {
|
|
|
5608
5608
|
var ZodFirstPartyTypeKind;
|
|
5609
5609
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5610
5610
|
//#endregion
|
|
5611
|
-
//#region ../types/dist/sleep
|
|
5611
|
+
//#region ../types/dist/sleep--jXS9hWo.mjs
|
|
5612
5612
|
/**
|
|
5613
5613
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5614
5614
|
* window to float samples (D455).
|
|
@@ -8971,6 +8971,7 @@ var CAP_NAMES = Object.freeze([
|
|
|
8971
8971
|
"filesystem-browse",
|
|
8972
8972
|
"flood",
|
|
8973
8973
|
"gas",
|
|
8974
|
+
"group-active",
|
|
8974
8975
|
"group-commands",
|
|
8975
8976
|
"group-status",
|
|
8976
8977
|
"heating-valve",
|
|
@@ -8993,6 +8994,7 @@ var CAP_NAMES = Object.freeze([
|
|
|
8993
8994
|
"login-method",
|
|
8994
8995
|
"media-player",
|
|
8995
8996
|
"mesh-network",
|
|
8997
|
+
"meter",
|
|
8996
8998
|
"metrics-provider",
|
|
8997
8999
|
"model-convert",
|
|
8998
9000
|
"model-distributor",
|
|
@@ -9791,6 +9793,10 @@ Object.freeze({
|
|
|
9791
9793
|
"path": "detected",
|
|
9792
9794
|
"valueType": "boolean"
|
|
9793
9795
|
}],
|
|
9796
|
+
"group-active": [{
|
|
9797
|
+
"path": "active",
|
|
9798
|
+
"valueType": "boolean"
|
|
9799
|
+
}],
|
|
9794
9800
|
"group-status": [
|
|
9795
9801
|
{
|
|
9796
9802
|
"path": "included",
|
|
@@ -10050,6 +10056,10 @@ Object.freeze({
|
|
|
10050
10056
|
]
|
|
10051
10057
|
}
|
|
10052
10058
|
],
|
|
10059
|
+
"meter": [{
|
|
10060
|
+
"path": "value",
|
|
10061
|
+
"valueType": "number"
|
|
10062
|
+
}],
|
|
10053
10063
|
"motion": [
|
|
10054
10064
|
{
|
|
10055
10065
|
"path": "detected",
|
|
@@ -10793,7 +10803,7 @@ object({
|
|
|
10793
10803
|
params: record(string(), union([string(), number()])).optional()
|
|
10794
10804
|
});
|
|
10795
10805
|
//#endregion
|
|
10796
|
-
//#region ../types/dist/err-msg-
|
|
10806
|
+
//#region ../types/dist/err-msg-DIorGYeC.mjs
|
|
10797
10807
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
10798
10808
|
DeviceType["Camera"] = "camera";
|
|
10799
10809
|
DeviceType["Hub"] = "hub";
|
|
@@ -10887,8 +10897,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
|
10887
10897
|
DeviceType["PetFeeder"] = "pet-feeder";
|
|
10888
10898
|
/** Built-in dishwasher — program lifecycle, door / remote-start gates,
|
|
10889
10899
|
* salt and rinse-aid levels. Installed with the `dishwasher` cap.
|
|
10890
|
-
* Sources: native Bosch Home Connect, reusable by similar integrations.
|
|
10900
|
+
* Sources: native Bosch Home Connect, reusable by similar integrations.
|
|
10901
|
+
* A plug-built dishwasher carries running-state and power instead. */
|
|
10891
10902
|
DeviceType["Dishwasher"] = "dishwasher";
|
|
10903
|
+
/** Washing machine. A plug-built one is running while its power stays
|
|
10904
|
+
* above a threshold. No program cap — that surface is the dishwasher's. */
|
|
10905
|
+
DeviceType["Washer"] = "washer";
|
|
10906
|
+
/** Tumble dryer. Same plug-built running surface as {@link Washer}. */
|
|
10907
|
+
DeviceType["Dryer"] = "dryer";
|
|
10892
10908
|
return DeviceType;
|
|
10893
10909
|
}({});
|
|
10894
10910
|
var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
|
|
@@ -11146,7 +11162,7 @@ function errMsg(err) {
|
|
|
11146
11162
|
return String(err);
|
|
11147
11163
|
}
|
|
11148
11164
|
//#endregion
|
|
11149
|
-
//#region ../types/dist/composition-
|
|
11165
|
+
//#region ../types/dist/composition-Bb8iwHEJ.mjs
|
|
11150
11166
|
/**
|
|
11151
11167
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
11152
11168
|
*
|
|
@@ -11461,6 +11477,13 @@ var table = {
|
|
|
11461
11477
|
apply: () => {
|
|
11462
11478
|
throw new ExpressionEvalError("latchedAt: stateful evaluation context is required");
|
|
11463
11479
|
}
|
|
11480
|
+
},
|
|
11481
|
+
schmitt: {
|
|
11482
|
+
minArgs: 3,
|
|
11483
|
+
maxArgs: 5,
|
|
11484
|
+
apply: () => {
|
|
11485
|
+
throw new ExpressionEvalError("schmitt: stateful evaluation context is required");
|
|
11486
|
+
}
|
|
11464
11487
|
}
|
|
11465
11488
|
};
|
|
11466
11489
|
Object.freeze(Object.assign(Object.create(null), table));
|
|
@@ -11902,6 +11925,99 @@ function validateExpressionSource(src) {
|
|
|
11902
11925
|
return null;
|
|
11903
11926
|
}
|
|
11904
11927
|
/**
|
|
11928
|
+
* One power reading becomes a washer, dryer or dishwasher (D944 helper).
|
|
11929
|
+
*
|
|
11930
|
+
* Standby of the control board is under 5 W; a motor or a heater is far
|
|
11931
|
+
* above that, so 5 W is the line. A door lock or a short pump spike is not
|
|
11932
|
+
* a cycle, so running starts only after 30 s above the line.
|
|
11933
|
+
*
|
|
11934
|
+
* A wash, dry or dishwasher pause (soak, heat-wait, heater off between
|
|
11935
|
+
* bursts) lasts several minutes. Ending the cycle on the first dip would
|
|
11936
|
+
* report "finished" in the middle of the program, so the stop dwell is
|
|
11937
|
+
* 10 minutes on every type. The number is stored per type so one machine
|
|
11938
|
+
* can move later without moving the others.
|
|
11939
|
+
*/
|
|
11940
|
+
var APPLIANCE_TEMPLATE_ID = "appliance";
|
|
11941
|
+
var APPLIANCE_KINDS = [
|
|
11942
|
+
"washer",
|
|
11943
|
+
"dryer",
|
|
11944
|
+
"dishwasher"
|
|
11945
|
+
];
|
|
11946
|
+
DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
|
|
11947
|
+
/**
|
|
11948
|
+
* Statistics and integrals over a history read (D944).
|
|
11949
|
+
*
|
|
11950
|
+
* Pure: the same points always give the same answer, so a restart recomputes
|
|
11951
|
+
* rather than trusting a buffer. A gauge mean is time-weighted (value × ms),
|
|
11952
|
+
* never the mean of the samples. A hole with no held value is not integrated
|
|
11953
|
+
* as zero. A truncated read is not published.
|
|
11954
|
+
*/
|
|
11955
|
+
var STATISTIC_STATS = [
|
|
11956
|
+
"min",
|
|
11957
|
+
"max",
|
|
11958
|
+
"mean",
|
|
11959
|
+
"sum",
|
|
11960
|
+
"count",
|
|
11961
|
+
"change"
|
|
11962
|
+
];
|
|
11963
|
+
/**
|
|
11964
|
+
* The range a statistics or integral helper asks history for (D944).
|
|
11965
|
+
*
|
|
11966
|
+
* Calendar edges are the hub's timezone, never UTC midnight: a day is 23, 24
|
|
11967
|
+
* or 25 hours across a DST change. A tier is eligible only when its retention
|
|
11968
|
+
* is strictly longer than the longest that range can be. Forever qualifies.
|
|
11969
|
+
* Equal to a tier's retention is a refusal, not a short answer.
|
|
11970
|
+
*/
|
|
11971
|
+
var MINUTE_MS = 6e4;
|
|
11972
|
+
var HOUR_MS = 60 * MINUTE_MS;
|
|
11973
|
+
var DAY_MS = 24 * HOUR_MS;
|
|
11974
|
+
var ROLLING_SPANS = [
|
|
11975
|
+
"1h",
|
|
11976
|
+
"24h",
|
|
11977
|
+
"2d",
|
|
11978
|
+
"7d",
|
|
11979
|
+
"30d",
|
|
11980
|
+
"custom"
|
|
11981
|
+
];
|
|
11982
|
+
var CALENDAR_PERIODS = [
|
|
11983
|
+
"today",
|
|
11984
|
+
"yesterday",
|
|
11985
|
+
"this-week",
|
|
11986
|
+
"this-month"
|
|
11987
|
+
];
|
|
11988
|
+
var RESET_PERIODS = [
|
|
11989
|
+
"never",
|
|
11990
|
+
"daily",
|
|
11991
|
+
"weekly",
|
|
11992
|
+
"monthly"
|
|
11993
|
+
];
|
|
11994
|
+
5 * MINUTE_MS;
|
|
11995
|
+
24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
|
|
11996
|
+
7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
|
|
11997
|
+
var rollingWindowObject = object({
|
|
11998
|
+
kind: literal("rolling"),
|
|
11999
|
+
span: _enum(ROLLING_SPANS),
|
|
12000
|
+
customMinutes: number().int().min(5).optional()
|
|
12001
|
+
}).check((payload) => {
|
|
12002
|
+
if (payload.value.span === "custom" && payload.value.customMinutes === void 0) payload.issues.push({
|
|
12003
|
+
code: "custom",
|
|
12004
|
+
message: "a custom range needs a duration in minutes",
|
|
12005
|
+
path: ["customMinutes"],
|
|
12006
|
+
input: payload.value
|
|
12007
|
+
});
|
|
12008
|
+
if (payload.value.span !== "custom" && payload.value.customMinutes !== void 0) payload.issues.push({
|
|
12009
|
+
code: "custom",
|
|
12010
|
+
message: "only a custom range carries a duration",
|
|
12011
|
+
path: ["customMinutes"],
|
|
12012
|
+
input: payload.value
|
|
12013
|
+
});
|
|
12014
|
+
});
|
|
12015
|
+
var RollingWindowSchema = rollingWindowObject;
|
|
12016
|
+
var StatisticWindowSchema = discriminatedUnion("kind", [rollingWindowObject, object({
|
|
12017
|
+
kind: literal("calendar"),
|
|
12018
|
+
period: _enum(CALENDAR_PERIODS)
|
|
12019
|
+
})]);
|
|
12020
|
+
/**
|
|
11905
12021
|
* A composition source identity: `(addonId, stableId)`, never a numeric device
|
|
11906
12022
|
* id. Split out so helper schemas can name it without a cycle through
|
|
11907
12023
|
* `composition.ts` (D659).
|
|
@@ -11927,7 +12043,13 @@ var GROUP_TEMPLATE_IDS = [
|
|
|
11927
12043
|
"occupancy",
|
|
11928
12044
|
"binary",
|
|
11929
12045
|
"switch",
|
|
11930
|
-
"light"
|
|
12046
|
+
"light",
|
|
12047
|
+
"fan",
|
|
12048
|
+
"cover",
|
|
12049
|
+
"valve",
|
|
12050
|
+
"lock",
|
|
12051
|
+
"media-player",
|
|
12052
|
+
"climate"
|
|
11931
12053
|
];
|
|
11932
12054
|
var NUMERIC_AGGREGATES = [
|
|
11933
12055
|
"mean",
|
|
@@ -11957,14 +12079,73 @@ var HelperMemberSchema = object({
|
|
|
11957
12079
|
cap: string().min(1),
|
|
11958
12080
|
fieldPath: string().min(1)
|
|
11959
12081
|
});
|
|
11960
|
-
var HelperSpecSchema = discriminatedUnion("kind", [
|
|
11961
|
-
|
|
11962
|
-
|
|
11963
|
-
|
|
11964
|
-
|
|
11965
|
-
|
|
11966
|
-
|
|
11967
|
-
|
|
12082
|
+
var HelperSpecSchema = discriminatedUnion("kind", [
|
|
12083
|
+
object({
|
|
12084
|
+
kind: literal("group"),
|
|
12085
|
+
templateId: GroupTemplateIdSchema,
|
|
12086
|
+
aggregate: AggregateReducerSchema,
|
|
12087
|
+
members: array(HelperMemberSchema).min(1).max(64),
|
|
12088
|
+
/** Actuator groups only. Readings leave this unset. */
|
|
12089
|
+
active: ActiveCriterionSchema.optional()
|
|
12090
|
+
}),
|
|
12091
|
+
object({
|
|
12092
|
+
kind: literal("appliance"),
|
|
12093
|
+
templateId: literal(APPLIANCE_TEMPLATE_ID),
|
|
12094
|
+
appliance: _enum(APPLIANCE_KINDS),
|
|
12095
|
+
thresholdWatts: number().positive(),
|
|
12096
|
+
startDwellMs: number().int().nonnegative(),
|
|
12097
|
+
stopDwellMs: number().int().nonnegative(),
|
|
12098
|
+
member: HelperMemberSchema
|
|
12099
|
+
}),
|
|
12100
|
+
object({
|
|
12101
|
+
kind: literal("statistic"),
|
|
12102
|
+
stat: _enum(STATISTIC_STATS),
|
|
12103
|
+
window: StatisticWindowSchema,
|
|
12104
|
+
source: HelperMemberSchema
|
|
12105
|
+
}),
|
|
12106
|
+
object({
|
|
12107
|
+
kind: literal("integral"),
|
|
12108
|
+
reset: _enum(RESET_PERIODS),
|
|
12109
|
+
output: _enum(["energy", "meter"]),
|
|
12110
|
+
source: HelperMemberSchema
|
|
12111
|
+
}),
|
|
12112
|
+
object({
|
|
12113
|
+
kind: literal("threshold"),
|
|
12114
|
+
source: HelperMemberSchema,
|
|
12115
|
+
high: number(),
|
|
12116
|
+
low: number(),
|
|
12117
|
+
onForMs: number().int().nonnegative(),
|
|
12118
|
+
offForMs: number().int().nonnegative()
|
|
12119
|
+
}),
|
|
12120
|
+
object({
|
|
12121
|
+
kind: literal("arithmetic"),
|
|
12122
|
+
op: _enum([
|
|
12123
|
+
"sum",
|
|
12124
|
+
"difference",
|
|
12125
|
+
"ratio"
|
|
12126
|
+
]),
|
|
12127
|
+
inputs: array(HelperMemberSchema).min(2).max(64)
|
|
12128
|
+
}),
|
|
12129
|
+
object({
|
|
12130
|
+
kind: literal("expression"),
|
|
12131
|
+
expr: string().min(1),
|
|
12132
|
+
inputs: array(object({
|
|
12133
|
+
name: string().min(1),
|
|
12134
|
+
member: HelperMemberSchema
|
|
12135
|
+
})).min(1).max(64),
|
|
12136
|
+
output: _enum(["number", "boolean"])
|
|
12137
|
+
}),
|
|
12138
|
+
object({
|
|
12139
|
+
kind: literal("derivative"),
|
|
12140
|
+
window: RollingWindowSchema,
|
|
12141
|
+
per: _enum([
|
|
12142
|
+
"second",
|
|
12143
|
+
"minute",
|
|
12144
|
+
"hour"
|
|
12145
|
+
]),
|
|
12146
|
+
source: HelperMemberSchema
|
|
12147
|
+
})
|
|
12148
|
+
]);
|
|
11968
12149
|
/** A composed device's stableId is this prefix plus the block id. */
|
|
11969
12150
|
var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
|
|
11970
12151
|
/** Longest snippet a `code` source may carry (slice 4). */
|
|
@@ -12025,6 +12206,12 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
|
|
|
12025
12206
|
"all"
|
|
12026
12207
|
]),
|
|
12027
12208
|
reads: array(CompositionFieldReadSchema).min(1).max(64),
|
|
12209
|
+
/**
|
|
12210
|
+
* Set when the reads are an enum state, not a yes/no: the listed states
|
|
12211
|
+
* count as active (a cover is `open`). A state outside the list is inactive;
|
|
12212
|
+
* a read that is not a state at all is left out. Only `any` / `all` use it.
|
|
12213
|
+
*/
|
|
12214
|
+
activeWhen: array(string().min(1)).min(1).optional(),
|
|
12028
12215
|
/** `value` is the reading; the others are the member counts. */
|
|
12029
12216
|
publish: _enum([
|
|
12030
12217
|
"value",
|
|
@@ -12038,6 +12225,26 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
|
|
|
12038
12225
|
"omit",
|
|
12039
12226
|
"offline"
|
|
12040
12227
|
])
|
|
12228
|
+
}),
|
|
12229
|
+
object({
|
|
12230
|
+
kind: literal("series"),
|
|
12231
|
+
read: CompositionFieldReadSchema,
|
|
12232
|
+
/** `value` is the statistic or the integral. The others are the gap counts. */
|
|
12233
|
+
publish: _enum([
|
|
12234
|
+
"value",
|
|
12235
|
+
"included",
|
|
12236
|
+
"excluded",
|
|
12237
|
+
"total"
|
|
12238
|
+
]),
|
|
12239
|
+
/**
|
|
12240
|
+
* What an unanswered `value` does. Counts ignore this. `offline` leaves the
|
|
12241
|
+
* device unseeded until history answers, so a restart cannot publish 0.
|
|
12242
|
+
*/
|
|
12243
|
+
empty: _enum([
|
|
12244
|
+
"null",
|
|
12245
|
+
"omit",
|
|
12246
|
+
"offline"
|
|
12247
|
+
])
|
|
12041
12248
|
})
|
|
12042
12249
|
]);
|
|
12043
12250
|
var CompositionCommandTargetSchema = discriminatedUnion("kind", [object({
|
|
@@ -17573,7 +17780,22 @@ var BrokerProviderInfoSchema = object({
|
|
|
17573
17780
|
*/
|
|
17574
17781
|
interactiveConnectPath: string().min(1).optional(),
|
|
17575
17782
|
/** Relative hub path to disconnect the linked account (same popup pattern). */
|
|
17576
|
-
interactiveDisconnectPath: string().min(1).optional()
|
|
17783
|
+
interactiveDisconnectPath: string().min(1).optional(),
|
|
17784
|
+
/**
|
|
17785
|
+
* The kind signs in through a server-held interactive session instead of
|
|
17786
|
+
* (or before) typed credentials. `basePath` is a hub-relative route set
|
|
17787
|
+
* served by the owning addon (`/addon/<id>/...`) speaking the sign-in
|
|
17788
|
+
* contract: `POST {basePath}/start` (body: the form's settings) answers
|
|
17789
|
+
* `{ sessionId, loginUrl }`; `GET {basePath}/status?sessionId=` answers
|
|
17790
|
+
* `{ phase: 'starting' | 'awaiting-login' | 'captured' | 'error' |
|
|
17791
|
+
* 'cancelled', loginUrl, error }`; `POST {basePath}/commit`
|
|
17792
|
+
* (`{ sessionId, name, brokerId? }`) stores the credentials on a new or
|
|
17793
|
+
* existing broker and answers `{ brokerId }`; `POST {basePath}/cancel`
|
|
17794
|
+
* (`{ sessionId }`) drops the session. The dialog that edits a broker
|
|
17795
|
+
* offers it as the default path; the fields the session fills are
|
|
17796
|
+
* marked `filledBySignIn` in the kind's settings schema.
|
|
17797
|
+
*/
|
|
17798
|
+
signIn: object({ basePath: string().min(1) }).optional()
|
|
17577
17799
|
}))
|
|
17578
17800
|
});
|
|
17579
17801
|
var ListInputSchema = object({
|
|
@@ -18572,7 +18794,8 @@ var CompositionProblemSchema = object({
|
|
|
18572
18794
|
"native-capability-replace",
|
|
18573
18795
|
"mixed-quantity",
|
|
18574
18796
|
"helper-mismatch",
|
|
18575
|
-
"member-constraint"
|
|
18797
|
+
"member-constraint",
|
|
18798
|
+
"retention"
|
|
18576
18799
|
]),
|
|
18577
18800
|
path: string(),
|
|
18578
18801
|
message: string()
|
|
@@ -18806,13 +19029,17 @@ Object.freeze({
|
|
|
18806
19029
|
latchedAt: {
|
|
18807
19030
|
kind: "fixed",
|
|
18808
19031
|
result: ["number", "null"]
|
|
19032
|
+
},
|
|
19033
|
+
schmitt: {
|
|
19034
|
+
kind: "fixed",
|
|
19035
|
+
result: ["boolean", "null"]
|
|
18809
19036
|
}
|
|
18810
19037
|
});
|
|
18811
19038
|
/**
|
|
18812
19039
|
* One catalog row per base reading a group helper can build (D944 §3).
|
|
18813
19040
|
* Data, not a form default written into the block.
|
|
18814
19041
|
*/
|
|
18815
|
-
var NOW = {
|
|
19042
|
+
var NOW$2 = {
|
|
18816
19043
|
fieldPath: "lastFetchedAt",
|
|
18817
19044
|
expr: "now"
|
|
18818
19045
|
};
|
|
@@ -18826,6 +19053,8 @@ function numeric(input) {
|
|
|
18826
19053
|
family: "numeric",
|
|
18827
19054
|
deviceType: DeviceType.Sensor,
|
|
18828
19055
|
memberDeviceType: DeviceType.Sensor,
|
|
19056
|
+
memberDeviceTypes: [DeviceType.Sensor],
|
|
19057
|
+
activeWhen: void 0,
|
|
18829
19058
|
commandCaps: [],
|
|
18830
19059
|
baseUnit: baseUnitOf(input.quantity),
|
|
18831
19060
|
aggregates: NUMERIC_AGGREGATES,
|
|
@@ -18841,6 +19070,8 @@ function binary(input) {
|
|
|
18841
19070
|
family: "binary",
|
|
18842
19071
|
deviceType: DeviceType.Sensor,
|
|
18843
19072
|
memberDeviceType: DeviceType.Sensor,
|
|
19073
|
+
memberDeviceTypes: [DeviceType.Sensor],
|
|
19074
|
+
activeWhen: void 0,
|
|
18844
19075
|
commandCaps: [],
|
|
18845
19076
|
quantity: "none",
|
|
18846
19077
|
baseUnit: void 0,
|
|
@@ -18858,7 +19089,7 @@ var GROUP_TEMPLATES = [
|
|
|
18858
19089
|
quantity: "temperature",
|
|
18859
19090
|
defaultAggregate: "mean",
|
|
18860
19091
|
empty: "null",
|
|
18861
|
-
companions: [NOW]
|
|
19092
|
+
companions: [NOW$2]
|
|
18862
19093
|
}),
|
|
18863
19094
|
numeric({
|
|
18864
19095
|
id: "humidity",
|
|
@@ -18869,7 +19100,7 @@ var GROUP_TEMPLATES = [
|
|
|
18869
19100
|
quantity: "humidity",
|
|
18870
19101
|
defaultAggregate: "mean",
|
|
18871
19102
|
empty: "null",
|
|
18872
|
-
companions: [NOW]
|
|
19103
|
+
companions: [NOW$2]
|
|
18873
19104
|
}),
|
|
18874
19105
|
numeric({
|
|
18875
19106
|
id: "pressure",
|
|
@@ -18880,7 +19111,7 @@ var GROUP_TEMPLATES = [
|
|
|
18880
19111
|
quantity: "pressure",
|
|
18881
19112
|
defaultAggregate: "mean",
|
|
18882
19113
|
empty: "null",
|
|
18883
|
-
companions: [NOW]
|
|
19114
|
+
companions: [NOW$2]
|
|
18884
19115
|
}),
|
|
18885
19116
|
numeric({
|
|
18886
19117
|
id: "illuminance",
|
|
@@ -18891,7 +19122,7 @@ var GROUP_TEMPLATES = [
|
|
|
18891
19122
|
quantity: "illuminance",
|
|
18892
19123
|
defaultAggregate: "mean",
|
|
18893
19124
|
empty: "null",
|
|
18894
|
-
companions: [NOW]
|
|
19125
|
+
companions: [NOW$2]
|
|
18895
19126
|
}),
|
|
18896
19127
|
numeric({
|
|
18897
19128
|
id: "power",
|
|
@@ -18902,7 +19133,7 @@ var GROUP_TEMPLATES = [
|
|
|
18902
19133
|
quantity: "power",
|
|
18903
19134
|
defaultAggregate: "sum",
|
|
18904
19135
|
empty: "omit",
|
|
18905
|
-
companions: [NOW]
|
|
19136
|
+
companions: [NOW$2]
|
|
18906
19137
|
}),
|
|
18907
19138
|
numeric({
|
|
18908
19139
|
id: "energy",
|
|
@@ -18913,7 +19144,7 @@ var GROUP_TEMPLATES = [
|
|
|
18913
19144
|
quantity: "energy",
|
|
18914
19145
|
defaultAggregate: "sum",
|
|
18915
19146
|
empty: "omit",
|
|
18916
|
-
companions: [NOW]
|
|
19147
|
+
companions: [NOW$2]
|
|
18917
19148
|
}),
|
|
18918
19149
|
numeric({
|
|
18919
19150
|
id: "battery",
|
|
@@ -18948,7 +19179,7 @@ var GROUP_TEMPLATES = [
|
|
|
18948
19179
|
quantity: "device",
|
|
18949
19180
|
defaultAggregate: "mean",
|
|
18950
19181
|
empty: "null",
|
|
18951
|
-
companions: [NOW]
|
|
19182
|
+
companions: [NOW$2]
|
|
18952
19183
|
}),
|
|
18953
19184
|
binary({
|
|
18954
19185
|
id: "motion",
|
|
@@ -19042,6 +19273,11 @@ var GROUP_TEMPLATES = [
|
|
|
19042
19273
|
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.",
|
|
19043
19274
|
deviceType: DeviceType.Switch,
|
|
19044
19275
|
outputCap: "switch",
|
|
19276
|
+
outputField: "on",
|
|
19277
|
+
member: {
|
|
19278
|
+
cap: "switch",
|
|
19279
|
+
fieldPath: "on"
|
|
19280
|
+
},
|
|
19045
19281
|
commandCaps: ["switch"]
|
|
19046
19282
|
}),
|
|
19047
19283
|
actuator({
|
|
@@ -19049,34 +19285,136 @@ var GROUP_TEMPLATES = [
|
|
|
19049
19285
|
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.",
|
|
19050
19286
|
deviceType: DeviceType.Light,
|
|
19051
19287
|
outputCap: "switch",
|
|
19288
|
+
outputField: "on",
|
|
19289
|
+
member: {
|
|
19290
|
+
cap: "switch",
|
|
19291
|
+
fieldPath: "on"
|
|
19292
|
+
},
|
|
19052
19293
|
commandCaps: [
|
|
19053
19294
|
"switch",
|
|
19054
19295
|
"brightness",
|
|
19055
19296
|
"color"
|
|
19056
19297
|
]
|
|
19298
|
+
}),
|
|
19299
|
+
actuator({
|
|
19300
|
+
id: "fan",
|
|
19301
|
+
summary: "On when at least one fan is on, or when all of them are. Speed, preset, direction and oscillation are offered only when every fan has them. A command is not sent to a fan that lacks it.",
|
|
19302
|
+
deviceType: DeviceType.Fan,
|
|
19303
|
+
outputCap: "switch",
|
|
19304
|
+
outputField: "on",
|
|
19305
|
+
member: {
|
|
19306
|
+
cap: "switch",
|
|
19307
|
+
fieldPath: "on"
|
|
19308
|
+
},
|
|
19309
|
+
commandCaps: ["switch", "fan-control"]
|
|
19310
|
+
}),
|
|
19311
|
+
actuator({
|
|
19312
|
+
id: "cover",
|
|
19313
|
+
summary: "Open when at least one cover is open or part-open, or only when all of them are. Position and tilt are offered only when every cover has them. A cover that reports nothing is left out, never read as closed.",
|
|
19314
|
+
deviceType: DeviceType.Cover,
|
|
19315
|
+
outputCap: "group-active",
|
|
19316
|
+
outputField: "active",
|
|
19317
|
+
member: {
|
|
19318
|
+
cap: "cover",
|
|
19319
|
+
fieldPath: "state"
|
|
19320
|
+
},
|
|
19321
|
+
activeWhen: [
|
|
19322
|
+
"open",
|
|
19323
|
+
"opening",
|
|
19324
|
+
"stopped"
|
|
19325
|
+
],
|
|
19326
|
+
commandCaps: ["cover"]
|
|
19327
|
+
}),
|
|
19328
|
+
actuator({
|
|
19329
|
+
id: "valve",
|
|
19330
|
+
summary: "Open when at least one valve is open or part-open, or only when all of them are. Position is offered only when every valve has it. A valve that reports nothing is left out, never read as closed.",
|
|
19331
|
+
deviceType: DeviceType.Valve,
|
|
19332
|
+
outputCap: "group-active",
|
|
19333
|
+
outputField: "active",
|
|
19334
|
+
member: {
|
|
19335
|
+
cap: "valve",
|
|
19336
|
+
fieldPath: "state"
|
|
19337
|
+
},
|
|
19338
|
+
activeWhen: [
|
|
19339
|
+
"open",
|
|
19340
|
+
"opening",
|
|
19341
|
+
"stopped"
|
|
19342
|
+
],
|
|
19343
|
+
commandCaps: ["valve"]
|
|
19344
|
+
}),
|
|
19345
|
+
actuator({
|
|
19346
|
+
id: "lock",
|
|
19347
|
+
summary: "Locked when at least one lock is locked, or only when all of them are. A jammed or moving lock is not locked. Locking is one tap; unlocking the group needs a confirmation every time, and nothing is sent without it.",
|
|
19348
|
+
deviceType: DeviceType.Lock,
|
|
19349
|
+
outputCap: "group-active",
|
|
19350
|
+
outputField: "active",
|
|
19351
|
+
member: {
|
|
19352
|
+
cap: "lock-control",
|
|
19353
|
+
fieldPath: "state"
|
|
19354
|
+
},
|
|
19355
|
+
activeWhen: ["locked"],
|
|
19356
|
+
commandCaps: ["lock-control"]
|
|
19357
|
+
}),
|
|
19358
|
+
actuator({
|
|
19359
|
+
id: "media-player",
|
|
19360
|
+
summary: "Playing when at least one player is playing, or only when all of them are. Volume is offered only when every player has it. A player that reports nothing is left out, never read as stopped.",
|
|
19361
|
+
deviceType: DeviceType.MediaPlayer,
|
|
19362
|
+
outputCap: "group-active",
|
|
19363
|
+
outputField: "active",
|
|
19364
|
+
member: {
|
|
19365
|
+
cap: "media-player",
|
|
19366
|
+
fieldPath: "state"
|
|
19367
|
+
},
|
|
19368
|
+
activeWhen: ["playing", "buffering"],
|
|
19369
|
+
commandCaps: ["media-player"]
|
|
19370
|
+
}),
|
|
19371
|
+
actuator({
|
|
19372
|
+
id: "climate",
|
|
19373
|
+
summary: "Running when at least one thermostat or air conditioner is not off, or only when all of them are. Target temperature and fan are offered only when every device has them. A device that reports nothing is left out, never read as off.",
|
|
19374
|
+
deviceType: DeviceType.Thermostat,
|
|
19375
|
+
memberDeviceTypes: [DeviceType.Thermostat, DeviceType.Climate],
|
|
19376
|
+
outputCap: "group-active",
|
|
19377
|
+
outputField: "active",
|
|
19378
|
+
member: {
|
|
19379
|
+
cap: "climate-control",
|
|
19380
|
+
fieldPath: "mode"
|
|
19381
|
+
},
|
|
19382
|
+
activeWhen: [
|
|
19383
|
+
"heat",
|
|
19384
|
+
"cool",
|
|
19385
|
+
"auto",
|
|
19386
|
+
"heat_cool",
|
|
19387
|
+
"fan_only",
|
|
19388
|
+
"dry"
|
|
19389
|
+
],
|
|
19390
|
+
commandCaps: ["climate-control"]
|
|
19057
19391
|
})
|
|
19058
19392
|
];
|
|
19059
19393
|
function actuator(input) {
|
|
19060
19394
|
return {
|
|
19061
|
-
|
|
19395
|
+
id: input.id,
|
|
19396
|
+
summary: input.summary,
|
|
19397
|
+
deviceType: input.deviceType,
|
|
19398
|
+
outputCap: input.outputCap,
|
|
19399
|
+
outputField: input.outputField,
|
|
19400
|
+
commandCaps: input.commandCaps,
|
|
19062
19401
|
family: "actuator",
|
|
19063
19402
|
role: void 0,
|
|
19064
19403
|
memberDeviceType: input.deviceType,
|
|
19065
|
-
|
|
19404
|
+
memberDeviceTypes: input.memberDeviceTypes ?? [input.deviceType],
|
|
19405
|
+
activeWhen: input.activeWhen,
|
|
19066
19406
|
quantity: "none",
|
|
19067
19407
|
baseUnit: void 0,
|
|
19068
19408
|
aggregates: BINARY_AGGREGATES,
|
|
19069
19409
|
defaultAggregate: "any",
|
|
19070
19410
|
empty: "offline",
|
|
19071
|
-
accept: [
|
|
19072
|
-
cap: "switch",
|
|
19073
|
-
fieldPath: "on"
|
|
19074
|
-
}],
|
|
19411
|
+
accept: [input.member],
|
|
19075
19412
|
companions: [CHANGED]
|
|
19076
19413
|
};
|
|
19077
19414
|
}
|
|
19078
19415
|
new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
|
|
19079
19416
|
DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
|
|
19417
|
+
DeviceType.Camera;
|
|
19080
19418
|
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
19081
19419
|
/**
|
|
19082
19420
|
* What a composition may BUILD on a device type (G2, D676): the caps a new
|
|
@@ -44117,7 +44455,7 @@ var NetworkAccessStatusSchema = object({
|
|
|
44117
44455
|
});
|
|
44118
44456
|
/**
|
|
44119
44457
|
* Optional, richer endpoint shape returned by providers that expose
|
|
44120
|
-
* MORE than one ingress concurrently (Tailscale
|
|
44458
|
+
* MORE than one ingress concurrently (Tailscale Funnel with mixed
|
|
44121
44459
|
* serve+funnel rules, future ngrok multi-tunnel, …). Each entry carries
|
|
44122
44460
|
* the originating provider config (mode + sourcePort) so the
|
|
44123
44461
|
* orchestrator UI can label rows distinctly. Providers that expose only
|
|
@@ -46760,7 +47098,20 @@ var NcRuleInputSchema = object({
|
|
|
46760
47098
|
* save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
|
|
46761
47099
|
* path does not run Zod defaults.
|
|
46762
47100
|
*/
|
|
46763
|
-
groupingSec: number().int().min(5).max(60).optional()
|
|
47101
|
+
groupingSec: number().int().min(5).max(60).optional(),
|
|
47102
|
+
/**
|
|
47103
|
+
* ASK ME TO CONFIRM DETECTIONS (#243): a DETECTION notification of this rule
|
|
47104
|
+
* carries "Correct" / "Wrong" buttons (and, where the channel has room, a
|
|
47105
|
+
* "Wrong, it is a <class>" choice). A tap marks the track for retraining, the
|
|
47106
|
+
* same mark the Library writes, and records whose notification it was and
|
|
47107
|
+
* when. A channel with no buttons gets the same two choices as links.
|
|
47108
|
+
*
|
|
47109
|
+
* `.optional()`, never `.default()` (a Zod default does not run on the addon
|
|
47110
|
+
* cap path): absent and `false` both mean off, which is what every rule
|
|
47111
|
+
* authored before this field meant. An editor turns it off by writing
|
|
47112
|
+
* `false`, so it needs no `clear` key.
|
|
47113
|
+
*/
|
|
47114
|
+
askVerdict: boolean().optional()
|
|
46764
47115
|
});
|
|
46765
47116
|
/**
|
|
46766
47117
|
* Partial patch for `updateRule` — any subset of the input fields, plus the
|
|
@@ -57268,7 +57619,7 @@ var BatteryStatusSchema = object({
|
|
|
57268
57619
|
*/
|
|
57269
57620
|
binary: boolean().optional().meta({ label: "Binary indicator" })
|
|
57270
57621
|
});
|
|
57271
|
-
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat;
|
|
57622
|
+
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter;
|
|
57272
57623
|
method(object({
|
|
57273
57624
|
deviceId: number(),
|
|
57274
57625
|
/** Bound on the wait. Sensible range 3000–10000ms. */
|
|
@@ -59012,7 +59363,13 @@ results: array(object({
|
|
|
59012
59363
|
/** Ms epoch of the attempt. */
|
|
59013
59364
|
at: number()
|
|
59014
59365
|
})) });
|
|
59015
|
-
DeviceType.Switch, DeviceType.Light;
|
|
59366
|
+
DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
|
|
59367
|
+
object({
|
|
59368
|
+
active: boolean().meta({ label: "Active" }),
|
|
59369
|
+
/** Ms epoch when the slice was last updated. */
|
|
59370
|
+
lastChangedAt: number()
|
|
59371
|
+
});
|
|
59372
|
+
DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Climate, DeviceType.Thermostat;
|
|
59016
59373
|
object({
|
|
59017
59374
|
/** Members whose current value entered the aggregate. */
|
|
59018
59375
|
included: number().int().nonnegative().meta(readingMeta("count", {
|
|
@@ -59030,7 +59387,7 @@ object({
|
|
|
59030
59387
|
label: "Members"
|
|
59031
59388
|
}))
|
|
59032
59389
|
});
|
|
59033
|
-
DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
|
|
59390
|
+
DeviceType.Sensor, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
|
|
59034
59391
|
object({
|
|
59035
59392
|
/** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
|
|
59036
59393
|
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
@@ -59937,7 +60294,14 @@ DeviceType.Lock, method(object({
|
|
|
59937
60294
|
auth: "protected"
|
|
59938
60295
|
}), method(object({
|
|
59939
60296
|
deviceId: number().int().nonnegative(),
|
|
59940
|
-
code: string().min(1).optional()
|
|
60297
|
+
code: string().min(1).optional(),
|
|
60298
|
+
/**
|
|
60299
|
+
* Honoured by a helper lock GROUP only (D944): unlocking several doors
|
|
60300
|
+
* with one call is refused unless the caller says it was confirmed. A
|
|
60301
|
+
* single lock ignores it. The refusal lives in the callee, so no
|
|
60302
|
+
* automation or API caller reaches the doors by skipping a dialog.
|
|
60303
|
+
*/
|
|
60304
|
+
confirm: boolean().optional()
|
|
59941
60305
|
}), _void(), {
|
|
59942
60306
|
kind: "mutation",
|
|
59943
60307
|
auth: "protected"
|
|
@@ -59945,6 +60309,11 @@ DeviceType.Lock, method(object({
|
|
|
59945
60309
|
kind: "mutation",
|
|
59946
60310
|
auth: "protected"
|
|
59947
60311
|
});
|
|
60312
|
+
object({
|
|
60313
|
+
value: number().nullable().meta(readingMeta("device", { label: "Total" })),
|
|
60314
|
+
lastFetchedAt: number()
|
|
60315
|
+
});
|
|
60316
|
+
DeviceType.Sensor;
|
|
59948
60317
|
/**
|
|
59949
60318
|
* Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
|
|
59950
60319
|
* Apple TV, Spotify, Roku, generic OTT receivers, …) on
|
|
@@ -61852,9 +62221,9 @@ object({
|
|
|
61852
62221
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
61853
62222
|
kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
|
|
61854
62223
|
/** Voltage in volts. */
|
|
61855
|
-
volts: number().optional().meta(readingMeta("voltage")),
|
|
62224
|
+
volts: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
61856
62225
|
/** Current in amperes. */
|
|
61857
|
-
amps: number().optional().meta(readingMeta("current")),
|
|
62226
|
+
amps: number().optional().meta(readingMeta("current", { label: "Current" })),
|
|
61858
62227
|
/** Apparent power in volt-amperes. */
|
|
61859
62228
|
va: number().optional().meta(readingMeta("apparent-power")),
|
|
61860
62229
|
/** Power factor (0..1) if reported. */
|
|
@@ -61862,7 +62231,23 @@ object({
|
|
|
61862
62231
|
/** Ms epoch when the slice was last updated. */
|
|
61863
62232
|
lastFetchedAt: number()
|
|
61864
62233
|
});
|
|
61865
|
-
|
|
62234
|
+
[
|
|
62235
|
+
DeviceType.Sensor,
|
|
62236
|
+
DeviceType.Switch,
|
|
62237
|
+
DeviceType.Light,
|
|
62238
|
+
DeviceType.Fan,
|
|
62239
|
+
DeviceType.Climate,
|
|
62240
|
+
DeviceType.Thermostat,
|
|
62241
|
+
DeviceType.Humidifier,
|
|
62242
|
+
DeviceType.WaterHeater,
|
|
62243
|
+
DeviceType.MediaPlayer,
|
|
62244
|
+
DeviceType.Washer,
|
|
62245
|
+
DeviceType.Dryer,
|
|
62246
|
+
DeviceType.Dishwasher,
|
|
62247
|
+
DeviceType.Vacuum,
|
|
62248
|
+
DeviceType.LawnMower,
|
|
62249
|
+
DeviceType.PetFeeder
|
|
62250
|
+
].filter((type) => type !== DeviceType.Sensor);
|
|
61866
62251
|
/**
|
|
61867
62252
|
* Presence cap. Models HA `person.*` and `device_tracker.*` entities
|
|
61868
62253
|
* on `DeviceType.Presence`. Read-only — no setters: presence is
|
|
@@ -62309,7 +62694,7 @@ object({
|
|
|
62309
62694
|
phase: string().nullable()
|
|
62310
62695
|
});
|
|
62311
62696
|
Object.values(DeviceType);
|
|
62312
|
-
DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
62697
|
+
DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
62313
62698
|
DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
|
|
62314
62699
|
kind: "mutation",
|
|
62315
62700
|
auth: "admin"
|
|
@@ -64348,7 +64733,7 @@ object({
|
|
|
64348
64733
|
/** Ms epoch of the last state change. Useful for UI "X minutes ago". */
|
|
64349
64734
|
lastChangedAt: number()
|
|
64350
64735
|
});
|
|
64351
|
-
DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
|
|
64736
|
+
DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, method(object({
|
|
64352
64737
|
deviceId: number(),
|
|
64353
64738
|
on: boolean()
|
|
64354
64739
|
}), _void(), {
|
|
@@ -66040,8 +66425,9 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
|
|
|
66040
66425
|
kind: "mutation",
|
|
66041
66426
|
auth: "admin"
|
|
66042
66427
|
});
|
|
66428
|
+
DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
|
|
66043
66429
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
66044
|
-
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;
|
|
66430
|
+
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, 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.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
66045
66431
|
String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
|
|
66046
66432
|
DeviceRole.BinarySensor, DeviceRole.MotionSensor;
|
|
66047
66433
|
new Set(CAP_NAMES);
|
|
@@ -66094,7 +66480,7 @@ var AccessoryKind = {
|
|
|
66094
66480
|
PrivacyMask: DeviceRole.PrivacyMask
|
|
66095
66481
|
};
|
|
66096
66482
|
AccessoryKind.Siren, AccessoryKind.Floodlight, AccessoryKind.Spotlight, AccessoryKind.PirSensor, AccessoryKind.Chime, AccessoryKind.Autotrack, AccessoryKind.Nightvision, AccessoryKind.PrivacyMask;
|
|
66097
|
-
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;
|
|
66483
|
+
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;
|
|
66098
66484
|
new Set(Object.values(DeviceType));
|
|
66099
66485
|
Object.freeze({
|
|
66100
66486
|
"accessories.getStatus": {
|
|
@@ -69317,6 +69703,13 @@ Object.freeze({
|
|
|
69317
69703
|
access: "view",
|
|
69318
69704
|
role: "viewer"
|
|
69319
69705
|
},
|
|
69706
|
+
"groupActive.getStatus": {
|
|
69707
|
+
capName: "group-active",
|
|
69708
|
+
capScope: "device",
|
|
69709
|
+
addonId: null,
|
|
69710
|
+
access: "view",
|
|
69711
|
+
role: "viewer"
|
|
69712
|
+
},
|
|
69320
69713
|
"groupCommands.getStatus": {
|
|
69321
69714
|
capName: "group-commands",
|
|
69322
69715
|
capScope: "device",
|
|
@@ -70283,6 +70676,13 @@ Object.freeze({
|
|
|
70283
70676
|
access: "create",
|
|
70284
70677
|
role: "admin"
|
|
70285
70678
|
},
|
|
70679
|
+
"meter.getStatus": {
|
|
70680
|
+
capName: "meter",
|
|
70681
|
+
capScope: "device",
|
|
70682
|
+
addonId: null,
|
|
70683
|
+
access: "view",
|
|
70684
|
+
role: "viewer"
|
|
70685
|
+
},
|
|
70286
70686
|
"metricsProvider.collectSnapshot": {
|
|
70287
70687
|
capName: "metrics-provider",
|
|
70288
70688
|
capScope: "system",
|
|
@@ -78381,7 +78781,39 @@ var APPLIANCE_CAP_VOCABULARY = {
|
|
|
78381
78781
|
phrase: t("When {device} finishes", "Quando {device} finisce"),
|
|
78382
78782
|
icon: "square"
|
|
78383
78783
|
}
|
|
78384
|
-
}
|
|
78784
|
+
},
|
|
78785
|
+
overrides: { byType: {
|
|
78786
|
+
[DeviceType.Washer]: {
|
|
78787
|
+
state: { running: {
|
|
78788
|
+
whenTrue: t("When the washing machine starts", "Quando la lavatrice inizia"),
|
|
78789
|
+
whenFalse: t("When the washing machine has finished", "Quando la lavatrice ha finito")
|
|
78790
|
+
} },
|
|
78791
|
+
events: {
|
|
78792
|
+
onStarted: { phrase: t("When the washing machine starts", "Quando la lavatrice inizia") },
|
|
78793
|
+
onFinished: { phrase: t("When the washing machine has finished", "Quando la lavatrice ha finito") }
|
|
78794
|
+
}
|
|
78795
|
+
},
|
|
78796
|
+
[DeviceType.Dryer]: {
|
|
78797
|
+
state: { running: {
|
|
78798
|
+
whenTrue: t("When the dryer starts", "Quando l'asciugatrice inizia"),
|
|
78799
|
+
whenFalse: t("When the dryer has finished", "Quando l'asciugatrice ha finito")
|
|
78800
|
+
} },
|
|
78801
|
+
events: {
|
|
78802
|
+
onStarted: { phrase: t("When the dryer starts", "Quando l'asciugatrice inizia") },
|
|
78803
|
+
onFinished: { phrase: t("When the dryer has finished", "Quando l'asciugatrice ha finito") }
|
|
78804
|
+
}
|
|
78805
|
+
},
|
|
78806
|
+
[DeviceType.Dishwasher]: {
|
|
78807
|
+
state: { running: {
|
|
78808
|
+
whenTrue: t("When the dishwasher starts", "Quando la lavastoviglie inizia"),
|
|
78809
|
+
whenFalse: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito")
|
|
78810
|
+
} },
|
|
78811
|
+
events: {
|
|
78812
|
+
onStarted: { phrase: t("When the dishwasher starts", "Quando la lavastoviglie inizia") },
|
|
78813
|
+
onFinished: { phrase: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito") }
|
|
78814
|
+
}
|
|
78815
|
+
}
|
|
78816
|
+
} }
|
|
78385
78817
|
},
|
|
78386
78818
|
update: {
|
|
78387
78819
|
scope: "device",
|
|
@@ -79153,6 +79585,10 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
79153
79585
|
icon: "flame"
|
|
79154
79586
|
}]
|
|
79155
79587
|
},
|
|
79588
|
+
"group-active": {
|
|
79589
|
+
scope: "device",
|
|
79590
|
+
noun: t("Group state", "Stato del gruppo")
|
|
79591
|
+
},
|
|
79156
79592
|
"group-commands": {
|
|
79157
79593
|
scope: "device",
|
|
79158
79594
|
noun: t("Group command", "Comando di gruppo")
|
|
@@ -79209,6 +79645,17 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
79209
79645
|
}],
|
|
79210
79646
|
events: { onMotionChanged: { notOperatorFacing: "the `detected` state trigger phrases both edges, from the mirror that survives a dropped event (D49)" } }
|
|
79211
79647
|
},
|
|
79648
|
+
meter: {
|
|
79649
|
+
scope: "device",
|
|
79650
|
+
noun: t("Meter", "Contatore"),
|
|
79651
|
+
state: [{
|
|
79652
|
+
kind: "numeric",
|
|
79653
|
+
field: "value",
|
|
79654
|
+
quantity: t("the total", "il totale"),
|
|
79655
|
+
label: t("Total", "Totale"),
|
|
79656
|
+
icon: "gauge"
|
|
79657
|
+
}]
|
|
79658
|
+
},
|
|
79212
79659
|
"numeric-sensor": {
|
|
79213
79660
|
scope: "device",
|
|
79214
79661
|
noun: t("Sensor", "Sensore"),
|
|
@@ -79681,8 +80128,47 @@ function projectAction(cap, action) {
|
|
|
79681
80128
|
};
|
|
79682
80129
|
}
|
|
79683
80130
|
Object.entries(CAP_VOCABULARY_BY_NAME).flatMap(([cap, entry]) => entry.scope === "device" ? (entry.actions ?? []).map((a) => projectAction(cap, a)) : []);
|
|
79684
|
-
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;
|
|
80131
|
+
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;
|
|
79685
80132
|
DeviceFeature.BatteryOperated;
|
|
80133
|
+
DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
|
|
80134
|
+
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.";
|
|
80135
|
+
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.";
|
|
80136
|
+
var ALEXA_REASON = "Alexa has no laundry category in this export, and neither power nor running has an Alexa interface.";
|
|
80137
|
+
var GOOGLE_REASON = "Google WASHER, DRYER and DISHWASHER require RunCycle. A power threshold is not that trait, and this export does not publish RunCycle.";
|
|
80138
|
+
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.";
|
|
80139
|
+
function withheld(reason) {
|
|
80140
|
+
return {
|
|
80141
|
+
[DeviceType.Washer]: {
|
|
80142
|
+
exported: false,
|
|
80143
|
+
reason
|
|
80144
|
+
},
|
|
80145
|
+
[DeviceType.Dryer]: {
|
|
80146
|
+
exported: false,
|
|
80147
|
+
reason
|
|
80148
|
+
},
|
|
80149
|
+
[DeviceType.Dishwasher]: {
|
|
80150
|
+
exported: false,
|
|
80151
|
+
reason
|
|
80152
|
+
}
|
|
80153
|
+
};
|
|
80154
|
+
}
|
|
80155
|
+
function offered(received) {
|
|
80156
|
+
return {
|
|
80157
|
+
[DeviceType.Washer]: {
|
|
80158
|
+
exported: true,
|
|
80159
|
+
as: received
|
|
80160
|
+
},
|
|
80161
|
+
[DeviceType.Dryer]: {
|
|
80162
|
+
exported: true,
|
|
80163
|
+
as: received
|
|
80164
|
+
},
|
|
80165
|
+
[DeviceType.Dishwasher]: {
|
|
80166
|
+
exported: true,
|
|
80167
|
+
as: received
|
|
80168
|
+
}
|
|
80169
|
+
};
|
|
80170
|
+
}
|
|
80171
|
+
offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
|
|
79686
80172
|
Object.freeze({
|
|
79687
80173
|
"accessories.getStatus": [{
|
|
79688
80174
|
name: "deviceId",
|
|
@@ -80649,6 +81135,11 @@ Object.freeze({
|
|
|
80649
81135
|
form: "single",
|
|
80650
81136
|
optional: false
|
|
80651
81137
|
}],
|
|
81138
|
+
"groupActive.getStatus": [{
|
|
81139
|
+
name: "deviceId",
|
|
81140
|
+
form: "single",
|
|
81141
|
+
optional: false
|
|
81142
|
+
}],
|
|
80652
81143
|
"groupCommands.getStatus": [{
|
|
80653
81144
|
name: "deviceId",
|
|
80654
81145
|
form: "single",
|
|
@@ -80859,6 +81350,11 @@ Object.freeze({
|
|
|
80859
81350
|
form: "single",
|
|
80860
81351
|
optional: false
|
|
80861
81352
|
}],
|
|
81353
|
+
"meter.getStatus": [{
|
|
81354
|
+
name: "deviceId",
|
|
81355
|
+
form: "single",
|
|
81356
|
+
optional: false
|
|
81357
|
+
}],
|
|
80862
81358
|
"motion.getStatus": [{
|
|
80863
81359
|
name: "deviceId",
|
|
80864
81360
|
form: "single",
|
|
@@ -82466,7 +82962,6 @@ Object.freeze({
|
|
|
82466
82962
|
"network-access": "ingress",
|
|
82467
82963
|
"smtp-provider": "email"
|
|
82468
82964
|
});
|
|
82469
|
-
DeviceType.Camera;
|
|
82470
82965
|
/**
|
|
82471
82966
|
* A saved Customize assignment (D936). The schema is the type: callers use
|
|
82472
82967
|
* `z.infer`, they do not restate the shape.
|