@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
@@ -5608,7 +5608,7 @@ var ZodIssueCode = {
5608
5608
  var ZodFirstPartyTypeKind;
5609
5609
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5610
5610
  //#endregion
5611
- //#region ../types/dist/sleep-0sD_LHLI.mjs
5611
+ //#region ../types/dist/sleep--jXS9hWo.mjs
5612
5612
  /**
5613
5613
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5614
5614
  * window to float samples (D455).
@@ -8978,6 +8978,7 @@ var CAP_NAMES = Object.freeze([
8978
8978
  "filesystem-browse",
8979
8979
  "flood",
8980
8980
  "gas",
8981
+ "group-active",
8981
8982
  "group-commands",
8982
8983
  "group-status",
8983
8984
  "heating-valve",
@@ -9799,6 +9800,10 @@ Object.freeze({
9799
9800
  "path": "detected",
9800
9801
  "valueType": "boolean"
9801
9802
  }],
9803
+ "group-active": [{
9804
+ "path": "active",
9805
+ "valueType": "boolean"
9806
+ }],
9802
9807
  "group-status": [
9803
9808
  {
9804
9809
  "path": "included",
@@ -11154,7 +11159,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11154
11159
  return DeviceRole;
11155
11160
  }({});
11156
11161
  //#endregion
11157
- //#region ../types/dist/composition-CpETZ4HL.mjs
11162
+ //#region ../types/dist/composition-Bb8iwHEJ.mjs
11158
11163
  /**
11159
11164
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11160
11165
  *
@@ -11469,6 +11474,13 @@ var table = {
11469
11474
  apply: () => {
11470
11475
  throw new ExpressionEvalError("latchedAt: stateful evaluation context is required");
11471
11476
  }
11477
+ },
11478
+ schmitt: {
11479
+ minArgs: 3,
11480
+ maxArgs: 5,
11481
+ apply: () => {
11482
+ throw new ExpressionEvalError("schmitt: stateful evaluation context is required");
11483
+ }
11472
11484
  }
11473
11485
  };
11474
11486
  Object.freeze(Object.assign(Object.create(null), table));
@@ -11979,7 +11991,7 @@ var RESET_PERIODS = [
11979
11991
  5 * MINUTE_MS;
11980
11992
  24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
11981
11993
  7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
11982
- var StatisticWindowSchema = discriminatedUnion("kind", [object({
11994
+ var rollingWindowObject = object({
11983
11995
  kind: literal("rolling"),
11984
11996
  span: _enum(ROLLING_SPANS),
11985
11997
  customMinutes: number().int().min(5).optional()
@@ -11996,7 +12008,9 @@ var StatisticWindowSchema = discriminatedUnion("kind", [object({
11996
12008
  path: ["customMinutes"],
11997
12009
  input: payload.value
11998
12010
  });
11999
- }), object({
12011
+ });
12012
+ var RollingWindowSchema = rollingWindowObject;
12013
+ var StatisticWindowSchema = discriminatedUnion("kind", [rollingWindowObject, object({
12000
12014
  kind: literal("calendar"),
12001
12015
  period: _enum(CALENDAR_PERIODS)
12002
12016
  })]);
@@ -12026,7 +12040,13 @@ var GROUP_TEMPLATE_IDS = [
12026
12040
  "occupancy",
12027
12041
  "binary",
12028
12042
  "switch",
12029
- "light"
12043
+ "light",
12044
+ "fan",
12045
+ "cover",
12046
+ "valve",
12047
+ "lock",
12048
+ "media-player",
12049
+ "climate"
12030
12050
  ];
12031
12051
  var NUMERIC_AGGREGATES = [
12032
12052
  "mean",
@@ -12085,6 +12105,42 @@ var HelperSpecSchema = discriminatedUnion("kind", [
12085
12105
  reset: _enum(RESET_PERIODS),
12086
12106
  output: _enum(["energy", "meter"]),
12087
12107
  source: HelperMemberSchema
12108
+ }),
12109
+ object({
12110
+ kind: literal("threshold"),
12111
+ source: HelperMemberSchema,
12112
+ high: number(),
12113
+ low: number(),
12114
+ onForMs: number().int().nonnegative(),
12115
+ offForMs: number().int().nonnegative()
12116
+ }),
12117
+ object({
12118
+ kind: literal("arithmetic"),
12119
+ op: _enum([
12120
+ "sum",
12121
+ "difference",
12122
+ "ratio"
12123
+ ]),
12124
+ inputs: array(HelperMemberSchema).min(2).max(64)
12125
+ }),
12126
+ object({
12127
+ kind: literal("expression"),
12128
+ expr: string().min(1),
12129
+ inputs: array(object({
12130
+ name: string().min(1),
12131
+ member: HelperMemberSchema
12132
+ })).min(1).max(64),
12133
+ output: _enum(["number", "boolean"])
12134
+ }),
12135
+ object({
12136
+ kind: literal("derivative"),
12137
+ window: RollingWindowSchema,
12138
+ per: _enum([
12139
+ "second",
12140
+ "minute",
12141
+ "hour"
12142
+ ]),
12143
+ source: HelperMemberSchema
12088
12144
  })
12089
12145
  ]);
12090
12146
  /** A composed device's stableId is this prefix plus the block id. */
@@ -12147,6 +12203,12 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
12147
12203
  "all"
12148
12204
  ]),
12149
12205
  reads: array(CompositionFieldReadSchema).min(1).max(64),
12206
+ /**
12207
+ * Set when the reads are an enum state, not a yes/no: the listed states
12208
+ * count as active (a cover is `open`). A state outside the list is inactive;
12209
+ * a read that is not a state at all is left out. Only `any` / `all` use it.
12210
+ */
12211
+ activeWhen: array(string().min(1)).min(1).optional(),
12150
12212
  /** `value` is the reading; the others are the member counts. */
12151
12213
  publish: _enum([
12152
12214
  "value",
@@ -17374,7 +17436,22 @@ var BrokerProviderInfoSchema = object({
17374
17436
  */
17375
17437
  interactiveConnectPath: string().min(1).optional(),
17376
17438
  /** Relative hub path to disconnect the linked account (same popup pattern). */
17377
- interactiveDisconnectPath: string().min(1).optional()
17439
+ interactiveDisconnectPath: string().min(1).optional(),
17440
+ /**
17441
+ * The kind signs in through a server-held interactive session instead of
17442
+ * (or before) typed credentials. `basePath` is a hub-relative route set
17443
+ * served by the owning addon (`/addon/<id>/...`) speaking the sign-in
17444
+ * contract: `POST {basePath}/start` (body: the form's settings) answers
17445
+ * `{ sessionId, loginUrl }`; `GET {basePath}/status?sessionId=` answers
17446
+ * `{ phase: 'starting' | 'awaiting-login' | 'captured' | 'error' |
17447
+ * 'cancelled', loginUrl, error }`; `POST {basePath}/commit`
17448
+ * (`{ sessionId, name, brokerId? }`) stores the credentials on a new or
17449
+ * existing broker and answers `{ brokerId }`; `POST {basePath}/cancel`
17450
+ * (`{ sessionId }`) drops the session. The dialog that edits a broker
17451
+ * offers it as the default path; the fields the session fills are
17452
+ * marked `filledBySignIn` in the kind's settings schema.
17453
+ */
17454
+ signIn: object({ basePath: string().min(1) }).optional()
17378
17455
  }))
17379
17456
  });
17380
17457
  var ListInputSchema = object({
@@ -18608,13 +18685,17 @@ Object.freeze({
18608
18685
  latchedAt: {
18609
18686
  kind: "fixed",
18610
18687
  result: ["number", "null"]
18688
+ },
18689
+ schmitt: {
18690
+ kind: "fixed",
18691
+ result: ["boolean", "null"]
18611
18692
  }
18612
18693
  });
18613
18694
  /**
18614
18695
  * One catalog row per base reading a group helper can build (D944 §3).
18615
18696
  * Data, not a form default written into the block.
18616
18697
  */
18617
- var NOW$1 = {
18698
+ var NOW$2 = {
18618
18699
  fieldPath: "lastFetchedAt",
18619
18700
  expr: "now"
18620
18701
  };
@@ -18628,6 +18709,8 @@ function numeric(input) {
18628
18709
  family: "numeric",
18629
18710
  deviceType: DeviceType.Sensor,
18630
18711
  memberDeviceType: DeviceType.Sensor,
18712
+ memberDeviceTypes: [DeviceType.Sensor],
18713
+ activeWhen: void 0,
18631
18714
  commandCaps: [],
18632
18715
  baseUnit: baseUnitOf(input.quantity),
18633
18716
  aggregates: NUMERIC_AGGREGATES,
@@ -18643,6 +18726,8 @@ function binary(input) {
18643
18726
  family: "binary",
18644
18727
  deviceType: DeviceType.Sensor,
18645
18728
  memberDeviceType: DeviceType.Sensor,
18729
+ memberDeviceTypes: [DeviceType.Sensor],
18730
+ activeWhen: void 0,
18646
18731
  commandCaps: [],
18647
18732
  quantity: "none",
18648
18733
  baseUnit: void 0,
@@ -18660,7 +18745,7 @@ var GROUP_TEMPLATES = [
18660
18745
  quantity: "temperature",
18661
18746
  defaultAggregate: "mean",
18662
18747
  empty: "null",
18663
- companions: [NOW$1]
18748
+ companions: [NOW$2]
18664
18749
  }),
18665
18750
  numeric({
18666
18751
  id: "humidity",
@@ -18671,7 +18756,7 @@ var GROUP_TEMPLATES = [
18671
18756
  quantity: "humidity",
18672
18757
  defaultAggregate: "mean",
18673
18758
  empty: "null",
18674
- companions: [NOW$1]
18759
+ companions: [NOW$2]
18675
18760
  }),
18676
18761
  numeric({
18677
18762
  id: "pressure",
@@ -18682,7 +18767,7 @@ var GROUP_TEMPLATES = [
18682
18767
  quantity: "pressure",
18683
18768
  defaultAggregate: "mean",
18684
18769
  empty: "null",
18685
- companions: [NOW$1]
18770
+ companions: [NOW$2]
18686
18771
  }),
18687
18772
  numeric({
18688
18773
  id: "illuminance",
@@ -18693,7 +18778,7 @@ var GROUP_TEMPLATES = [
18693
18778
  quantity: "illuminance",
18694
18779
  defaultAggregate: "mean",
18695
18780
  empty: "null",
18696
- companions: [NOW$1]
18781
+ companions: [NOW$2]
18697
18782
  }),
18698
18783
  numeric({
18699
18784
  id: "power",
@@ -18704,7 +18789,7 @@ var GROUP_TEMPLATES = [
18704
18789
  quantity: "power",
18705
18790
  defaultAggregate: "sum",
18706
18791
  empty: "omit",
18707
- companions: [NOW$1]
18792
+ companions: [NOW$2]
18708
18793
  }),
18709
18794
  numeric({
18710
18795
  id: "energy",
@@ -18715,7 +18800,7 @@ var GROUP_TEMPLATES = [
18715
18800
  quantity: "energy",
18716
18801
  defaultAggregate: "sum",
18717
18802
  empty: "omit",
18718
- companions: [NOW$1]
18803
+ companions: [NOW$2]
18719
18804
  }),
18720
18805
  numeric({
18721
18806
  id: "battery",
@@ -18750,7 +18835,7 @@ var GROUP_TEMPLATES = [
18750
18835
  quantity: "device",
18751
18836
  defaultAggregate: "mean",
18752
18837
  empty: "null",
18753
- companions: [NOW$1]
18838
+ companions: [NOW$2]
18754
18839
  }),
18755
18840
  binary({
18756
18841
  id: "motion",
@@ -18844,6 +18929,11 @@ var GROUP_TEMPLATES = [
18844
18929
  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.",
18845
18930
  deviceType: DeviceType.Switch,
18846
18931
  outputCap: "switch",
18932
+ outputField: "on",
18933
+ member: {
18934
+ cap: "switch",
18935
+ fieldPath: "on"
18936
+ },
18847
18937
  commandCaps: ["switch"]
18848
18938
  }),
18849
18939
  actuator({
@@ -18851,29 +18941,130 @@ var GROUP_TEMPLATES = [
18851
18941
  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.",
18852
18942
  deviceType: DeviceType.Light,
18853
18943
  outputCap: "switch",
18944
+ outputField: "on",
18945
+ member: {
18946
+ cap: "switch",
18947
+ fieldPath: "on"
18948
+ },
18854
18949
  commandCaps: [
18855
18950
  "switch",
18856
18951
  "brightness",
18857
18952
  "color"
18858
18953
  ]
18954
+ }),
18955
+ actuator({
18956
+ id: "fan",
18957
+ 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.",
18958
+ deviceType: DeviceType.Fan,
18959
+ outputCap: "switch",
18960
+ outputField: "on",
18961
+ member: {
18962
+ cap: "switch",
18963
+ fieldPath: "on"
18964
+ },
18965
+ commandCaps: ["switch", "fan-control"]
18966
+ }),
18967
+ actuator({
18968
+ id: "cover",
18969
+ 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.",
18970
+ deviceType: DeviceType.Cover,
18971
+ outputCap: "group-active",
18972
+ outputField: "active",
18973
+ member: {
18974
+ cap: "cover",
18975
+ fieldPath: "state"
18976
+ },
18977
+ activeWhen: [
18978
+ "open",
18979
+ "opening",
18980
+ "stopped"
18981
+ ],
18982
+ commandCaps: ["cover"]
18983
+ }),
18984
+ actuator({
18985
+ id: "valve",
18986
+ 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.",
18987
+ deviceType: DeviceType.Valve,
18988
+ outputCap: "group-active",
18989
+ outputField: "active",
18990
+ member: {
18991
+ cap: "valve",
18992
+ fieldPath: "state"
18993
+ },
18994
+ activeWhen: [
18995
+ "open",
18996
+ "opening",
18997
+ "stopped"
18998
+ ],
18999
+ commandCaps: ["valve"]
19000
+ }),
19001
+ actuator({
19002
+ id: "lock",
19003
+ 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.",
19004
+ deviceType: DeviceType.Lock,
19005
+ outputCap: "group-active",
19006
+ outputField: "active",
19007
+ member: {
19008
+ cap: "lock-control",
19009
+ fieldPath: "state"
19010
+ },
19011
+ activeWhen: ["locked"],
19012
+ commandCaps: ["lock-control"]
19013
+ }),
19014
+ actuator({
19015
+ id: "media-player",
19016
+ 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.",
19017
+ deviceType: DeviceType.MediaPlayer,
19018
+ outputCap: "group-active",
19019
+ outputField: "active",
19020
+ member: {
19021
+ cap: "media-player",
19022
+ fieldPath: "state"
19023
+ },
19024
+ activeWhen: ["playing", "buffering"],
19025
+ commandCaps: ["media-player"]
19026
+ }),
19027
+ actuator({
19028
+ id: "climate",
19029
+ 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.",
19030
+ deviceType: DeviceType.Thermostat,
19031
+ memberDeviceTypes: [DeviceType.Thermostat, DeviceType.Climate],
19032
+ outputCap: "group-active",
19033
+ outputField: "active",
19034
+ member: {
19035
+ cap: "climate-control",
19036
+ fieldPath: "mode"
19037
+ },
19038
+ activeWhen: [
19039
+ "heat",
19040
+ "cool",
19041
+ "auto",
19042
+ "heat_cool",
19043
+ "fan_only",
19044
+ "dry"
19045
+ ],
19046
+ commandCaps: ["climate-control"]
18859
19047
  })
18860
19048
  ];
18861
19049
  function actuator(input) {
18862
19050
  return {
18863
- ...input,
19051
+ id: input.id,
19052
+ summary: input.summary,
19053
+ deviceType: input.deviceType,
19054
+ outputCap: input.outputCap,
19055
+ outputField: input.outputField,
19056
+ commandCaps: input.commandCaps,
18864
19057
  family: "actuator",
18865
19058
  role: void 0,
18866
19059
  memberDeviceType: input.deviceType,
18867
- outputField: "on",
19060
+ memberDeviceTypes: input.memberDeviceTypes ?? [input.deviceType],
19061
+ activeWhen: input.activeWhen,
18868
19062
  quantity: "none",
18869
19063
  baseUnit: void 0,
18870
19064
  aggregates: BINARY_AGGREGATES,
18871
19065
  defaultAggregate: "any",
18872
19066
  empty: "offline",
18873
- accept: [{
18874
- cap: "switch",
18875
- fieldPath: "on"
18876
- }],
19067
+ accept: [input.member],
18877
19068
  companions: [CHANGED]
18878
19069
  };
18879
19070
  }
@@ -46537,7 +46728,20 @@ var NcRuleInputSchema = object({
46537
46728
  * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
46538
46729
  * path does not run Zod defaults.
46539
46730
  */
46540
- groupingSec: number().int().min(5).max(60).optional()
46731
+ groupingSec: number().int().min(5).max(60).optional(),
46732
+ /**
46733
+ * ASK ME TO CONFIRM DETECTIONS (#243): a DETECTION notification of this rule
46734
+ * carries "Correct" / "Wrong" buttons (and, where the channel has room, a
46735
+ * "Wrong, it is a <class>" choice). A tap marks the track for retraining, the
46736
+ * same mark the Library writes, and records whose notification it was and
46737
+ * when. A channel with no buttons gets the same two choices as links.
46738
+ *
46739
+ * `.optional()`, never `.default()` (a Zod default does not run on the addon
46740
+ * cap path): absent and `false` both mean off, which is what every rule
46741
+ * authored before this field meant. An editor turns it off by writing
46742
+ * `false`, so it needs no `clear` key.
46743
+ */
46744
+ askVerdict: boolean().optional()
46541
46745
  });
46542
46746
  /**
46543
46747
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -56994,7 +57198,7 @@ var BatteryStatusSchema = object({
56994
57198
  */
56995
57199
  binary: boolean().optional().meta({ label: "Binary indicator" })
56996
57200
  });
56997
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat;
57201
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter;
56998
57202
  method(object({
56999
57203
  deviceId: number(),
57000
57204
  /** Bound on the wait. Sensible range 3000–10000ms. */
@@ -58738,7 +58942,13 @@ results: array(object({
58738
58942
  /** Ms epoch of the attempt. */
58739
58943
  at: number()
58740
58944
  })) });
58741
- DeviceType.Switch, DeviceType.Light;
58945
+ DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
58946
+ object({
58947
+ active: boolean().meta({ label: "Active" }),
58948
+ /** Ms epoch when the slice was last updated. */
58949
+ lastChangedAt: number()
58950
+ });
58951
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Climate, DeviceType.Thermostat;
58742
58952
  object({
58743
58953
  /** Members whose current value entered the aggregate. */
58744
58954
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -58756,7 +58966,7 @@ object({
58756
58966
  label: "Members"
58757
58967
  }))
58758
58968
  });
58759
- DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
58969
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
58760
58970
  object({
58761
58971
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
58762
58972
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -59663,7 +59873,14 @@ DeviceType.Lock, method(object({
59663
59873
  auth: "protected"
59664
59874
  }), method(object({
59665
59875
  deviceId: number().int().nonnegative(),
59666
- code: string().min(1).optional()
59876
+ code: string().min(1).optional(),
59877
+ /**
59878
+ * Honoured by a helper lock GROUP only (D944): unlocking several doors
59879
+ * with one call is refused unless the caller says it was confirmed. A
59880
+ * single lock ignores it. The refusal lives in the callee, so no
59881
+ * automation or API caller reaches the doors by skipping a dialog.
59882
+ */
59883
+ confirm: boolean().optional()
59667
59884
  }), _void(), {
59668
59885
  kind: "mutation",
59669
59886
  auth: "protected"
@@ -61583,9 +61800,9 @@ object({
61583
61800
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
61584
61801
  kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
61585
61802
  /** Voltage in volts. */
61586
- volts: number().optional().meta(readingMeta("voltage")),
61803
+ volts: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
61587
61804
  /** Current in amperes. */
61588
- amps: number().optional().meta(readingMeta("current")),
61805
+ amps: number().optional().meta(readingMeta("current", { label: "Current" })),
61589
61806
  /** Apparent power in volt-amperes. */
61590
61807
  va: number().optional().meta(readingMeta("apparent-power")),
61591
61808
  /** Power factor (0..1) if reported. */
@@ -61593,7 +61810,23 @@ object({
61593
61810
  /** Ms epoch when the slice was last updated. */
61594
61811
  lastFetchedAt: number()
61595
61812
  });
61596
- DeviceType.Sensor, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
61813
+ [
61814
+ DeviceType.Sensor,
61815
+ DeviceType.Switch,
61816
+ DeviceType.Light,
61817
+ DeviceType.Fan,
61818
+ DeviceType.Climate,
61819
+ DeviceType.Thermostat,
61820
+ DeviceType.Humidifier,
61821
+ DeviceType.WaterHeater,
61822
+ DeviceType.MediaPlayer,
61823
+ DeviceType.Washer,
61824
+ DeviceType.Dryer,
61825
+ DeviceType.Dishwasher,
61826
+ DeviceType.Vacuum,
61827
+ DeviceType.LawnMower,
61828
+ DeviceType.PetFeeder
61829
+ ].filter((type) => type !== DeviceType.Sensor);
61597
61830
  /**
61598
61831
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
61599
61832
  * on `DeviceType.Presence`. Read-only — no setters: presence is
@@ -64079,7 +64312,7 @@ object({
64079
64312
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
64080
64313
  lastChangedAt: number()
64081
64314
  });
64082
- DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
64315
+ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, method(object({
64083
64316
  deviceId: number(),
64084
64317
  on: boolean()
64085
64318
  }), _void(), {
@@ -65873,8 +66106,9 @@ var trainingCapability = {
65873
66106
  })
65874
66107
  }
65875
66108
  };
66109
+ DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
65876
66110
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
65877
- 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;
66111
+ 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;
65878
66112
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
65879
66113
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
65880
66114
  new Set(CAP_NAMES);
@@ -69150,6 +69384,13 @@ Object.freeze({
69150
69384
  access: "view",
69151
69385
  role: "viewer"
69152
69386
  },
69387
+ "groupActive.getStatus": {
69388
+ capName: "group-active",
69389
+ capScope: "device",
69390
+ addonId: null,
69391
+ access: "view",
69392
+ role: "viewer"
69393
+ },
69153
69394
  "groupCommands.getStatus": {
69154
69395
  capName: "group-commands",
69155
69396
  capScope: "device",
@@ -79025,6 +79266,10 @@ var SENSOR_CAP_VOCABULARY = {
79025
79266
  icon: "flame"
79026
79267
  }]
79027
79268
  },
79269
+ "group-active": {
79270
+ scope: "device",
79271
+ noun: t("Group state", "Stato del gruppo")
79272
+ },
79028
79273
  "group-commands": {
79029
79274
  scope: "device",
79030
79275
  noun: t("Group command", "Comando di gruppo")
@@ -80571,6 +80816,11 @@ Object.freeze({
80571
80816
  form: "single",
80572
80817
  optional: false
80573
80818
  }],
80819
+ "groupActive.getStatus": [{
80820
+ name: "deviceId",
80821
+ form: "single",
80822
+ optional: false
80823
+ }],
80574
80824
  "groupCommands.getStatus": [{
80575
80825
  name: "deviceId",
80576
80826
  form: "single",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.422",
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.334",
84
+ version: "1.2.336",
85
85
  scope: "default",
86
86
  shareConfig: {
87
87
  singleton: !0,
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./dist-uLc6FQWF.js");
2
+ require("./dist-Cv8pFcIo.js");
3
3
  const require_orchestrator_training_addon = require("./orchestrator/training.addon.js");
4
4
  const require_providers_modal_training_modal_addon = require("./providers/modal/training-modal.addon.js");
5
5
  //#region src/providers/fake/fake-provider.ts
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-uLc6FQWF.js");
2
+ const require_dist = require("../dist-Cv8pFcIo.js");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path);
5
5
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { a as addonPagesSourceCapability, i as TrainingResultSchema, l as BaseAddon, m as defineRecordKinds, n as TrainingJobSchema, o as parseTrainingEventLine, r as TrainingJobSpecSchema, s as trainingCapability, t as TRAINING_JOB_SCHEMA, u as RECORD_MAX_DATA_BYTES } from "../dist-B3Dz3xDZ.mjs";
1
+ import { a as addonPagesSourceCapability, i as TrainingResultSchema, l as BaseAddon, m as defineRecordKinds, n as TrainingJobSchema, o as parseTrainingEventLine, r as TrainingJobSpecSchema, s as trainingCapability, t as TRAINING_JOB_SCHEMA, u as RECORD_MAX_DATA_BYTES } from "../dist-Bna6QSX9.mjs";
2
2
  import path from "node:path";
3
3
  import { createHash } from "node:crypto";
4
4
  import { createReadStream } from "node:fs";
@@ -1,7 +1,7 @@
1
1
  import { d as e, u as t, w as n, y as r } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-CEvdvp1T.mjs";
2
2
  import { n as i, r as a, t as o } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DnrbBvrw.mjs";
3
3
  import { n as s, t as c } from "./chevron-right-cA8Hucbi.mjs";
4
- import { g as l } from "./responsive-C46lpRSX.mjs";
4
+ import { g as l } from "./responsive-Cx4quvGq.mjs";
5
5
  //#region ../ui-library/src/composites/widget-panel.tsx
6
6
  n();
7
7
  function u({ title: e, icon: t, headerRight: n, collapsible: l = !1, defaultOpen: u = !0, open: d, onOpenChange: f, bodyClassName: p = "p-3", children: m }) {
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../../dist-uLc6FQWF.js");
2
+ const require_dist = require("../../dist-Cv8pFcIo.js");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path, 1);
5
5
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { C as record, S as object, _ as isSecretClear, b as boolean, c as trainingProviderCapability, d as SECRET_CLEAR, f as arrayItemFieldPath, g as globalSecretScope, h as entryBody, l as BaseAddon, p as defineEntryKind, v as isSecretMarker, w as string, x as number, y as toSecretFieldView } from "../../dist-B3Dz3xDZ.mjs";
1
+ import { C as record, S as object, _ as isSecretClear, b as boolean, c as trainingProviderCapability, d as SECRET_CLEAR, f as arrayItemFieldPath, g as globalSecretScope, h as entryBody, l as BaseAddon, p as defineEntryKind, v as isSecretMarker, w as string, x as number, y as toSecretFieldView } from "../../dist-Bna6QSX9.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import path, { dirname, posix } from "node:path";
4
4
  import { createHash, createPrivateKey, createPublicKey, createSign, randomBytes, randomUUID } from "node:crypto";
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qVIpiQZD.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-C-gbqU_M.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { b as e, d as t, g as n, l as r, n as i, u as a, w as o, y as s } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-CEvdvp1T.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DnrbBvrw.mjs";
3
- import { k as c } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DM1LS5rC.mjs";
3
+ import { O as c } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B6wwfPOo.mjs";
4
4
  //#region ../ui-library/src/lib/shared-context.ts
5
5
  o();
6
6
  function l(e, t) {