@camstack/addon-model-studio 1.1.305 → 1.1.306

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 (18) hide show
  1. package/dist/{MotionZonesSettings-nwsYJ4LM.mjs → MotionZonesSettings-BdAF3Lx2.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-D44t-3Il.mjs → PrivacyMaskSettings-bRMKWnGr.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-B7GPFInk.mjs → SceneMonitorEditor-DffVOhzN.mjs} +3 -3
  4. package/dist/_stub.js +130 -129
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-Dm-CsmsB.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DVVRygHY.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CsIeC3fr.mjs +26 -0
  7. package/dist/{hostInit-BCkvpKIY.mjs → hostInit-fNjQtgdi.mjs} +2 -2
  8. package/dist/model-studio.addon.js +243 -24
  9. package/dist/model-studio.addon.mjs +243 -24
  10. package/dist/{player-overlays-BmekT-lx.mjs → player-overlays-BQux3aXS.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-DEe2tyvb.mjs → responsive-BOS8RfJa.mjs} +1 -1
  13. package/dist/{scene-monitor-copy-0SI6bJjg.mjs → scene-monitor-copy-CaVNQakt.mjs} +1 -1
  14. package/dist/{square-_3D14YQf.mjs → square-DCA-7eaY.mjs} +1 -1
  15. package/dist/{trash-2-CBnastSw.mjs → trash-2-DYZFq4gu.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-BVMDXJrt.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CWXLGHpz.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B5mcgboO.mjs +0 -26
@@ -5837,7 +5837,7 @@ var ZodIssueCode = {
5837
5837
  var ZodFirstPartyTypeKind;
5838
5838
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5839
5839
  //#endregion
5840
- //#region ../types/dist/sleep-0sD_LHLI.mjs
5840
+ //#region ../types/dist/sleep--jXS9hWo.mjs
5841
5841
  /**
5842
5842
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5843
5843
  * window to float samples (D455).
@@ -9040,6 +9040,7 @@ var CAP_NAMES = Object.freeze([
9040
9040
  "filesystem-browse",
9041
9041
  "flood",
9042
9042
  "gas",
9043
+ "group-active",
9043
9044
  "group-commands",
9044
9045
  "group-status",
9045
9046
  "heating-valve",
@@ -9861,6 +9862,10 @@ Object.freeze({
9861
9862
  "path": "detected",
9862
9863
  "valueType": "boolean"
9863
9864
  }],
9865
+ "group-active": [{
9866
+ "path": "active",
9867
+ "valueType": "boolean"
9868
+ }],
9864
9869
  "group-status": [
9865
9870
  {
9866
9871
  "path": "included",
@@ -11216,7 +11221,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11216
11221
  return DeviceRole;
11217
11222
  }({});
11218
11223
  //#endregion
11219
- //#region ../types/dist/composition-CpETZ4HL.mjs
11224
+ //#region ../types/dist/composition-Bb8iwHEJ.mjs
11220
11225
  /**
11221
11226
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11222
11227
  *
@@ -11531,6 +11536,13 @@ var table = {
11531
11536
  apply: () => {
11532
11537
  throw new ExpressionEvalError("latchedAt: stateful evaluation context is required");
11533
11538
  }
11539
+ },
11540
+ schmitt: {
11541
+ minArgs: 3,
11542
+ maxArgs: 5,
11543
+ apply: () => {
11544
+ throw new ExpressionEvalError("schmitt: stateful evaluation context is required");
11545
+ }
11534
11546
  }
11535
11547
  };
11536
11548
  Object.freeze(Object.assign(Object.create(null), table));
@@ -12041,7 +12053,7 @@ var RESET_PERIODS = [
12041
12053
  5 * MINUTE_MS;
12042
12054
  24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
12043
12055
  7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
12044
- var StatisticWindowSchema = discriminatedUnion("kind", [object({
12056
+ var rollingWindowObject = object({
12045
12057
  kind: literal("rolling"),
12046
12058
  span: _enum(ROLLING_SPANS),
12047
12059
  customMinutes: number().int().min(5).optional()
@@ -12058,7 +12070,9 @@ var StatisticWindowSchema = discriminatedUnion("kind", [object({
12058
12070
  path: ["customMinutes"],
12059
12071
  input: payload.value
12060
12072
  });
12061
- }), object({
12073
+ });
12074
+ var RollingWindowSchema = rollingWindowObject;
12075
+ var StatisticWindowSchema = discriminatedUnion("kind", [rollingWindowObject, object({
12062
12076
  kind: literal("calendar"),
12063
12077
  period: _enum(CALENDAR_PERIODS)
12064
12078
  })]);
@@ -12088,7 +12102,13 @@ var GROUP_TEMPLATE_IDS = [
12088
12102
  "occupancy",
12089
12103
  "binary",
12090
12104
  "switch",
12091
- "light"
12105
+ "light",
12106
+ "fan",
12107
+ "cover",
12108
+ "valve",
12109
+ "lock",
12110
+ "media-player",
12111
+ "climate"
12092
12112
  ];
12093
12113
  var NUMERIC_AGGREGATES = [
12094
12114
  "mean",
@@ -12147,6 +12167,42 @@ var HelperSpecSchema = discriminatedUnion("kind", [
12147
12167
  reset: _enum(RESET_PERIODS),
12148
12168
  output: _enum(["energy", "meter"]),
12149
12169
  source: HelperMemberSchema
12170
+ }),
12171
+ object({
12172
+ kind: literal("threshold"),
12173
+ source: HelperMemberSchema,
12174
+ high: number(),
12175
+ low: number(),
12176
+ onForMs: number().int().nonnegative(),
12177
+ offForMs: number().int().nonnegative()
12178
+ }),
12179
+ object({
12180
+ kind: literal("arithmetic"),
12181
+ op: _enum([
12182
+ "sum",
12183
+ "difference",
12184
+ "ratio"
12185
+ ]),
12186
+ inputs: array(HelperMemberSchema).min(2).max(64)
12187
+ }),
12188
+ object({
12189
+ kind: literal("expression"),
12190
+ expr: string().min(1),
12191
+ inputs: array(object({
12192
+ name: string().min(1),
12193
+ member: HelperMemberSchema
12194
+ })).min(1).max(64),
12195
+ output: _enum(["number", "boolean"])
12196
+ }),
12197
+ object({
12198
+ kind: literal("derivative"),
12199
+ window: RollingWindowSchema,
12200
+ per: _enum([
12201
+ "second",
12202
+ "minute",
12203
+ "hour"
12204
+ ]),
12205
+ source: HelperMemberSchema
12150
12206
  })
12151
12207
  ]);
12152
12208
  /** A composed device's stableId is this prefix plus the block id. */
@@ -12209,6 +12265,12 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
12209
12265
  "all"
12210
12266
  ]),
12211
12267
  reads: array(CompositionFieldReadSchema).min(1).max(64),
12268
+ /**
12269
+ * Set when the reads are an enum state, not a yes/no: the listed states
12270
+ * count as active (a cover is `open`). A state outside the list is inactive;
12271
+ * a read that is not a state at all is left out. Only `any` / `all` use it.
12272
+ */
12273
+ activeWhen: array(string().min(1)).min(1).optional(),
12212
12274
  /** `value` is the reading; the others are the member counts. */
12213
12275
  publish: _enum([
12214
12276
  "value",
@@ -18791,13 +18853,17 @@ Object.freeze({
18791
18853
  latchedAt: {
18792
18854
  kind: "fixed",
18793
18855
  result: ["number", "null"]
18856
+ },
18857
+ schmitt: {
18858
+ kind: "fixed",
18859
+ result: ["boolean", "null"]
18794
18860
  }
18795
18861
  });
18796
18862
  /**
18797
18863
  * One catalog row per base reading a group helper can build (D944 §3).
18798
18864
  * Data, not a form default written into the block.
18799
18865
  */
18800
- var NOW$1 = {
18866
+ var NOW$2 = {
18801
18867
  fieldPath: "lastFetchedAt",
18802
18868
  expr: "now"
18803
18869
  };
@@ -18811,6 +18877,8 @@ function numeric(input) {
18811
18877
  family: "numeric",
18812
18878
  deviceType: DeviceType.Sensor,
18813
18879
  memberDeviceType: DeviceType.Sensor,
18880
+ memberDeviceTypes: [DeviceType.Sensor],
18881
+ activeWhen: void 0,
18814
18882
  commandCaps: [],
18815
18883
  baseUnit: baseUnitOf(input.quantity),
18816
18884
  aggregates: NUMERIC_AGGREGATES,
@@ -18826,6 +18894,8 @@ function binary(input) {
18826
18894
  family: "binary",
18827
18895
  deviceType: DeviceType.Sensor,
18828
18896
  memberDeviceType: DeviceType.Sensor,
18897
+ memberDeviceTypes: [DeviceType.Sensor],
18898
+ activeWhen: void 0,
18829
18899
  commandCaps: [],
18830
18900
  quantity: "none",
18831
18901
  baseUnit: void 0,
@@ -18843,7 +18913,7 @@ var GROUP_TEMPLATES = [
18843
18913
  quantity: "temperature",
18844
18914
  defaultAggregate: "mean",
18845
18915
  empty: "null",
18846
- companions: [NOW$1]
18916
+ companions: [NOW$2]
18847
18917
  }),
18848
18918
  numeric({
18849
18919
  id: "humidity",
@@ -18854,7 +18924,7 @@ var GROUP_TEMPLATES = [
18854
18924
  quantity: "humidity",
18855
18925
  defaultAggregate: "mean",
18856
18926
  empty: "null",
18857
- companions: [NOW$1]
18927
+ companions: [NOW$2]
18858
18928
  }),
18859
18929
  numeric({
18860
18930
  id: "pressure",
@@ -18865,7 +18935,7 @@ var GROUP_TEMPLATES = [
18865
18935
  quantity: "pressure",
18866
18936
  defaultAggregate: "mean",
18867
18937
  empty: "null",
18868
- companions: [NOW$1]
18938
+ companions: [NOW$2]
18869
18939
  }),
18870
18940
  numeric({
18871
18941
  id: "illuminance",
@@ -18876,7 +18946,7 @@ var GROUP_TEMPLATES = [
18876
18946
  quantity: "illuminance",
18877
18947
  defaultAggregate: "mean",
18878
18948
  empty: "null",
18879
- companions: [NOW$1]
18949
+ companions: [NOW$2]
18880
18950
  }),
18881
18951
  numeric({
18882
18952
  id: "power",
@@ -18887,7 +18957,7 @@ var GROUP_TEMPLATES = [
18887
18957
  quantity: "power",
18888
18958
  defaultAggregate: "sum",
18889
18959
  empty: "omit",
18890
- companions: [NOW$1]
18960
+ companions: [NOW$2]
18891
18961
  }),
18892
18962
  numeric({
18893
18963
  id: "energy",
@@ -18898,7 +18968,7 @@ var GROUP_TEMPLATES = [
18898
18968
  quantity: "energy",
18899
18969
  defaultAggregate: "sum",
18900
18970
  empty: "omit",
18901
- companions: [NOW$1]
18971
+ companions: [NOW$2]
18902
18972
  }),
18903
18973
  numeric({
18904
18974
  id: "battery",
@@ -18933,7 +19003,7 @@ var GROUP_TEMPLATES = [
18933
19003
  quantity: "device",
18934
19004
  defaultAggregate: "mean",
18935
19005
  empty: "null",
18936
- companions: [NOW$1]
19006
+ companions: [NOW$2]
18937
19007
  }),
18938
19008
  binary({
18939
19009
  id: "motion",
@@ -19027,6 +19097,11 @@ var GROUP_TEMPLATES = [
19027
19097
  summary: "On when at least one switch is on, or when all of them are. Offline and unknown members are left out of that decision, never read as off, and still receive the command.",
19028
19098
  deviceType: DeviceType.Switch,
19029
19099
  outputCap: "switch",
19100
+ outputField: "on",
19101
+ member: {
19102
+ cap: "switch",
19103
+ fieldPath: "on"
19104
+ },
19030
19105
  commandCaps: ["switch"]
19031
19106
  }),
19032
19107
  actuator({
@@ -19034,29 +19109,130 @@ var GROUP_TEMPLATES = [
19034
19109
  summary: "On when at least one light is on, or when all of them are. Brightness and colour are offered only when every member has them. A command is not sent to a member that lacks it.",
19035
19110
  deviceType: DeviceType.Light,
19036
19111
  outputCap: "switch",
19112
+ outputField: "on",
19113
+ member: {
19114
+ cap: "switch",
19115
+ fieldPath: "on"
19116
+ },
19037
19117
  commandCaps: [
19038
19118
  "switch",
19039
19119
  "brightness",
19040
19120
  "color"
19041
19121
  ]
19122
+ }),
19123
+ actuator({
19124
+ id: "fan",
19125
+ 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.",
19126
+ deviceType: DeviceType.Fan,
19127
+ outputCap: "switch",
19128
+ outputField: "on",
19129
+ member: {
19130
+ cap: "switch",
19131
+ fieldPath: "on"
19132
+ },
19133
+ commandCaps: ["switch", "fan-control"]
19134
+ }),
19135
+ actuator({
19136
+ id: "cover",
19137
+ 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.",
19138
+ deviceType: DeviceType.Cover,
19139
+ outputCap: "group-active",
19140
+ outputField: "active",
19141
+ member: {
19142
+ cap: "cover",
19143
+ fieldPath: "state"
19144
+ },
19145
+ activeWhen: [
19146
+ "open",
19147
+ "opening",
19148
+ "stopped"
19149
+ ],
19150
+ commandCaps: ["cover"]
19151
+ }),
19152
+ actuator({
19153
+ id: "valve",
19154
+ 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.",
19155
+ deviceType: DeviceType.Valve,
19156
+ outputCap: "group-active",
19157
+ outputField: "active",
19158
+ member: {
19159
+ cap: "valve",
19160
+ fieldPath: "state"
19161
+ },
19162
+ activeWhen: [
19163
+ "open",
19164
+ "opening",
19165
+ "stopped"
19166
+ ],
19167
+ commandCaps: ["valve"]
19168
+ }),
19169
+ actuator({
19170
+ id: "lock",
19171
+ 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.",
19172
+ deviceType: DeviceType.Lock,
19173
+ outputCap: "group-active",
19174
+ outputField: "active",
19175
+ member: {
19176
+ cap: "lock-control",
19177
+ fieldPath: "state"
19178
+ },
19179
+ activeWhen: ["locked"],
19180
+ commandCaps: ["lock-control"]
19181
+ }),
19182
+ actuator({
19183
+ id: "media-player",
19184
+ 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.",
19185
+ deviceType: DeviceType.MediaPlayer,
19186
+ outputCap: "group-active",
19187
+ outputField: "active",
19188
+ member: {
19189
+ cap: "media-player",
19190
+ fieldPath: "state"
19191
+ },
19192
+ activeWhen: ["playing", "buffering"],
19193
+ commandCaps: ["media-player"]
19194
+ }),
19195
+ actuator({
19196
+ id: "climate",
19197
+ 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.",
19198
+ deviceType: DeviceType.Thermostat,
19199
+ memberDeviceTypes: [DeviceType.Thermostat, DeviceType.Climate],
19200
+ outputCap: "group-active",
19201
+ outputField: "active",
19202
+ member: {
19203
+ cap: "climate-control",
19204
+ fieldPath: "mode"
19205
+ },
19206
+ activeWhen: [
19207
+ "heat",
19208
+ "cool",
19209
+ "auto",
19210
+ "heat_cool",
19211
+ "fan_only",
19212
+ "dry"
19213
+ ],
19214
+ commandCaps: ["climate-control"]
19042
19215
  })
19043
19216
  ];
19044
19217
  function actuator(input) {
19045
19218
  return {
19046
- ...input,
19219
+ id: input.id,
19220
+ summary: input.summary,
19221
+ deviceType: input.deviceType,
19222
+ outputCap: input.outputCap,
19223
+ outputField: input.outputField,
19224
+ commandCaps: input.commandCaps,
19047
19225
  family: "actuator",
19048
19226
  role: void 0,
19049
19227
  memberDeviceType: input.deviceType,
19050
- outputField: "on",
19228
+ memberDeviceTypes: input.memberDeviceTypes ?? [input.deviceType],
19229
+ activeWhen: input.activeWhen,
19051
19230
  quantity: "none",
19052
19231
  baseUnit: void 0,
19053
19232
  aggregates: BINARY_AGGREGATES,
19054
19233
  defaultAggregate: "any",
19055
19234
  empty: "offline",
19056
- accept: [{
19057
- cap: "switch",
19058
- fieldPath: "on"
19059
- }],
19235
+ accept: [input.member],
19060
19236
  companions: [CHANGED]
19061
19237
  };
19062
19238
  }
@@ -46754,7 +46930,20 @@ var NcRuleInputSchema = object({
46754
46930
  * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
46755
46931
  * path does not run Zod defaults.
46756
46932
  */
46757
- groupingSec: number().int().min(5).max(60).optional()
46933
+ groupingSec: number().int().min(5).max(60).optional(),
46934
+ /**
46935
+ * ASK ME TO CONFIRM DETECTIONS (#243): a DETECTION notification of this rule
46936
+ * carries "Correct" / "Wrong" buttons (and, where the channel has room, a
46937
+ * "Wrong, it is a <class>" choice). A tap marks the track for retraining, the
46938
+ * same mark the Library writes, and records whose notification it was and
46939
+ * when. A channel with no buttons gets the same two choices as links.
46940
+ *
46941
+ * `.optional()`, never `.default()` (a Zod default does not run on the addon
46942
+ * cap path): absent and `false` both mean off, which is what every rule
46943
+ * authored before this field meant. An editor turns it off by writing
46944
+ * `false`, so it needs no `clear` key.
46945
+ */
46946
+ askVerdict: boolean().optional()
46758
46947
  });
46759
46948
  /**
46760
46949
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -58955,7 +59144,13 @@ results: array(object({
58955
59144
  /** Ms epoch of the attempt. */
58956
59145
  at: number()
58957
59146
  })) });
58958
- DeviceType.Switch, DeviceType.Light;
59147
+ DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
59148
+ object({
59149
+ active: boolean().meta({ label: "Active" }),
59150
+ /** Ms epoch when the slice was last updated. */
59151
+ lastChangedAt: number()
59152
+ });
59153
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Climate, DeviceType.Thermostat;
58959
59154
  object({
58960
59155
  /** Members whose current value entered the aggregate. */
58961
59156
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -58973,7 +59168,7 @@ object({
58973
59168
  label: "Members"
58974
59169
  }))
58975
59170
  });
58976
- DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
59171
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
58977
59172
  object({
58978
59173
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
58979
59174
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -59880,7 +60075,14 @@ DeviceType.Lock, method(object({
59880
60075
  auth: "protected"
59881
60076
  }), method(object({
59882
60077
  deviceId: number().int().nonnegative(),
59883
- code: string().min(1).optional()
60078
+ code: string().min(1).optional(),
60079
+ /**
60080
+ * Honoured by a helper lock GROUP only (D944): unlocking several doors
60081
+ * with one call is refused unless the caller says it was confirmed. A
60082
+ * single lock ignores it. The refusal lives in the callee, so no
60083
+ * automation or API caller reaches the doors by skipping a dialog.
60084
+ */
60085
+ confirm: boolean().optional()
59884
60086
  }), _void(), {
59885
60087
  kind: "mutation",
59886
60088
  auth: "protected"
@@ -64296,7 +64498,7 @@ object({
64296
64498
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
64297
64499
  lastChangedAt: number()
64298
64500
  });
64299
- DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
64501
+ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, method(object({
64300
64502
  deviceId: number(),
64301
64503
  on: boolean()
64302
64504
  }), _void(), {
@@ -65988,6 +66190,7 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
65988
66190
  kind: "mutation",
65989
66191
  auth: "admin"
65990
66192
  });
66193
+ DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
65991
66194
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
65992
66195
  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;
65993
66196
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
@@ -69363,6 +69566,13 @@ Object.freeze({
69363
69566
  access: "view",
69364
69567
  role: "viewer"
69365
69568
  },
69569
+ "groupActive.getStatus": {
69570
+ capName: "group-active",
69571
+ capScope: "device",
69572
+ addonId: null,
69573
+ access: "view",
69574
+ role: "viewer"
69575
+ },
69366
69576
  "groupCommands.getStatus": {
69367
69577
  capName: "group-commands",
69368
69578
  capScope: "device",
@@ -79238,6 +79448,10 @@ var SENSOR_CAP_VOCABULARY = {
79238
79448
  icon: "flame"
79239
79449
  }]
79240
79450
  },
79451
+ "group-active": {
79452
+ scope: "device",
79453
+ noun: t("Group state", "Stato del gruppo")
79454
+ },
79241
79455
  "group-commands": {
79242
79456
  scope: "device",
79243
79457
  noun: t("Group command", "Comando di gruppo")
@@ -80784,6 +80998,11 @@ Object.freeze({
80784
80998
  form: "single",
80785
80999
  optional: false
80786
81000
  }],
81001
+ "groupActive.getStatus": [{
81002
+ name: "deviceId",
81003
+ form: "single",
81004
+ optional: false
81005
+ }],
80787
81006
  "groupCommands.getStatus": [{
80788
81007
  name: "deviceId",
80789
81008
  form: "single",