@camstack/addon-model-studio 1.1.305 → 1.1.307
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{MotionZonesSettings-nwsYJ4LM.mjs → MotionZonesSettings-DkgjOPCB.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-D44t-3Il.mjs → PrivacyMaskSettings-fESQpFIS.mjs} +4 -4
- package/dist/{SceneMonitorEditor-B7GPFInk.mjs → SceneMonitorEditor-C9B7EixP.mjs} +123 -124
- package/dist/_stub.js +4359 -4370
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-Dm-CsmsB.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DLl1PFV-.mjs} +3 -3
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BQQ1gj_P.mjs +26 -0
- package/dist/addon-model-studio.css +1 -1
- package/dist/{hostInit-BCkvpKIY.mjs → hostInit-DHIO-yMd.mjs} +2 -2
- package/dist/model-studio.addon.js +280 -30
- package/dist/model-studio.addon.mjs +280 -30
- package/dist/{player-overlays-BmekT-lx.mjs → player-overlays-SAR77Y-f.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-DEe2tyvb.mjs → responsive-DhsW4w_p.mjs} +1 -1
- package/dist/{scene-monitor-copy-0SI6bJjg.mjs → scene-monitor-copy-BYVAve5e.mjs} +63 -50
- package/dist/{square-_3D14YQf.mjs → square-Dy3-P6UW.mjs} +1 -1
- package/dist/{trash-2-CBnastSw.mjs → trash-2-DScdmxQC.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-BVMDXJrt.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-cC9vn7dW.mjs} +1 -1
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B5mcgboO.mjs +0 -26
|
@@ -36,7 +36,7 @@ async function r() {
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"@camstack/types": {
|
|
39
|
-
version: "1.2.
|
|
39
|
+
version: "1.2.427",
|
|
40
40
|
scope: "default",
|
|
41
41
|
shareConfig: {
|
|
42
42
|
singleton: !0,
|
|
@@ -81,7 +81,7 @@ async function r() {
|
|
|
81
81
|
}
|
|
82
82
|
},
|
|
83
83
|
"@camstack/ui-library": {
|
|
84
|
-
version: "1.2.
|
|
84
|
+
version: "1.2.336",
|
|
85
85
|
scope: "default",
|
|
86
86
|
shareConfig: {
|
|
87
87
|
singleton: !0,
|
|
@@ -5837,7 +5837,7 @@ var ZodIssueCode = {
|
|
|
5837
5837
|
var ZodFirstPartyTypeKind;
|
|
5838
5838
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5839
5839
|
//#endregion
|
|
5840
|
-
//#region ../types/dist/sleep
|
|
5840
|
+
//#region ../types/dist/sleep--jXS9hWo.mjs
|
|
5841
5841
|
/**
|
|
5842
5842
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5843
5843
|
* window to float samples (D455).
|
|
@@ -9040,6 +9040,7 @@ var CAP_NAMES = Object.freeze([
|
|
|
9040
9040
|
"filesystem-browse",
|
|
9041
9041
|
"flood",
|
|
9042
9042
|
"gas",
|
|
9043
|
+
"group-active",
|
|
9043
9044
|
"group-commands",
|
|
9044
9045
|
"group-status",
|
|
9045
9046
|
"heating-valve",
|
|
@@ -9861,6 +9862,10 @@ Object.freeze({
|
|
|
9861
9862
|
"path": "detected",
|
|
9862
9863
|
"valueType": "boolean"
|
|
9863
9864
|
}],
|
|
9865
|
+
"group-active": [{
|
|
9866
|
+
"path": "active",
|
|
9867
|
+
"valueType": "boolean"
|
|
9868
|
+
}],
|
|
9864
9869
|
"group-status": [
|
|
9865
9870
|
{
|
|
9866
9871
|
"path": "included",
|
|
@@ -11216,7 +11221,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
11216
11221
|
return DeviceRole;
|
|
11217
11222
|
}({});
|
|
11218
11223
|
//#endregion
|
|
11219
|
-
//#region ../types/dist/composition-
|
|
11224
|
+
//#region ../types/dist/composition-Bb8iwHEJ.mjs
|
|
11220
11225
|
/**
|
|
11221
11226
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
11222
11227
|
*
|
|
@@ -11531,6 +11536,13 @@ var table = {
|
|
|
11531
11536
|
apply: () => {
|
|
11532
11537
|
throw new ExpressionEvalError("latchedAt: stateful evaluation context is required");
|
|
11533
11538
|
}
|
|
11539
|
+
},
|
|
11540
|
+
schmitt: {
|
|
11541
|
+
minArgs: 3,
|
|
11542
|
+
maxArgs: 5,
|
|
11543
|
+
apply: () => {
|
|
11544
|
+
throw new ExpressionEvalError("schmitt: stateful evaluation context is required");
|
|
11545
|
+
}
|
|
11534
11546
|
}
|
|
11535
11547
|
};
|
|
11536
11548
|
Object.freeze(Object.assign(Object.create(null), table));
|
|
@@ -12041,7 +12053,7 @@ var RESET_PERIODS = [
|
|
|
12041
12053
|
5 * MINUTE_MS;
|
|
12042
12054
|
24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
|
|
12043
12055
|
7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
|
|
12044
|
-
var
|
|
12056
|
+
var rollingWindowObject = object({
|
|
12045
12057
|
kind: literal("rolling"),
|
|
12046
12058
|
span: _enum(ROLLING_SPANS),
|
|
12047
12059
|
customMinutes: number().int().min(5).optional()
|
|
@@ -12058,7 +12070,9 @@ var StatisticWindowSchema = discriminatedUnion("kind", [object({
|
|
|
12058
12070
|
path: ["customMinutes"],
|
|
12059
12071
|
input: payload.value
|
|
12060
12072
|
});
|
|
12061
|
-
})
|
|
12073
|
+
});
|
|
12074
|
+
var RollingWindowSchema = rollingWindowObject;
|
|
12075
|
+
var StatisticWindowSchema = discriminatedUnion("kind", [rollingWindowObject, object({
|
|
12062
12076
|
kind: literal("calendar"),
|
|
12063
12077
|
period: _enum(CALENDAR_PERIODS)
|
|
12064
12078
|
})]);
|
|
@@ -12088,7 +12102,13 @@ var GROUP_TEMPLATE_IDS = [
|
|
|
12088
12102
|
"occupancy",
|
|
12089
12103
|
"binary",
|
|
12090
12104
|
"switch",
|
|
12091
|
-
"light"
|
|
12105
|
+
"light",
|
|
12106
|
+
"fan",
|
|
12107
|
+
"cover",
|
|
12108
|
+
"valve",
|
|
12109
|
+
"lock",
|
|
12110
|
+
"media-player",
|
|
12111
|
+
"climate"
|
|
12092
12112
|
];
|
|
12093
12113
|
var NUMERIC_AGGREGATES = [
|
|
12094
12114
|
"mean",
|
|
@@ -12147,6 +12167,42 @@ var HelperSpecSchema = discriminatedUnion("kind", [
|
|
|
12147
12167
|
reset: _enum(RESET_PERIODS),
|
|
12148
12168
|
output: _enum(["energy", "meter"]),
|
|
12149
12169
|
source: HelperMemberSchema
|
|
12170
|
+
}),
|
|
12171
|
+
object({
|
|
12172
|
+
kind: literal("threshold"),
|
|
12173
|
+
source: HelperMemberSchema,
|
|
12174
|
+
high: number(),
|
|
12175
|
+
low: number(),
|
|
12176
|
+
onForMs: number().int().nonnegative(),
|
|
12177
|
+
offForMs: number().int().nonnegative()
|
|
12178
|
+
}),
|
|
12179
|
+
object({
|
|
12180
|
+
kind: literal("arithmetic"),
|
|
12181
|
+
op: _enum([
|
|
12182
|
+
"sum",
|
|
12183
|
+
"difference",
|
|
12184
|
+
"ratio"
|
|
12185
|
+
]),
|
|
12186
|
+
inputs: array(HelperMemberSchema).min(2).max(64)
|
|
12187
|
+
}),
|
|
12188
|
+
object({
|
|
12189
|
+
kind: literal("expression"),
|
|
12190
|
+
expr: string().min(1),
|
|
12191
|
+
inputs: array(object({
|
|
12192
|
+
name: string().min(1),
|
|
12193
|
+
member: HelperMemberSchema
|
|
12194
|
+
})).min(1).max(64),
|
|
12195
|
+
output: _enum(["number", "boolean"])
|
|
12196
|
+
}),
|
|
12197
|
+
object({
|
|
12198
|
+
kind: literal("derivative"),
|
|
12199
|
+
window: RollingWindowSchema,
|
|
12200
|
+
per: _enum([
|
|
12201
|
+
"second",
|
|
12202
|
+
"minute",
|
|
12203
|
+
"hour"
|
|
12204
|
+
]),
|
|
12205
|
+
source: HelperMemberSchema
|
|
12150
12206
|
})
|
|
12151
12207
|
]);
|
|
12152
12208
|
/** A composed device's stableId is this prefix plus the block id. */
|
|
@@ -12209,6 +12265,12 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
|
|
|
12209
12265
|
"all"
|
|
12210
12266
|
]),
|
|
12211
12267
|
reads: array(CompositionFieldReadSchema).min(1).max(64),
|
|
12268
|
+
/**
|
|
12269
|
+
* Set when the reads are an enum state, not a yes/no: the listed states
|
|
12270
|
+
* count as active (a cover is `open`). A state outside the list is inactive;
|
|
12271
|
+
* a read that is not a state at all is left out. Only `any` / `all` use it.
|
|
12272
|
+
*/
|
|
12273
|
+
activeWhen: array(string().min(1)).min(1).optional(),
|
|
12212
12274
|
/** `value` is the reading; the others are the member counts. */
|
|
12213
12275
|
publish: _enum([
|
|
12214
12276
|
"value",
|
|
@@ -17557,7 +17619,22 @@ var BrokerProviderInfoSchema = object({
|
|
|
17557
17619
|
*/
|
|
17558
17620
|
interactiveConnectPath: string().min(1).optional(),
|
|
17559
17621
|
/** Relative hub path to disconnect the linked account (same popup pattern). */
|
|
17560
|
-
interactiveDisconnectPath: string().min(1).optional()
|
|
17622
|
+
interactiveDisconnectPath: string().min(1).optional(),
|
|
17623
|
+
/**
|
|
17624
|
+
* The kind signs in through a server-held interactive session instead of
|
|
17625
|
+
* (or before) typed credentials. `basePath` is a hub-relative route set
|
|
17626
|
+
* served by the owning addon (`/addon/<id>/...`) speaking the sign-in
|
|
17627
|
+
* contract: `POST {basePath}/start` (body: the form's settings) answers
|
|
17628
|
+
* `{ sessionId, loginUrl }`; `GET {basePath}/status?sessionId=` answers
|
|
17629
|
+
* `{ phase: 'starting' | 'awaiting-login' | 'captured' | 'error' |
|
|
17630
|
+
* 'cancelled', loginUrl, error }`; `POST {basePath}/commit`
|
|
17631
|
+
* (`{ sessionId, name, brokerId? }`) stores the credentials on a new or
|
|
17632
|
+
* existing broker and answers `{ brokerId }`; `POST {basePath}/cancel`
|
|
17633
|
+
* (`{ sessionId }`) drops the session. The dialog that edits a broker
|
|
17634
|
+
* offers it as the default path; the fields the session fills are
|
|
17635
|
+
* marked `filledBySignIn` in the kind's settings schema.
|
|
17636
|
+
*/
|
|
17637
|
+
signIn: object({ basePath: string().min(1) }).optional()
|
|
17561
17638
|
}))
|
|
17562
17639
|
});
|
|
17563
17640
|
var ListInputSchema = object({
|
|
@@ -18791,13 +18868,17 @@ Object.freeze({
|
|
|
18791
18868
|
latchedAt: {
|
|
18792
18869
|
kind: "fixed",
|
|
18793
18870
|
result: ["number", "null"]
|
|
18871
|
+
},
|
|
18872
|
+
schmitt: {
|
|
18873
|
+
kind: "fixed",
|
|
18874
|
+
result: ["boolean", "null"]
|
|
18794
18875
|
}
|
|
18795
18876
|
});
|
|
18796
18877
|
/**
|
|
18797
18878
|
* One catalog row per base reading a group helper can build (D944 §3).
|
|
18798
18879
|
* Data, not a form default written into the block.
|
|
18799
18880
|
*/
|
|
18800
|
-
var NOW$
|
|
18881
|
+
var NOW$2 = {
|
|
18801
18882
|
fieldPath: "lastFetchedAt",
|
|
18802
18883
|
expr: "now"
|
|
18803
18884
|
};
|
|
@@ -18811,6 +18892,8 @@ function numeric(input) {
|
|
|
18811
18892
|
family: "numeric",
|
|
18812
18893
|
deviceType: DeviceType.Sensor,
|
|
18813
18894
|
memberDeviceType: DeviceType.Sensor,
|
|
18895
|
+
memberDeviceTypes: [DeviceType.Sensor],
|
|
18896
|
+
activeWhen: void 0,
|
|
18814
18897
|
commandCaps: [],
|
|
18815
18898
|
baseUnit: baseUnitOf(input.quantity),
|
|
18816
18899
|
aggregates: NUMERIC_AGGREGATES,
|
|
@@ -18826,6 +18909,8 @@ function binary(input) {
|
|
|
18826
18909
|
family: "binary",
|
|
18827
18910
|
deviceType: DeviceType.Sensor,
|
|
18828
18911
|
memberDeviceType: DeviceType.Sensor,
|
|
18912
|
+
memberDeviceTypes: [DeviceType.Sensor],
|
|
18913
|
+
activeWhen: void 0,
|
|
18829
18914
|
commandCaps: [],
|
|
18830
18915
|
quantity: "none",
|
|
18831
18916
|
baseUnit: void 0,
|
|
@@ -18843,7 +18928,7 @@ var GROUP_TEMPLATES = [
|
|
|
18843
18928
|
quantity: "temperature",
|
|
18844
18929
|
defaultAggregate: "mean",
|
|
18845
18930
|
empty: "null",
|
|
18846
|
-
companions: [NOW$
|
|
18931
|
+
companions: [NOW$2]
|
|
18847
18932
|
}),
|
|
18848
18933
|
numeric({
|
|
18849
18934
|
id: "humidity",
|
|
@@ -18854,7 +18939,7 @@ var GROUP_TEMPLATES = [
|
|
|
18854
18939
|
quantity: "humidity",
|
|
18855
18940
|
defaultAggregate: "mean",
|
|
18856
18941
|
empty: "null",
|
|
18857
|
-
companions: [NOW$
|
|
18942
|
+
companions: [NOW$2]
|
|
18858
18943
|
}),
|
|
18859
18944
|
numeric({
|
|
18860
18945
|
id: "pressure",
|
|
@@ -18865,7 +18950,7 @@ var GROUP_TEMPLATES = [
|
|
|
18865
18950
|
quantity: "pressure",
|
|
18866
18951
|
defaultAggregate: "mean",
|
|
18867
18952
|
empty: "null",
|
|
18868
|
-
companions: [NOW$
|
|
18953
|
+
companions: [NOW$2]
|
|
18869
18954
|
}),
|
|
18870
18955
|
numeric({
|
|
18871
18956
|
id: "illuminance",
|
|
@@ -18876,7 +18961,7 @@ var GROUP_TEMPLATES = [
|
|
|
18876
18961
|
quantity: "illuminance",
|
|
18877
18962
|
defaultAggregate: "mean",
|
|
18878
18963
|
empty: "null",
|
|
18879
|
-
companions: [NOW$
|
|
18964
|
+
companions: [NOW$2]
|
|
18880
18965
|
}),
|
|
18881
18966
|
numeric({
|
|
18882
18967
|
id: "power",
|
|
@@ -18887,7 +18972,7 @@ var GROUP_TEMPLATES = [
|
|
|
18887
18972
|
quantity: "power",
|
|
18888
18973
|
defaultAggregate: "sum",
|
|
18889
18974
|
empty: "omit",
|
|
18890
|
-
companions: [NOW$
|
|
18975
|
+
companions: [NOW$2]
|
|
18891
18976
|
}),
|
|
18892
18977
|
numeric({
|
|
18893
18978
|
id: "energy",
|
|
@@ -18898,7 +18983,7 @@ var GROUP_TEMPLATES = [
|
|
|
18898
18983
|
quantity: "energy",
|
|
18899
18984
|
defaultAggregate: "sum",
|
|
18900
18985
|
empty: "omit",
|
|
18901
|
-
companions: [NOW$
|
|
18986
|
+
companions: [NOW$2]
|
|
18902
18987
|
}),
|
|
18903
18988
|
numeric({
|
|
18904
18989
|
id: "battery",
|
|
@@ -18933,7 +19018,7 @@ var GROUP_TEMPLATES = [
|
|
|
18933
19018
|
quantity: "device",
|
|
18934
19019
|
defaultAggregate: "mean",
|
|
18935
19020
|
empty: "null",
|
|
18936
|
-
companions: [NOW$
|
|
19021
|
+
companions: [NOW$2]
|
|
18937
19022
|
}),
|
|
18938
19023
|
binary({
|
|
18939
19024
|
id: "motion",
|
|
@@ -19027,6 +19112,11 @@ var GROUP_TEMPLATES = [
|
|
|
19027
19112
|
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.",
|
|
19028
19113
|
deviceType: DeviceType.Switch,
|
|
19029
19114
|
outputCap: "switch",
|
|
19115
|
+
outputField: "on",
|
|
19116
|
+
member: {
|
|
19117
|
+
cap: "switch",
|
|
19118
|
+
fieldPath: "on"
|
|
19119
|
+
},
|
|
19030
19120
|
commandCaps: ["switch"]
|
|
19031
19121
|
}),
|
|
19032
19122
|
actuator({
|
|
@@ -19034,29 +19124,130 @@ var GROUP_TEMPLATES = [
|
|
|
19034
19124
|
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.",
|
|
19035
19125
|
deviceType: DeviceType.Light,
|
|
19036
19126
|
outputCap: "switch",
|
|
19127
|
+
outputField: "on",
|
|
19128
|
+
member: {
|
|
19129
|
+
cap: "switch",
|
|
19130
|
+
fieldPath: "on"
|
|
19131
|
+
},
|
|
19037
19132
|
commandCaps: [
|
|
19038
19133
|
"switch",
|
|
19039
19134
|
"brightness",
|
|
19040
19135
|
"color"
|
|
19041
19136
|
]
|
|
19137
|
+
}),
|
|
19138
|
+
actuator({
|
|
19139
|
+
id: "fan",
|
|
19140
|
+
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.",
|
|
19141
|
+
deviceType: DeviceType.Fan,
|
|
19142
|
+
outputCap: "switch",
|
|
19143
|
+
outputField: "on",
|
|
19144
|
+
member: {
|
|
19145
|
+
cap: "switch",
|
|
19146
|
+
fieldPath: "on"
|
|
19147
|
+
},
|
|
19148
|
+
commandCaps: ["switch", "fan-control"]
|
|
19149
|
+
}),
|
|
19150
|
+
actuator({
|
|
19151
|
+
id: "cover",
|
|
19152
|
+
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.",
|
|
19153
|
+
deviceType: DeviceType.Cover,
|
|
19154
|
+
outputCap: "group-active",
|
|
19155
|
+
outputField: "active",
|
|
19156
|
+
member: {
|
|
19157
|
+
cap: "cover",
|
|
19158
|
+
fieldPath: "state"
|
|
19159
|
+
},
|
|
19160
|
+
activeWhen: [
|
|
19161
|
+
"open",
|
|
19162
|
+
"opening",
|
|
19163
|
+
"stopped"
|
|
19164
|
+
],
|
|
19165
|
+
commandCaps: ["cover"]
|
|
19166
|
+
}),
|
|
19167
|
+
actuator({
|
|
19168
|
+
id: "valve",
|
|
19169
|
+
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.",
|
|
19170
|
+
deviceType: DeviceType.Valve,
|
|
19171
|
+
outputCap: "group-active",
|
|
19172
|
+
outputField: "active",
|
|
19173
|
+
member: {
|
|
19174
|
+
cap: "valve",
|
|
19175
|
+
fieldPath: "state"
|
|
19176
|
+
},
|
|
19177
|
+
activeWhen: [
|
|
19178
|
+
"open",
|
|
19179
|
+
"opening",
|
|
19180
|
+
"stopped"
|
|
19181
|
+
],
|
|
19182
|
+
commandCaps: ["valve"]
|
|
19183
|
+
}),
|
|
19184
|
+
actuator({
|
|
19185
|
+
id: "lock",
|
|
19186
|
+
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.",
|
|
19187
|
+
deviceType: DeviceType.Lock,
|
|
19188
|
+
outputCap: "group-active",
|
|
19189
|
+
outputField: "active",
|
|
19190
|
+
member: {
|
|
19191
|
+
cap: "lock-control",
|
|
19192
|
+
fieldPath: "state"
|
|
19193
|
+
},
|
|
19194
|
+
activeWhen: ["locked"],
|
|
19195
|
+
commandCaps: ["lock-control"]
|
|
19196
|
+
}),
|
|
19197
|
+
actuator({
|
|
19198
|
+
id: "media-player",
|
|
19199
|
+
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.",
|
|
19200
|
+
deviceType: DeviceType.MediaPlayer,
|
|
19201
|
+
outputCap: "group-active",
|
|
19202
|
+
outputField: "active",
|
|
19203
|
+
member: {
|
|
19204
|
+
cap: "media-player",
|
|
19205
|
+
fieldPath: "state"
|
|
19206
|
+
},
|
|
19207
|
+
activeWhen: ["playing", "buffering"],
|
|
19208
|
+
commandCaps: ["media-player"]
|
|
19209
|
+
}),
|
|
19210
|
+
actuator({
|
|
19211
|
+
id: "climate",
|
|
19212
|
+
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.",
|
|
19213
|
+
deviceType: DeviceType.Thermostat,
|
|
19214
|
+
memberDeviceTypes: [DeviceType.Thermostat, DeviceType.Climate],
|
|
19215
|
+
outputCap: "group-active",
|
|
19216
|
+
outputField: "active",
|
|
19217
|
+
member: {
|
|
19218
|
+
cap: "climate-control",
|
|
19219
|
+
fieldPath: "mode"
|
|
19220
|
+
},
|
|
19221
|
+
activeWhen: [
|
|
19222
|
+
"heat",
|
|
19223
|
+
"cool",
|
|
19224
|
+
"auto",
|
|
19225
|
+
"heat_cool",
|
|
19226
|
+
"fan_only",
|
|
19227
|
+
"dry"
|
|
19228
|
+
],
|
|
19229
|
+
commandCaps: ["climate-control"]
|
|
19042
19230
|
})
|
|
19043
19231
|
];
|
|
19044
19232
|
function actuator(input) {
|
|
19045
19233
|
return {
|
|
19046
|
-
|
|
19234
|
+
id: input.id,
|
|
19235
|
+
summary: input.summary,
|
|
19236
|
+
deviceType: input.deviceType,
|
|
19237
|
+
outputCap: input.outputCap,
|
|
19238
|
+
outputField: input.outputField,
|
|
19239
|
+
commandCaps: input.commandCaps,
|
|
19047
19240
|
family: "actuator",
|
|
19048
19241
|
role: void 0,
|
|
19049
19242
|
memberDeviceType: input.deviceType,
|
|
19050
|
-
|
|
19243
|
+
memberDeviceTypes: input.memberDeviceTypes ?? [input.deviceType],
|
|
19244
|
+
activeWhen: input.activeWhen,
|
|
19051
19245
|
quantity: "none",
|
|
19052
19246
|
baseUnit: void 0,
|
|
19053
19247
|
aggregates: BINARY_AGGREGATES,
|
|
19054
19248
|
defaultAggregate: "any",
|
|
19055
19249
|
empty: "offline",
|
|
19056
|
-
accept: [
|
|
19057
|
-
cap: "switch",
|
|
19058
|
-
fieldPath: "on"
|
|
19059
|
-
}],
|
|
19250
|
+
accept: [input.member],
|
|
19060
19251
|
companions: [CHANGED]
|
|
19061
19252
|
};
|
|
19062
19253
|
}
|
|
@@ -46754,7 +46945,20 @@ var NcRuleInputSchema = object({
|
|
|
46754
46945
|
* save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
|
|
46755
46946
|
* path does not run Zod defaults.
|
|
46756
46947
|
*/
|
|
46757
|
-
groupingSec: number().int().min(5).max(60).optional()
|
|
46948
|
+
groupingSec: number().int().min(5).max(60).optional(),
|
|
46949
|
+
/**
|
|
46950
|
+
* ASK ME TO CONFIRM DETECTIONS (#243): a DETECTION notification of this rule
|
|
46951
|
+
* carries "Correct" / "Wrong" buttons (and, where the channel has room, a
|
|
46952
|
+
* "Wrong, it is a <class>" choice). A tap marks the track for retraining, the
|
|
46953
|
+
* same mark the Library writes, and records whose notification it was and
|
|
46954
|
+
* when. A channel with no buttons gets the same two choices as links.
|
|
46955
|
+
*
|
|
46956
|
+
* `.optional()`, never `.default()` (a Zod default does not run on the addon
|
|
46957
|
+
* cap path): absent and `false` both mean off, which is what every rule
|
|
46958
|
+
* authored before this field meant. An editor turns it off by writing
|
|
46959
|
+
* `false`, so it needs no `clear` key.
|
|
46960
|
+
*/
|
|
46961
|
+
askVerdict: boolean().optional()
|
|
46758
46962
|
});
|
|
46759
46963
|
/**
|
|
46760
46964
|
* Partial patch for `updateRule` — any subset of the input fields, plus the
|
|
@@ -57211,7 +57415,7 @@ var BatteryStatusSchema = object({
|
|
|
57211
57415
|
*/
|
|
57212
57416
|
binary: boolean().optional().meta({ label: "Binary indicator" })
|
|
57213
57417
|
});
|
|
57214
|
-
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat;
|
|
57418
|
+
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter;
|
|
57215
57419
|
method(object({
|
|
57216
57420
|
deviceId: number(),
|
|
57217
57421
|
/** Bound on the wait. Sensible range 3000–10000ms. */
|
|
@@ -58955,7 +59159,13 @@ results: array(object({
|
|
|
58955
59159
|
/** Ms epoch of the attempt. */
|
|
58956
59160
|
at: number()
|
|
58957
59161
|
})) });
|
|
58958
|
-
DeviceType.Switch, DeviceType.Light;
|
|
59162
|
+
DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
|
|
59163
|
+
object({
|
|
59164
|
+
active: boolean().meta({ label: "Active" }),
|
|
59165
|
+
/** Ms epoch when the slice was last updated. */
|
|
59166
|
+
lastChangedAt: number()
|
|
59167
|
+
});
|
|
59168
|
+
DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Climate, DeviceType.Thermostat;
|
|
58959
59169
|
object({
|
|
58960
59170
|
/** Members whose current value entered the aggregate. */
|
|
58961
59171
|
included: number().int().nonnegative().meta(readingMeta("count", {
|
|
@@ -58973,7 +59183,7 @@ object({
|
|
|
58973
59183
|
label: "Members"
|
|
58974
59184
|
}))
|
|
58975
59185
|
});
|
|
58976
|
-
DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
|
|
59186
|
+
DeviceType.Sensor, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
|
|
58977
59187
|
object({
|
|
58978
59188
|
/** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
|
|
58979
59189
|
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
@@ -59880,7 +60090,14 @@ DeviceType.Lock, method(object({
|
|
|
59880
60090
|
auth: "protected"
|
|
59881
60091
|
}), method(object({
|
|
59882
60092
|
deviceId: number().int().nonnegative(),
|
|
59883
|
-
code: string().min(1).optional()
|
|
60093
|
+
code: string().min(1).optional(),
|
|
60094
|
+
/**
|
|
60095
|
+
* Honoured by a helper lock GROUP only (D944): unlocking several doors
|
|
60096
|
+
* with one call is refused unless the caller says it was confirmed. A
|
|
60097
|
+
* single lock ignores it. The refusal lives in the callee, so no
|
|
60098
|
+
* automation or API caller reaches the doors by skipping a dialog.
|
|
60099
|
+
*/
|
|
60100
|
+
confirm: boolean().optional()
|
|
59884
60101
|
}), _void(), {
|
|
59885
60102
|
kind: "mutation",
|
|
59886
60103
|
auth: "protected"
|
|
@@ -61800,9 +62017,9 @@ object({
|
|
|
61800
62017
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
61801
62018
|
kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
|
|
61802
62019
|
/** Voltage in volts. */
|
|
61803
|
-
volts: number().optional().meta(readingMeta("voltage")),
|
|
62020
|
+
volts: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
61804
62021
|
/** Current in amperes. */
|
|
61805
|
-
amps: number().optional().meta(readingMeta("current")),
|
|
62022
|
+
amps: number().optional().meta(readingMeta("current", { label: "Current" })),
|
|
61806
62023
|
/** Apparent power in volt-amperes. */
|
|
61807
62024
|
va: number().optional().meta(readingMeta("apparent-power")),
|
|
61808
62025
|
/** Power factor (0..1) if reported. */
|
|
@@ -61810,7 +62027,23 @@ object({
|
|
|
61810
62027
|
/** Ms epoch when the slice was last updated. */
|
|
61811
62028
|
lastFetchedAt: number()
|
|
61812
62029
|
});
|
|
61813
|
-
|
|
62030
|
+
[
|
|
62031
|
+
DeviceType.Sensor,
|
|
62032
|
+
DeviceType.Switch,
|
|
62033
|
+
DeviceType.Light,
|
|
62034
|
+
DeviceType.Fan,
|
|
62035
|
+
DeviceType.Climate,
|
|
62036
|
+
DeviceType.Thermostat,
|
|
62037
|
+
DeviceType.Humidifier,
|
|
62038
|
+
DeviceType.WaterHeater,
|
|
62039
|
+
DeviceType.MediaPlayer,
|
|
62040
|
+
DeviceType.Washer,
|
|
62041
|
+
DeviceType.Dryer,
|
|
62042
|
+
DeviceType.Dishwasher,
|
|
62043
|
+
DeviceType.Vacuum,
|
|
62044
|
+
DeviceType.LawnMower,
|
|
62045
|
+
DeviceType.PetFeeder
|
|
62046
|
+
].filter((type) => type !== DeviceType.Sensor);
|
|
61814
62047
|
/**
|
|
61815
62048
|
* Presence cap. Models HA `person.*` and `device_tracker.*` entities
|
|
61816
62049
|
* on `DeviceType.Presence`. Read-only — no setters: presence is
|
|
@@ -64296,7 +64529,7 @@ object({
|
|
|
64296
64529
|
/** Ms epoch of the last state change. Useful for UI "X minutes ago". */
|
|
64297
64530
|
lastChangedAt: number()
|
|
64298
64531
|
});
|
|
64299
|
-
DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
|
|
64532
|
+
DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, method(object({
|
|
64300
64533
|
deviceId: number(),
|
|
64301
64534
|
on: boolean()
|
|
64302
64535
|
}), _void(), {
|
|
@@ -65988,8 +66221,9 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
|
|
|
65988
66221
|
kind: "mutation",
|
|
65989
66222
|
auth: "admin"
|
|
65990
66223
|
});
|
|
66224
|
+
DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
|
|
65991
66225
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
65992
|
-
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;
|
|
66226
|
+
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;
|
|
65993
66227
|
String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
|
|
65994
66228
|
DeviceRole.BinarySensor, DeviceRole.MotionSensor;
|
|
65995
66229
|
new Set(CAP_NAMES);
|
|
@@ -69363,6 +69597,13 @@ Object.freeze({
|
|
|
69363
69597
|
access: "view",
|
|
69364
69598
|
role: "viewer"
|
|
69365
69599
|
},
|
|
69600
|
+
"groupActive.getStatus": {
|
|
69601
|
+
capName: "group-active",
|
|
69602
|
+
capScope: "device",
|
|
69603
|
+
addonId: null,
|
|
69604
|
+
access: "view",
|
|
69605
|
+
role: "viewer"
|
|
69606
|
+
},
|
|
69366
69607
|
"groupCommands.getStatus": {
|
|
69367
69608
|
capName: "group-commands",
|
|
69368
69609
|
capScope: "device",
|
|
@@ -79238,6 +79479,10 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
79238
79479
|
icon: "flame"
|
|
79239
79480
|
}]
|
|
79240
79481
|
},
|
|
79482
|
+
"group-active": {
|
|
79483
|
+
scope: "device",
|
|
79484
|
+
noun: t("Group state", "Stato del gruppo")
|
|
79485
|
+
},
|
|
79241
79486
|
"group-commands": {
|
|
79242
79487
|
scope: "device",
|
|
79243
79488
|
noun: t("Group command", "Comando di gruppo")
|
|
@@ -80784,6 +81029,11 @@ Object.freeze({
|
|
|
80784
81029
|
form: "single",
|
|
80785
81030
|
optional: false
|
|
80786
81031
|
}],
|
|
81032
|
+
"groupActive.getStatus": [{
|
|
81033
|
+
name: "deviceId",
|
|
81034
|
+
form: "single",
|
|
81035
|
+
optional: false
|
|
81036
|
+
}],
|
|
80787
81037
|
"groupCommands.getStatus": [{
|
|
80788
81038
|
name: "deviceId",
|
|
80789
81039
|
form: "single",
|