@camstack/addon-training 0.1.91 → 0.1.93
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-kbJlg0c5.mjs → MotionZonesSettings-BDIz0ADl.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-B3gzWS6Y.mjs → PrivacyMaskSettings-Cz_1itEY.mjs} +2 -2
- package/dist/{SceneMonitorEditor-CjxaItjN.mjs → SceneMonitorEditor-DxdQN6e5.mjs} +119 -120
- package/dist/_stub.js +5328 -5342
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cer78kD4.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-BZNWvnmy.mjs} +3 -3
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B6wwfPOo.mjs +26 -0
- package/dist/addon-training.css +1 -1
- package/dist/{dist-B3Dz3xDZ.mjs → dist-Bna6QSX9.mjs} +280 -30
- package/dist/{dist-uLc6FQWF.js → dist-Cv8pFcIo.js} +280 -30
- package/dist/{hostInit-C-l48gwp.mjs → hostInit-BsH6KoQn.mjs} +2 -2
- package/dist/index.js +1 -1
- package/dist/orchestrator/training.addon.js +1 -1
- package/dist/orchestrator/training.addon.mjs +1 -1
- package/dist/{player-overlays-DrA4TUe3.mjs → player-overlays-ClwLHxNP.mjs} +1 -1
- package/dist/providers/modal/training-modal.addon.js +1 -1
- package/dist/providers/modal/training-modal.addon.mjs +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-C46lpRSX.mjs → responsive-Cx4quvGq.mjs} +1 -1
- package/dist/{scene-monitor-copy-Cqfs4Vng.mjs → scene-monitor-copy-DIJUg8Ro.mjs} +63 -46
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qVIpiQZD.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-C-gbqU_M.mjs} +1 -1
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DM1LS5rC.mjs +0 -26
|
@@ -5575,7 +5575,7 @@ var ZodIssueCode = {
|
|
|
5575
5575
|
var ZodFirstPartyTypeKind;
|
|
5576
5576
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5577
5577
|
//#endregion
|
|
5578
|
-
//#region ../types/dist/sleep
|
|
5578
|
+
//#region ../types/dist/sleep--jXS9hWo.mjs
|
|
5579
5579
|
/**
|
|
5580
5580
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5581
5581
|
* window to float samples (D455).
|
|
@@ -8945,6 +8945,7 @@ var CAP_NAMES = Object.freeze([
|
|
|
8945
8945
|
"filesystem-browse",
|
|
8946
8946
|
"flood",
|
|
8947
8947
|
"gas",
|
|
8948
|
+
"group-active",
|
|
8948
8949
|
"group-commands",
|
|
8949
8950
|
"group-status",
|
|
8950
8951
|
"heating-valve",
|
|
@@ -9766,6 +9767,10 @@ Object.freeze({
|
|
|
9766
9767
|
"path": "detected",
|
|
9767
9768
|
"valueType": "boolean"
|
|
9768
9769
|
}],
|
|
9770
|
+
"group-active": [{
|
|
9771
|
+
"path": "active",
|
|
9772
|
+
"valueType": "boolean"
|
|
9773
|
+
}],
|
|
9769
9774
|
"group-status": [
|
|
9770
9775
|
{
|
|
9771
9776
|
"path": "included",
|
|
@@ -11121,7 +11126,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
11121
11126
|
return DeviceRole;
|
|
11122
11127
|
}({});
|
|
11123
11128
|
//#endregion
|
|
11124
|
-
//#region ../types/dist/composition-
|
|
11129
|
+
//#region ../types/dist/composition-Bb8iwHEJ.mjs
|
|
11125
11130
|
/**
|
|
11126
11131
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
11127
11132
|
*
|
|
@@ -11436,6 +11441,13 @@ var table = {
|
|
|
11436
11441
|
apply: () => {
|
|
11437
11442
|
throw new ExpressionEvalError("latchedAt: stateful evaluation context is required");
|
|
11438
11443
|
}
|
|
11444
|
+
},
|
|
11445
|
+
schmitt: {
|
|
11446
|
+
minArgs: 3,
|
|
11447
|
+
maxArgs: 5,
|
|
11448
|
+
apply: () => {
|
|
11449
|
+
throw new ExpressionEvalError("schmitt: stateful evaluation context is required");
|
|
11450
|
+
}
|
|
11439
11451
|
}
|
|
11440
11452
|
};
|
|
11441
11453
|
Object.freeze(Object.assign(Object.create(null), table));
|
|
@@ -11946,7 +11958,7 @@ var RESET_PERIODS = [
|
|
|
11946
11958
|
5 * MINUTE_MS;
|
|
11947
11959
|
24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
|
|
11948
11960
|
7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
|
|
11949
|
-
var
|
|
11961
|
+
var rollingWindowObject = object({
|
|
11950
11962
|
kind: literal("rolling"),
|
|
11951
11963
|
span: _enum(ROLLING_SPANS),
|
|
11952
11964
|
customMinutes: number().int().min(5).optional()
|
|
@@ -11963,7 +11975,9 @@ var StatisticWindowSchema = discriminatedUnion("kind", [object({
|
|
|
11963
11975
|
path: ["customMinutes"],
|
|
11964
11976
|
input: payload.value
|
|
11965
11977
|
});
|
|
11966
|
-
})
|
|
11978
|
+
});
|
|
11979
|
+
var RollingWindowSchema = rollingWindowObject;
|
|
11980
|
+
var StatisticWindowSchema = discriminatedUnion("kind", [rollingWindowObject, object({
|
|
11967
11981
|
kind: literal("calendar"),
|
|
11968
11982
|
period: _enum(CALENDAR_PERIODS)
|
|
11969
11983
|
})]);
|
|
@@ -11993,7 +12007,13 @@ var GROUP_TEMPLATE_IDS = [
|
|
|
11993
12007
|
"occupancy",
|
|
11994
12008
|
"binary",
|
|
11995
12009
|
"switch",
|
|
11996
|
-
"light"
|
|
12010
|
+
"light",
|
|
12011
|
+
"fan",
|
|
12012
|
+
"cover",
|
|
12013
|
+
"valve",
|
|
12014
|
+
"lock",
|
|
12015
|
+
"media-player",
|
|
12016
|
+
"climate"
|
|
11997
12017
|
];
|
|
11998
12018
|
var NUMERIC_AGGREGATES = [
|
|
11999
12019
|
"mean",
|
|
@@ -12052,6 +12072,42 @@ var HelperSpecSchema = discriminatedUnion("kind", [
|
|
|
12052
12072
|
reset: _enum(RESET_PERIODS),
|
|
12053
12073
|
output: _enum(["energy", "meter"]),
|
|
12054
12074
|
source: HelperMemberSchema
|
|
12075
|
+
}),
|
|
12076
|
+
object({
|
|
12077
|
+
kind: literal("threshold"),
|
|
12078
|
+
source: HelperMemberSchema,
|
|
12079
|
+
high: number(),
|
|
12080
|
+
low: number(),
|
|
12081
|
+
onForMs: number().int().nonnegative(),
|
|
12082
|
+
offForMs: number().int().nonnegative()
|
|
12083
|
+
}),
|
|
12084
|
+
object({
|
|
12085
|
+
kind: literal("arithmetic"),
|
|
12086
|
+
op: _enum([
|
|
12087
|
+
"sum",
|
|
12088
|
+
"difference",
|
|
12089
|
+
"ratio"
|
|
12090
|
+
]),
|
|
12091
|
+
inputs: array(HelperMemberSchema).min(2).max(64)
|
|
12092
|
+
}),
|
|
12093
|
+
object({
|
|
12094
|
+
kind: literal("expression"),
|
|
12095
|
+
expr: string().min(1),
|
|
12096
|
+
inputs: array(object({
|
|
12097
|
+
name: string().min(1),
|
|
12098
|
+
member: HelperMemberSchema
|
|
12099
|
+
})).min(1).max(64),
|
|
12100
|
+
output: _enum(["number", "boolean"])
|
|
12101
|
+
}),
|
|
12102
|
+
object({
|
|
12103
|
+
kind: literal("derivative"),
|
|
12104
|
+
window: RollingWindowSchema,
|
|
12105
|
+
per: _enum([
|
|
12106
|
+
"second",
|
|
12107
|
+
"minute",
|
|
12108
|
+
"hour"
|
|
12109
|
+
]),
|
|
12110
|
+
source: HelperMemberSchema
|
|
12055
12111
|
})
|
|
12056
12112
|
]);
|
|
12057
12113
|
/** A composed device's stableId is this prefix plus the block id. */
|
|
@@ -12114,6 +12170,12 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
|
|
|
12114
12170
|
"all"
|
|
12115
12171
|
]),
|
|
12116
12172
|
reads: array(CompositionFieldReadSchema).min(1).max(64),
|
|
12173
|
+
/**
|
|
12174
|
+
* Set when the reads are an enum state, not a yes/no: the listed states
|
|
12175
|
+
* count as active (a cover is `open`). A state outside the list is inactive;
|
|
12176
|
+
* a read that is not a state at all is left out. Only `any` / `all` use it.
|
|
12177
|
+
*/
|
|
12178
|
+
activeWhen: array(string().min(1)).min(1).optional(),
|
|
12117
12179
|
/** `value` is the reading; the others are the member counts. */
|
|
12118
12180
|
publish: _enum([
|
|
12119
12181
|
"value",
|
|
@@ -17341,7 +17403,22 @@ var BrokerProviderInfoSchema = object({
|
|
|
17341
17403
|
*/
|
|
17342
17404
|
interactiveConnectPath: string().min(1).optional(),
|
|
17343
17405
|
/** Relative hub path to disconnect the linked account (same popup pattern). */
|
|
17344
|
-
interactiveDisconnectPath: string().min(1).optional()
|
|
17406
|
+
interactiveDisconnectPath: string().min(1).optional(),
|
|
17407
|
+
/**
|
|
17408
|
+
* The kind signs in through a server-held interactive session instead of
|
|
17409
|
+
* (or before) typed credentials. `basePath` is a hub-relative route set
|
|
17410
|
+
* served by the owning addon (`/addon/<id>/...`) speaking the sign-in
|
|
17411
|
+
* contract: `POST {basePath}/start` (body: the form's settings) answers
|
|
17412
|
+
* `{ sessionId, loginUrl }`; `GET {basePath}/status?sessionId=` answers
|
|
17413
|
+
* `{ phase: 'starting' | 'awaiting-login' | 'captured' | 'error' |
|
|
17414
|
+
* 'cancelled', loginUrl, error }`; `POST {basePath}/commit`
|
|
17415
|
+
* (`{ sessionId, name, brokerId? }`) stores the credentials on a new or
|
|
17416
|
+
* existing broker and answers `{ brokerId }`; `POST {basePath}/cancel`
|
|
17417
|
+
* (`{ sessionId }`) drops the session. The dialog that edits a broker
|
|
17418
|
+
* offers it as the default path; the fields the session fills are
|
|
17419
|
+
* marked `filledBySignIn` in the kind's settings schema.
|
|
17420
|
+
*/
|
|
17421
|
+
signIn: object({ basePath: string().min(1) }).optional()
|
|
17345
17422
|
}))
|
|
17346
17423
|
});
|
|
17347
17424
|
var ListInputSchema = object({
|
|
@@ -18575,13 +18652,17 @@ Object.freeze({
|
|
|
18575
18652
|
latchedAt: {
|
|
18576
18653
|
kind: "fixed",
|
|
18577
18654
|
result: ["number", "null"]
|
|
18655
|
+
},
|
|
18656
|
+
schmitt: {
|
|
18657
|
+
kind: "fixed",
|
|
18658
|
+
result: ["boolean", "null"]
|
|
18578
18659
|
}
|
|
18579
18660
|
});
|
|
18580
18661
|
/**
|
|
18581
18662
|
* One catalog row per base reading a group helper can build (D944 §3).
|
|
18582
18663
|
* Data, not a form default written into the block.
|
|
18583
18664
|
*/
|
|
18584
|
-
var NOW$
|
|
18665
|
+
var NOW$2 = {
|
|
18585
18666
|
fieldPath: "lastFetchedAt",
|
|
18586
18667
|
expr: "now"
|
|
18587
18668
|
};
|
|
@@ -18595,6 +18676,8 @@ function numeric(input) {
|
|
|
18595
18676
|
family: "numeric",
|
|
18596
18677
|
deviceType: DeviceType.Sensor,
|
|
18597
18678
|
memberDeviceType: DeviceType.Sensor,
|
|
18679
|
+
memberDeviceTypes: [DeviceType.Sensor],
|
|
18680
|
+
activeWhen: void 0,
|
|
18598
18681
|
commandCaps: [],
|
|
18599
18682
|
baseUnit: baseUnitOf(input.quantity),
|
|
18600
18683
|
aggregates: NUMERIC_AGGREGATES,
|
|
@@ -18610,6 +18693,8 @@ function binary(input) {
|
|
|
18610
18693
|
family: "binary",
|
|
18611
18694
|
deviceType: DeviceType.Sensor,
|
|
18612
18695
|
memberDeviceType: DeviceType.Sensor,
|
|
18696
|
+
memberDeviceTypes: [DeviceType.Sensor],
|
|
18697
|
+
activeWhen: void 0,
|
|
18613
18698
|
commandCaps: [],
|
|
18614
18699
|
quantity: "none",
|
|
18615
18700
|
baseUnit: void 0,
|
|
@@ -18627,7 +18712,7 @@ var GROUP_TEMPLATES = [
|
|
|
18627
18712
|
quantity: "temperature",
|
|
18628
18713
|
defaultAggregate: "mean",
|
|
18629
18714
|
empty: "null",
|
|
18630
|
-
companions: [NOW$
|
|
18715
|
+
companions: [NOW$2]
|
|
18631
18716
|
}),
|
|
18632
18717
|
numeric({
|
|
18633
18718
|
id: "humidity",
|
|
@@ -18638,7 +18723,7 @@ var GROUP_TEMPLATES = [
|
|
|
18638
18723
|
quantity: "humidity",
|
|
18639
18724
|
defaultAggregate: "mean",
|
|
18640
18725
|
empty: "null",
|
|
18641
|
-
companions: [NOW$
|
|
18726
|
+
companions: [NOW$2]
|
|
18642
18727
|
}),
|
|
18643
18728
|
numeric({
|
|
18644
18729
|
id: "pressure",
|
|
@@ -18649,7 +18734,7 @@ var GROUP_TEMPLATES = [
|
|
|
18649
18734
|
quantity: "pressure",
|
|
18650
18735
|
defaultAggregate: "mean",
|
|
18651
18736
|
empty: "null",
|
|
18652
|
-
companions: [NOW$
|
|
18737
|
+
companions: [NOW$2]
|
|
18653
18738
|
}),
|
|
18654
18739
|
numeric({
|
|
18655
18740
|
id: "illuminance",
|
|
@@ -18660,7 +18745,7 @@ var GROUP_TEMPLATES = [
|
|
|
18660
18745
|
quantity: "illuminance",
|
|
18661
18746
|
defaultAggregate: "mean",
|
|
18662
18747
|
empty: "null",
|
|
18663
|
-
companions: [NOW$
|
|
18748
|
+
companions: [NOW$2]
|
|
18664
18749
|
}),
|
|
18665
18750
|
numeric({
|
|
18666
18751
|
id: "power",
|
|
@@ -18671,7 +18756,7 @@ var GROUP_TEMPLATES = [
|
|
|
18671
18756
|
quantity: "power",
|
|
18672
18757
|
defaultAggregate: "sum",
|
|
18673
18758
|
empty: "omit",
|
|
18674
|
-
companions: [NOW$
|
|
18759
|
+
companions: [NOW$2]
|
|
18675
18760
|
}),
|
|
18676
18761
|
numeric({
|
|
18677
18762
|
id: "energy",
|
|
@@ -18682,7 +18767,7 @@ var GROUP_TEMPLATES = [
|
|
|
18682
18767
|
quantity: "energy",
|
|
18683
18768
|
defaultAggregate: "sum",
|
|
18684
18769
|
empty: "omit",
|
|
18685
|
-
companions: [NOW$
|
|
18770
|
+
companions: [NOW$2]
|
|
18686
18771
|
}),
|
|
18687
18772
|
numeric({
|
|
18688
18773
|
id: "battery",
|
|
@@ -18717,7 +18802,7 @@ var GROUP_TEMPLATES = [
|
|
|
18717
18802
|
quantity: "device",
|
|
18718
18803
|
defaultAggregate: "mean",
|
|
18719
18804
|
empty: "null",
|
|
18720
|
-
companions: [NOW$
|
|
18805
|
+
companions: [NOW$2]
|
|
18721
18806
|
}),
|
|
18722
18807
|
binary({
|
|
18723
18808
|
id: "motion",
|
|
@@ -18811,6 +18896,11 @@ var GROUP_TEMPLATES = [
|
|
|
18811
18896
|
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.",
|
|
18812
18897
|
deviceType: DeviceType.Switch,
|
|
18813
18898
|
outputCap: "switch",
|
|
18899
|
+
outputField: "on",
|
|
18900
|
+
member: {
|
|
18901
|
+
cap: "switch",
|
|
18902
|
+
fieldPath: "on"
|
|
18903
|
+
},
|
|
18814
18904
|
commandCaps: ["switch"]
|
|
18815
18905
|
}),
|
|
18816
18906
|
actuator({
|
|
@@ -18818,29 +18908,130 @@ var GROUP_TEMPLATES = [
|
|
|
18818
18908
|
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.",
|
|
18819
18909
|
deviceType: DeviceType.Light,
|
|
18820
18910
|
outputCap: "switch",
|
|
18911
|
+
outputField: "on",
|
|
18912
|
+
member: {
|
|
18913
|
+
cap: "switch",
|
|
18914
|
+
fieldPath: "on"
|
|
18915
|
+
},
|
|
18821
18916
|
commandCaps: [
|
|
18822
18917
|
"switch",
|
|
18823
18918
|
"brightness",
|
|
18824
18919
|
"color"
|
|
18825
18920
|
]
|
|
18921
|
+
}),
|
|
18922
|
+
actuator({
|
|
18923
|
+
id: "fan",
|
|
18924
|
+
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.",
|
|
18925
|
+
deviceType: DeviceType.Fan,
|
|
18926
|
+
outputCap: "switch",
|
|
18927
|
+
outputField: "on",
|
|
18928
|
+
member: {
|
|
18929
|
+
cap: "switch",
|
|
18930
|
+
fieldPath: "on"
|
|
18931
|
+
},
|
|
18932
|
+
commandCaps: ["switch", "fan-control"]
|
|
18933
|
+
}),
|
|
18934
|
+
actuator({
|
|
18935
|
+
id: "cover",
|
|
18936
|
+
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.",
|
|
18937
|
+
deviceType: DeviceType.Cover,
|
|
18938
|
+
outputCap: "group-active",
|
|
18939
|
+
outputField: "active",
|
|
18940
|
+
member: {
|
|
18941
|
+
cap: "cover",
|
|
18942
|
+
fieldPath: "state"
|
|
18943
|
+
},
|
|
18944
|
+
activeWhen: [
|
|
18945
|
+
"open",
|
|
18946
|
+
"opening",
|
|
18947
|
+
"stopped"
|
|
18948
|
+
],
|
|
18949
|
+
commandCaps: ["cover"]
|
|
18950
|
+
}),
|
|
18951
|
+
actuator({
|
|
18952
|
+
id: "valve",
|
|
18953
|
+
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.",
|
|
18954
|
+
deviceType: DeviceType.Valve,
|
|
18955
|
+
outputCap: "group-active",
|
|
18956
|
+
outputField: "active",
|
|
18957
|
+
member: {
|
|
18958
|
+
cap: "valve",
|
|
18959
|
+
fieldPath: "state"
|
|
18960
|
+
},
|
|
18961
|
+
activeWhen: [
|
|
18962
|
+
"open",
|
|
18963
|
+
"opening",
|
|
18964
|
+
"stopped"
|
|
18965
|
+
],
|
|
18966
|
+
commandCaps: ["valve"]
|
|
18967
|
+
}),
|
|
18968
|
+
actuator({
|
|
18969
|
+
id: "lock",
|
|
18970
|
+
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.",
|
|
18971
|
+
deviceType: DeviceType.Lock,
|
|
18972
|
+
outputCap: "group-active",
|
|
18973
|
+
outputField: "active",
|
|
18974
|
+
member: {
|
|
18975
|
+
cap: "lock-control",
|
|
18976
|
+
fieldPath: "state"
|
|
18977
|
+
},
|
|
18978
|
+
activeWhen: ["locked"],
|
|
18979
|
+
commandCaps: ["lock-control"]
|
|
18980
|
+
}),
|
|
18981
|
+
actuator({
|
|
18982
|
+
id: "media-player",
|
|
18983
|
+
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.",
|
|
18984
|
+
deviceType: DeviceType.MediaPlayer,
|
|
18985
|
+
outputCap: "group-active",
|
|
18986
|
+
outputField: "active",
|
|
18987
|
+
member: {
|
|
18988
|
+
cap: "media-player",
|
|
18989
|
+
fieldPath: "state"
|
|
18990
|
+
},
|
|
18991
|
+
activeWhen: ["playing", "buffering"],
|
|
18992
|
+
commandCaps: ["media-player"]
|
|
18993
|
+
}),
|
|
18994
|
+
actuator({
|
|
18995
|
+
id: "climate",
|
|
18996
|
+
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.",
|
|
18997
|
+
deviceType: DeviceType.Thermostat,
|
|
18998
|
+
memberDeviceTypes: [DeviceType.Thermostat, DeviceType.Climate],
|
|
18999
|
+
outputCap: "group-active",
|
|
19000
|
+
outputField: "active",
|
|
19001
|
+
member: {
|
|
19002
|
+
cap: "climate-control",
|
|
19003
|
+
fieldPath: "mode"
|
|
19004
|
+
},
|
|
19005
|
+
activeWhen: [
|
|
19006
|
+
"heat",
|
|
19007
|
+
"cool",
|
|
19008
|
+
"auto",
|
|
19009
|
+
"heat_cool",
|
|
19010
|
+
"fan_only",
|
|
19011
|
+
"dry"
|
|
19012
|
+
],
|
|
19013
|
+
commandCaps: ["climate-control"]
|
|
18826
19014
|
})
|
|
18827
19015
|
];
|
|
18828
19016
|
function actuator(input) {
|
|
18829
19017
|
return {
|
|
18830
|
-
|
|
19018
|
+
id: input.id,
|
|
19019
|
+
summary: input.summary,
|
|
19020
|
+
deviceType: input.deviceType,
|
|
19021
|
+
outputCap: input.outputCap,
|
|
19022
|
+
outputField: input.outputField,
|
|
19023
|
+
commandCaps: input.commandCaps,
|
|
18831
19024
|
family: "actuator",
|
|
18832
19025
|
role: void 0,
|
|
18833
19026
|
memberDeviceType: input.deviceType,
|
|
18834
|
-
|
|
19027
|
+
memberDeviceTypes: input.memberDeviceTypes ?? [input.deviceType],
|
|
19028
|
+
activeWhen: input.activeWhen,
|
|
18835
19029
|
quantity: "none",
|
|
18836
19030
|
baseUnit: void 0,
|
|
18837
19031
|
aggregates: BINARY_AGGREGATES,
|
|
18838
19032
|
defaultAggregate: "any",
|
|
18839
19033
|
empty: "offline",
|
|
18840
|
-
accept: [
|
|
18841
|
-
cap: "switch",
|
|
18842
|
-
fieldPath: "on"
|
|
18843
|
-
}],
|
|
19034
|
+
accept: [input.member],
|
|
18844
19035
|
companions: [CHANGED]
|
|
18845
19036
|
};
|
|
18846
19037
|
}
|
|
@@ -46504,7 +46695,20 @@ var NcRuleInputSchema = object({
|
|
|
46504
46695
|
* save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
|
|
46505
46696
|
* path does not run Zod defaults.
|
|
46506
46697
|
*/
|
|
46507
|
-
groupingSec: number().int().min(5).max(60).optional()
|
|
46698
|
+
groupingSec: number().int().min(5).max(60).optional(),
|
|
46699
|
+
/**
|
|
46700
|
+
* ASK ME TO CONFIRM DETECTIONS (#243): a DETECTION notification of this rule
|
|
46701
|
+
* carries "Correct" / "Wrong" buttons (and, where the channel has room, a
|
|
46702
|
+
* "Wrong, it is a <class>" choice). A tap marks the track for retraining, the
|
|
46703
|
+
* same mark the Library writes, and records whose notification it was and
|
|
46704
|
+
* when. A channel with no buttons gets the same two choices as links.
|
|
46705
|
+
*
|
|
46706
|
+
* `.optional()`, never `.default()` (a Zod default does not run on the addon
|
|
46707
|
+
* cap path): absent and `false` both mean off, which is what every rule
|
|
46708
|
+
* authored before this field meant. An editor turns it off by writing
|
|
46709
|
+
* `false`, so it needs no `clear` key.
|
|
46710
|
+
*/
|
|
46711
|
+
askVerdict: boolean().optional()
|
|
46508
46712
|
});
|
|
46509
46713
|
/**
|
|
46510
46714
|
* Partial patch for `updateRule` — any subset of the input fields, plus the
|
|
@@ -56961,7 +57165,7 @@ var BatteryStatusSchema = object({
|
|
|
56961
57165
|
*/
|
|
56962
57166
|
binary: boolean().optional().meta({ label: "Binary indicator" })
|
|
56963
57167
|
});
|
|
56964
|
-
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat;
|
|
57168
|
+
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter;
|
|
56965
57169
|
method(object({
|
|
56966
57170
|
deviceId: number(),
|
|
56967
57171
|
/** Bound on the wait. Sensible range 3000–10000ms. */
|
|
@@ -58705,7 +58909,13 @@ results: array(object({
|
|
|
58705
58909
|
/** Ms epoch of the attempt. */
|
|
58706
58910
|
at: number()
|
|
58707
58911
|
})) });
|
|
58708
|
-
DeviceType.Switch, DeviceType.Light;
|
|
58912
|
+
DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
|
|
58913
|
+
object({
|
|
58914
|
+
active: boolean().meta({ label: "Active" }),
|
|
58915
|
+
/** Ms epoch when the slice was last updated. */
|
|
58916
|
+
lastChangedAt: number()
|
|
58917
|
+
});
|
|
58918
|
+
DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Climate, DeviceType.Thermostat;
|
|
58709
58919
|
object({
|
|
58710
58920
|
/** Members whose current value entered the aggregate. */
|
|
58711
58921
|
included: number().int().nonnegative().meta(readingMeta("count", {
|
|
@@ -58723,7 +58933,7 @@ object({
|
|
|
58723
58933
|
label: "Members"
|
|
58724
58934
|
}))
|
|
58725
58935
|
});
|
|
58726
|
-
DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
|
|
58936
|
+
DeviceType.Sensor, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
|
|
58727
58937
|
object({
|
|
58728
58938
|
/** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
|
|
58729
58939
|
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
@@ -59630,7 +59840,14 @@ DeviceType.Lock, method(object({
|
|
|
59630
59840
|
auth: "protected"
|
|
59631
59841
|
}), method(object({
|
|
59632
59842
|
deviceId: number().int().nonnegative(),
|
|
59633
|
-
code: string().min(1).optional()
|
|
59843
|
+
code: string().min(1).optional(),
|
|
59844
|
+
/**
|
|
59845
|
+
* Honoured by a helper lock GROUP only (D944): unlocking several doors
|
|
59846
|
+
* with one call is refused unless the caller says it was confirmed. A
|
|
59847
|
+
* single lock ignores it. The refusal lives in the callee, so no
|
|
59848
|
+
* automation or API caller reaches the doors by skipping a dialog.
|
|
59849
|
+
*/
|
|
59850
|
+
confirm: boolean().optional()
|
|
59634
59851
|
}), _void(), {
|
|
59635
59852
|
kind: "mutation",
|
|
59636
59853
|
auth: "protected"
|
|
@@ -61550,9 +61767,9 @@ object({
|
|
|
61550
61767
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
61551
61768
|
kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
|
|
61552
61769
|
/** Voltage in volts. */
|
|
61553
|
-
volts: number().optional().meta(readingMeta("voltage")),
|
|
61770
|
+
volts: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
61554
61771
|
/** Current in amperes. */
|
|
61555
|
-
amps: number().optional().meta(readingMeta("current")),
|
|
61772
|
+
amps: number().optional().meta(readingMeta("current", { label: "Current" })),
|
|
61556
61773
|
/** Apparent power in volt-amperes. */
|
|
61557
61774
|
va: number().optional().meta(readingMeta("apparent-power")),
|
|
61558
61775
|
/** Power factor (0..1) if reported. */
|
|
@@ -61560,7 +61777,23 @@ object({
|
|
|
61560
61777
|
/** Ms epoch when the slice was last updated. */
|
|
61561
61778
|
lastFetchedAt: number()
|
|
61562
61779
|
});
|
|
61563
|
-
|
|
61780
|
+
[
|
|
61781
|
+
DeviceType.Sensor,
|
|
61782
|
+
DeviceType.Switch,
|
|
61783
|
+
DeviceType.Light,
|
|
61784
|
+
DeviceType.Fan,
|
|
61785
|
+
DeviceType.Climate,
|
|
61786
|
+
DeviceType.Thermostat,
|
|
61787
|
+
DeviceType.Humidifier,
|
|
61788
|
+
DeviceType.WaterHeater,
|
|
61789
|
+
DeviceType.MediaPlayer,
|
|
61790
|
+
DeviceType.Washer,
|
|
61791
|
+
DeviceType.Dryer,
|
|
61792
|
+
DeviceType.Dishwasher,
|
|
61793
|
+
DeviceType.Vacuum,
|
|
61794
|
+
DeviceType.LawnMower,
|
|
61795
|
+
DeviceType.PetFeeder
|
|
61796
|
+
].filter((type) => type !== DeviceType.Sensor);
|
|
61564
61797
|
/**
|
|
61565
61798
|
* Presence cap. Models HA `person.*` and `device_tracker.*` entities
|
|
61566
61799
|
* on `DeviceType.Presence`. Read-only — no setters: presence is
|
|
@@ -64046,7 +64279,7 @@ object({
|
|
|
64046
64279
|
/** Ms epoch of the last state change. Useful for UI "X minutes ago". */
|
|
64047
64280
|
lastChangedAt: number()
|
|
64048
64281
|
});
|
|
64049
|
-
DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
|
|
64282
|
+
DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, method(object({
|
|
64050
64283
|
deviceId: number(),
|
|
64051
64284
|
on: boolean()
|
|
64052
64285
|
}), _void(), {
|
|
@@ -65840,8 +66073,9 @@ var trainingCapability = {
|
|
|
65840
66073
|
})
|
|
65841
66074
|
}
|
|
65842
66075
|
};
|
|
66076
|
+
DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
|
|
65843
66077
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
65844
|
-
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;
|
|
66078
|
+
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;
|
|
65845
66079
|
String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
|
|
65846
66080
|
DeviceRole.BinarySensor, DeviceRole.MotionSensor;
|
|
65847
66081
|
new Set(CAP_NAMES);
|
|
@@ -69117,6 +69351,13 @@ Object.freeze({
|
|
|
69117
69351
|
access: "view",
|
|
69118
69352
|
role: "viewer"
|
|
69119
69353
|
},
|
|
69354
|
+
"groupActive.getStatus": {
|
|
69355
|
+
capName: "group-active",
|
|
69356
|
+
capScope: "device",
|
|
69357
|
+
addonId: null,
|
|
69358
|
+
access: "view",
|
|
69359
|
+
role: "viewer"
|
|
69360
|
+
},
|
|
69120
69361
|
"groupCommands.getStatus": {
|
|
69121
69362
|
capName: "group-commands",
|
|
69122
69363
|
capScope: "device",
|
|
@@ -78992,6 +79233,10 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78992
79233
|
icon: "flame"
|
|
78993
79234
|
}]
|
|
78994
79235
|
},
|
|
79236
|
+
"group-active": {
|
|
79237
|
+
scope: "device",
|
|
79238
|
+
noun: t("Group state", "Stato del gruppo")
|
|
79239
|
+
},
|
|
78995
79240
|
"group-commands": {
|
|
78996
79241
|
scope: "device",
|
|
78997
79242
|
noun: t("Group command", "Comando di gruppo")
|
|
@@ -80538,6 +80783,11 @@ Object.freeze({
|
|
|
80538
80783
|
form: "single",
|
|
80539
80784
|
optional: false
|
|
80540
80785
|
}],
|
|
80786
|
+
"groupActive.getStatus": [{
|
|
80787
|
+
name: "deviceId",
|
|
80788
|
+
form: "single",
|
|
80789
|
+
optional: false
|
|
80790
|
+
}],
|
|
80541
80791
|
"groupCommands.getStatus": [{
|
|
80542
80792
|
name: "deviceId",
|
|
80543
80793
|
form: "single",
|