@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.
Files changed (22) hide show
  1. package/dist/{MotionZonesSettings-kbJlg0c5.mjs → MotionZonesSettings-BDIz0ADl.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-B3gzWS6Y.mjs → PrivacyMaskSettings-Cz_1itEY.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-CjxaItjN.mjs → SceneMonitorEditor-DxdQN6e5.mjs} +119 -120
  4. package/dist/_stub.js +5328 -5342
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cer78kD4.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-BZNWvnmy.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B6wwfPOo.mjs +26 -0
  7. package/dist/addon-training.css +1 -1
  8. package/dist/{dist-B3Dz3xDZ.mjs → dist-Bna6QSX9.mjs} +280 -30
  9. package/dist/{dist-uLc6FQWF.js → dist-Cv8pFcIo.js} +280 -30
  10. package/dist/{hostInit-C-l48gwp.mjs → hostInit-BsH6KoQn.mjs} +2 -2
  11. package/dist/index.js +1 -1
  12. package/dist/orchestrator/training.addon.js +1 -1
  13. package/dist/orchestrator/training.addon.mjs +1 -1
  14. package/dist/{player-overlays-DrA4TUe3.mjs → player-overlays-ClwLHxNP.mjs} +1 -1
  15. package/dist/providers/modal/training-modal.addon.js +1 -1
  16. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  17. package/dist/remoteEntry.js +1 -1
  18. package/dist/{responsive-C46lpRSX.mjs → responsive-Cx4quvGq.mjs} +1 -1
  19. package/dist/{scene-monitor-copy-Cqfs4Vng.mjs → scene-monitor-copy-DIJUg8Ro.mjs} +63 -46
  20. 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
  21. package/package.json +1 -1
  22. 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-0sD_LHLI.mjs
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-CpETZ4HL.mjs
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 StatisticWindowSchema = discriminatedUnion("kind", [object({
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
- }), object({
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$1 = {
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$1]
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$1]
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$1]
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$1]
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$1]
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$1]
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$1]
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
- ...input,
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
- outputField: "on",
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
- DeviceType.Sensor, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
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",