@camstack/addon-training 0.1.89 → 0.1.91

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-1v53BmVJ.mjs → MotionZonesSettings-kbJlg0c5.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-B1WrMGZy.mjs → PrivacyMaskSettings-B3gzWS6Y.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-wJjFFoHA.mjs → SceneMonitorEditor-CjxaItjN.mjs} +1 -1
  4. package/dist/_stub.js +44495 -23332
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-3rzzcUyu.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cer78kD4.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DM1LS5rC.mjs +26 -0
  7. package/dist/{dist-CUYMVsX0.mjs → dist-B3Dz3xDZ.mjs} +273 -28
  8. package/dist/{dist-CnS9QrjX.js → dist-uLc6FQWF.js} +273 -28
  9. package/dist/{hostInit-DNFhB54Y.mjs → hostInit-C-l48gwp.mjs} +2 -2
  10. package/dist/{icons-DGnDNIHD.mjs → icons-BQdiqxUM.mjs} +1482 -1509
  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-BvnJqnez.mjs → player-overlays-DrA4TUe3.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-Dfx762zU.mjs → responsive-C46lpRSX.mjs} +1 -1
  19. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-tkZ3pY5a.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qVIpiQZD.mjs} +1 -1
  20. package/dist/{zoom-out-DzQMgNQw.mjs → zoom-out-YWRm0VbK.mjs} +38 -11
  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-VNxr7qQe.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-bykKrTgu.mjs
5611
+ //#region ../types/dist/sleep-0sD_LHLI.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).
@@ -9000,6 +9000,7 @@ var CAP_NAMES = Object.freeze([
9000
9000
  "login-method",
9001
9001
  "media-player",
9002
9002
  "mesh-network",
9003
+ "meter",
9003
9004
  "metrics-provider",
9004
9005
  "model-convert",
9005
9006
  "model-distributor",
@@ -10057,6 +10058,10 @@ Object.freeze({
10057
10058
  ]
10058
10059
  }
10059
10060
  ],
10061
+ "meter": [{
10062
+ "path": "value",
10063
+ "valueType": "number"
10064
+ }],
10060
10065
  "motion": [
10061
10066
  {
10062
10067
  "path": "detected",
@@ -10800,7 +10805,7 @@ object({
10800
10805
  params: record(string(), union([string(), number()])).optional()
10801
10806
  });
10802
10807
  //#endregion
10803
- //#region ../types/dist/err-msg-BXKzRBwg.mjs
10808
+ //#region ../types/dist/err-msg-DIorGYeC.mjs
10804
10809
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
10805
10810
  DeviceType["Camera"] = "camera";
10806
10811
  DeviceType["Hub"] = "hub";
@@ -10894,8 +10899,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
10894
10899
  DeviceType["PetFeeder"] = "pet-feeder";
10895
10900
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
10896
10901
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
10897
- * Sources: native Bosch Home Connect, reusable by similar integrations. */
10902
+ * Sources: native Bosch Home Connect, reusable by similar integrations.
10903
+ * A plug-built dishwasher carries running-state and power instead. */
10898
10904
  DeviceType["Dishwasher"] = "dishwasher";
10905
+ /** Washing machine. A plug-built one is running while its power stays
10906
+ * above a threshold. No program cap — that surface is the dishwasher's. */
10907
+ DeviceType["Washer"] = "washer";
10908
+ /** Tumble dryer. Same plug-built running surface as {@link Washer}. */
10909
+ DeviceType["Dryer"] = "dryer";
10899
10910
  return DeviceType;
10900
10911
  }({});
10901
10912
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -11143,7 +11154,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11143
11154
  return DeviceRole;
11144
11155
  }({});
11145
11156
  //#endregion
11146
- //#region ../types/dist/composition-OhpuespA.mjs
11157
+ //#region ../types/dist/composition-CpETZ4HL.mjs
11147
11158
  /**
11148
11159
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11149
11160
  *
@@ -11899,6 +11910,97 @@ function validateExpressionSource(src) {
11899
11910
  return null;
11900
11911
  }
11901
11912
  /**
11913
+ * One power reading becomes a washer, dryer or dishwasher (D944 helper).
11914
+ *
11915
+ * Standby of the control board is under 5 W; a motor or a heater is far
11916
+ * above that, so 5 W is the line. A door lock or a short pump spike is not
11917
+ * a cycle, so running starts only after 30 s above the line.
11918
+ *
11919
+ * A wash, dry or dishwasher pause (soak, heat-wait, heater off between
11920
+ * bursts) lasts several minutes. Ending the cycle on the first dip would
11921
+ * report "finished" in the middle of the program, so the stop dwell is
11922
+ * 10 minutes on every type. The number is stored per type so one machine
11923
+ * can move later without moving the others.
11924
+ */
11925
+ var APPLIANCE_TEMPLATE_ID = "appliance";
11926
+ var APPLIANCE_KINDS = [
11927
+ "washer",
11928
+ "dryer",
11929
+ "dishwasher"
11930
+ ];
11931
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
11932
+ /**
11933
+ * Statistics and integrals over a history read (D944).
11934
+ *
11935
+ * Pure: the same points always give the same answer, so a restart recomputes
11936
+ * rather than trusting a buffer. A gauge mean is time-weighted (value × ms),
11937
+ * never the mean of the samples. A hole with no held value is not integrated
11938
+ * as zero. A truncated read is not published.
11939
+ */
11940
+ var STATISTIC_STATS = [
11941
+ "min",
11942
+ "max",
11943
+ "mean",
11944
+ "sum",
11945
+ "count",
11946
+ "change"
11947
+ ];
11948
+ /**
11949
+ * The range a statistics or integral helper asks history for (D944).
11950
+ *
11951
+ * Calendar edges are the hub's timezone, never UTC midnight: a day is 23, 24
11952
+ * or 25 hours across a DST change. A tier is eligible only when its retention
11953
+ * is strictly longer than the longest that range can be. Forever qualifies.
11954
+ * Equal to a tier's retention is a refusal, not a short answer.
11955
+ */
11956
+ var MINUTE_MS = 6e4;
11957
+ var HOUR_MS = 60 * MINUTE_MS;
11958
+ var DAY_MS = 24 * HOUR_MS;
11959
+ var ROLLING_SPANS = [
11960
+ "1h",
11961
+ "24h",
11962
+ "2d",
11963
+ "7d",
11964
+ "30d",
11965
+ "custom"
11966
+ ];
11967
+ var CALENDAR_PERIODS = [
11968
+ "today",
11969
+ "yesterday",
11970
+ "this-week",
11971
+ "this-month"
11972
+ ];
11973
+ var RESET_PERIODS = [
11974
+ "never",
11975
+ "daily",
11976
+ "weekly",
11977
+ "monthly"
11978
+ ];
11979
+ 5 * MINUTE_MS;
11980
+ 24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
11981
+ 7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
11982
+ var StatisticWindowSchema = discriminatedUnion("kind", [object({
11983
+ kind: literal("rolling"),
11984
+ span: _enum(ROLLING_SPANS),
11985
+ customMinutes: number().int().min(5).optional()
11986
+ }).check((payload) => {
11987
+ if (payload.value.span === "custom" && payload.value.customMinutes === void 0) payload.issues.push({
11988
+ code: "custom",
11989
+ message: "a custom range needs a duration in minutes",
11990
+ path: ["customMinutes"],
11991
+ input: payload.value
11992
+ });
11993
+ if (payload.value.span !== "custom" && payload.value.customMinutes !== void 0) payload.issues.push({
11994
+ code: "custom",
11995
+ message: "only a custom range carries a duration",
11996
+ path: ["customMinutes"],
11997
+ input: payload.value
11998
+ });
11999
+ }), object({
12000
+ kind: literal("calendar"),
12001
+ period: _enum(CALENDAR_PERIODS)
12002
+ })]);
12003
+ /**
11902
12004
  * A composition source identity: `(addonId, stableId)`, never a numeric device
11903
12005
  * id. Split out so helper schemas can name it without a cycle through
11904
12006
  * `composition.ts` (D659).
@@ -11954,14 +12056,37 @@ var HelperMemberSchema = object({
11954
12056
  cap: string().min(1),
11955
12057
  fieldPath: string().min(1)
11956
12058
  });
11957
- var HelperSpecSchema = discriminatedUnion("kind", [object({
11958
- kind: literal("group"),
11959
- templateId: GroupTemplateIdSchema,
11960
- aggregate: AggregateReducerSchema,
11961
- members: array(HelperMemberSchema).min(1).max(64),
11962
- /** Actuator groups only. Readings leave this unset. */
11963
- active: ActiveCriterionSchema.optional()
11964
- })]);
12059
+ var HelperSpecSchema = discriminatedUnion("kind", [
12060
+ object({
12061
+ kind: literal("group"),
12062
+ templateId: GroupTemplateIdSchema,
12063
+ aggregate: AggregateReducerSchema,
12064
+ members: array(HelperMemberSchema).min(1).max(64),
12065
+ /** Actuator groups only. Readings leave this unset. */
12066
+ active: ActiveCriterionSchema.optional()
12067
+ }),
12068
+ object({
12069
+ kind: literal("appliance"),
12070
+ templateId: literal(APPLIANCE_TEMPLATE_ID),
12071
+ appliance: _enum(APPLIANCE_KINDS),
12072
+ thresholdWatts: number().positive(),
12073
+ startDwellMs: number().int().nonnegative(),
12074
+ stopDwellMs: number().int().nonnegative(),
12075
+ member: HelperMemberSchema
12076
+ }),
12077
+ object({
12078
+ kind: literal("statistic"),
12079
+ stat: _enum(STATISTIC_STATS),
12080
+ window: StatisticWindowSchema,
12081
+ source: HelperMemberSchema
12082
+ }),
12083
+ object({
12084
+ kind: literal("integral"),
12085
+ reset: _enum(RESET_PERIODS),
12086
+ output: _enum(["energy", "meter"]),
12087
+ source: HelperMemberSchema
12088
+ })
12089
+ ]);
11965
12090
  /** A composed device's stableId is this prefix plus the block id. */
11966
12091
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
11967
12092
  /** Longest snippet a `code` source may carry (slice 4). */
@@ -12035,6 +12160,26 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
12035
12160
  "omit",
12036
12161
  "offline"
12037
12162
  ])
12163
+ }),
12164
+ object({
12165
+ kind: literal("series"),
12166
+ read: CompositionFieldReadSchema,
12167
+ /** `value` is the statistic or the integral. The others are the gap counts. */
12168
+ publish: _enum([
12169
+ "value",
12170
+ "included",
12171
+ "excluded",
12172
+ "total"
12173
+ ]),
12174
+ /**
12175
+ * What an unanswered `value` does. Counts ignore this. `offline` leaves the
12176
+ * device unseeded until history answers, so a restart cannot publish 0.
12177
+ */
12178
+ empty: _enum([
12179
+ "null",
12180
+ "omit",
12181
+ "offline"
12182
+ ])
12038
12183
  })
12039
12184
  ]);
12040
12185
  var CompositionCommandTargetSchema = discriminatedUnion("kind", [object({
@@ -18228,7 +18373,8 @@ var CompositionProblemSchema = object({
18228
18373
  "native-capability-replace",
18229
18374
  "mixed-quantity",
18230
18375
  "helper-mismatch",
18231
- "member-constraint"
18376
+ "member-constraint",
18377
+ "retention"
18232
18378
  ]),
18233
18379
  path: string(),
18234
18380
  message: string()
@@ -18468,7 +18614,7 @@ Object.freeze({
18468
18614
  * One catalog row per base reading a group helper can build (D944 §3).
18469
18615
  * Data, not a form default written into the block.
18470
18616
  */
18471
- var NOW = {
18617
+ var NOW$1 = {
18472
18618
  fieldPath: "lastFetchedAt",
18473
18619
  expr: "now"
18474
18620
  };
@@ -18514,7 +18660,7 @@ var GROUP_TEMPLATES = [
18514
18660
  quantity: "temperature",
18515
18661
  defaultAggregate: "mean",
18516
18662
  empty: "null",
18517
- companions: [NOW]
18663
+ companions: [NOW$1]
18518
18664
  }),
18519
18665
  numeric({
18520
18666
  id: "humidity",
@@ -18525,7 +18671,7 @@ var GROUP_TEMPLATES = [
18525
18671
  quantity: "humidity",
18526
18672
  defaultAggregate: "mean",
18527
18673
  empty: "null",
18528
- companions: [NOW]
18674
+ companions: [NOW$1]
18529
18675
  }),
18530
18676
  numeric({
18531
18677
  id: "pressure",
@@ -18536,7 +18682,7 @@ var GROUP_TEMPLATES = [
18536
18682
  quantity: "pressure",
18537
18683
  defaultAggregate: "mean",
18538
18684
  empty: "null",
18539
- companions: [NOW]
18685
+ companions: [NOW$1]
18540
18686
  }),
18541
18687
  numeric({
18542
18688
  id: "illuminance",
@@ -18547,7 +18693,7 @@ var GROUP_TEMPLATES = [
18547
18693
  quantity: "illuminance",
18548
18694
  defaultAggregate: "mean",
18549
18695
  empty: "null",
18550
- companions: [NOW]
18696
+ companions: [NOW$1]
18551
18697
  }),
18552
18698
  numeric({
18553
18699
  id: "power",
@@ -18558,7 +18704,7 @@ var GROUP_TEMPLATES = [
18558
18704
  quantity: "power",
18559
18705
  defaultAggregate: "sum",
18560
18706
  empty: "omit",
18561
- companions: [NOW]
18707
+ companions: [NOW$1]
18562
18708
  }),
18563
18709
  numeric({
18564
18710
  id: "energy",
@@ -18569,7 +18715,7 @@ var GROUP_TEMPLATES = [
18569
18715
  quantity: "energy",
18570
18716
  defaultAggregate: "sum",
18571
18717
  empty: "omit",
18572
- companions: [NOW]
18718
+ companions: [NOW$1]
18573
18719
  }),
18574
18720
  numeric({
18575
18721
  id: "battery",
@@ -18604,7 +18750,7 @@ var GROUP_TEMPLATES = [
18604
18750
  quantity: "device",
18605
18751
  defaultAggregate: "mean",
18606
18752
  empty: "null",
18607
- companions: [NOW]
18753
+ companions: [NOW$1]
18608
18754
  }),
18609
18755
  binary({
18610
18756
  id: "motion",
@@ -18733,6 +18879,7 @@ function actuator(input) {
18733
18879
  }
18734
18880
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
18735
18881
  DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
18882
+ DeviceType.Camera;
18736
18883
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
18737
18884
  /**
18738
18885
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -59524,6 +59671,11 @@ DeviceType.Lock, method(object({
59524
59671
  kind: "mutation",
59525
59672
  auth: "protected"
59526
59673
  });
59674
+ object({
59675
+ value: number().nullable().meta(readingMeta("device", { label: "Total" })),
59676
+ lastFetchedAt: number()
59677
+ });
59678
+ DeviceType.Sensor;
59527
59679
  /**
59528
59680
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
59529
59681
  * Apple TV, Spotify, Roku, generic OTT receivers, …) on
@@ -61441,7 +61593,7 @@ object({
61441
61593
  /** Ms epoch when the slice was last updated. */
61442
61594
  lastFetchedAt: number()
61443
61595
  });
61444
- DeviceType.Sensor;
61596
+ DeviceType.Sensor, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
61445
61597
  /**
61446
61598
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
61447
61599
  * on `DeviceType.Presence`. Read-only — no setters: presence is
@@ -61888,7 +62040,7 @@ object({
61888
62040
  phase: string().nullable()
61889
62041
  });
61890
62042
  Object.values(DeviceType);
61891
- DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
62043
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
61892
62044
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
61893
62045
  kind: "mutation",
61894
62046
  auth: "admin"
@@ -65722,7 +65874,7 @@ var trainingCapability = {
65722
65874
  }
65723
65875
  };
65724
65876
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
65725
- 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.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
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;
65726
65878
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
65727
65879
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
65728
65880
  new Set(CAP_NAMES);
@@ -65775,7 +65927,7 @@ var AccessoryKind = {
65775
65927
  PrivacyMask: DeviceRole.PrivacyMask
65776
65928
  };
65777
65929
  AccessoryKind.Siren, AccessoryKind.Floodlight, AccessoryKind.Spotlight, AccessoryKind.PirSensor, AccessoryKind.Chime, AccessoryKind.Autotrack, AccessoryKind.Nightvision, AccessoryKind.PrivacyMask;
65778
- DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
65930
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, 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;
65779
65931
  new Set(Object.values(DeviceType));
65780
65932
  Object.freeze({
65781
65933
  "accessories.getStatus": {
@@ -69964,6 +70116,13 @@ Object.freeze({
69964
70116
  access: "create",
69965
70117
  role: "admin"
69966
70118
  },
70119
+ "meter.getStatus": {
70120
+ capName: "meter",
70121
+ capScope: "device",
70122
+ addonId: null,
70123
+ access: "view",
70124
+ role: "viewer"
70125
+ },
69967
70126
  "metricsProvider.collectSnapshot": {
69968
70127
  capName: "metrics-provider",
69969
70128
  capScope: "system",
@@ -78062,7 +78221,39 @@ var APPLIANCE_CAP_VOCABULARY = {
78062
78221
  phrase: t("When {device} finishes", "Quando {device} finisce"),
78063
78222
  icon: "square"
78064
78223
  }
78065
- }
78224
+ },
78225
+ overrides: { byType: {
78226
+ [DeviceType.Washer]: {
78227
+ state: { running: {
78228
+ whenTrue: t("When the washing machine starts", "Quando la lavatrice inizia"),
78229
+ whenFalse: t("When the washing machine has finished", "Quando la lavatrice ha finito")
78230
+ } },
78231
+ events: {
78232
+ onStarted: { phrase: t("When the washing machine starts", "Quando la lavatrice inizia") },
78233
+ onFinished: { phrase: t("When the washing machine has finished", "Quando la lavatrice ha finito") }
78234
+ }
78235
+ },
78236
+ [DeviceType.Dryer]: {
78237
+ state: { running: {
78238
+ whenTrue: t("When the dryer starts", "Quando l'asciugatrice inizia"),
78239
+ whenFalse: t("When the dryer has finished", "Quando l'asciugatrice ha finito")
78240
+ } },
78241
+ events: {
78242
+ onStarted: { phrase: t("When the dryer starts", "Quando l'asciugatrice inizia") },
78243
+ onFinished: { phrase: t("When the dryer has finished", "Quando l'asciugatrice ha finito") }
78244
+ }
78245
+ },
78246
+ [DeviceType.Dishwasher]: {
78247
+ state: { running: {
78248
+ whenTrue: t("When the dishwasher starts", "Quando la lavastoviglie inizia"),
78249
+ whenFalse: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito")
78250
+ } },
78251
+ events: {
78252
+ onStarted: { phrase: t("When the dishwasher starts", "Quando la lavastoviglie inizia") },
78253
+ onFinished: { phrase: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito") }
78254
+ }
78255
+ }
78256
+ } }
78066
78257
  },
78067
78258
  update: {
78068
78259
  scope: "device",
@@ -78890,6 +79081,17 @@ var SENSOR_CAP_VOCABULARY = {
78890
79081
  }],
78891
79082
  events: { onMotionChanged: { notOperatorFacing: "the `detected` state trigger phrases both edges, from the mirror that survives a dropped event (D49)" } }
78892
79083
  },
79084
+ meter: {
79085
+ scope: "device",
79086
+ noun: t("Meter", "Contatore"),
79087
+ state: [{
79088
+ kind: "numeric",
79089
+ field: "value",
79090
+ quantity: t("the total", "il totale"),
79091
+ label: t("Total", "Totale"),
79092
+ icon: "gauge"
79093
+ }]
79094
+ },
78893
79095
  "numeric-sensor": {
78894
79096
  scope: "device",
78895
79097
  noun: t("Sensor", "Sensore"),
@@ -79362,8 +79564,47 @@ function projectAction(cap, action) {
79362
79564
  };
79363
79565
  }
79364
79566
  Object.entries(CAP_VOCABULARY_BY_NAME).flatMap(([cap, entry]) => entry.scope === "device" ? (entry.actions ?? []).map((a) => projectAction(cap, a)) : []);
79365
- 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;
79567
+ 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;
79366
79568
  DeviceFeature.BatteryOperated;
79569
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
79570
+ var HA_AS = "a power sensor (device_class power). Home Assistant has no laundry domain. running-state stays unexported until a null reading can be published as unavailable.";
79571
+ var HOMEKIT_REASON = "HomeKit has no laundry-appliance service. The export tab would pair an accessory with nothing on it: running-state is withheld until a null reading can be unavailable, and power is not a HomeKit service this export honours.";
79572
+ var ALEXA_REASON = "Alexa has no laundry category in this export, and neither power nor running has an Alexa interface.";
79573
+ var GOOGLE_REASON = "Google WASHER, DRYER and DISHWASHER require RunCycle. A power threshold is not that trait, and this export does not publish RunCycle.";
79574
+ var MATTER_REASON = "No Matter export is built. The closest device types are Laundry Washer (0x0073) and Laundry Dryer (0x0074); a power threshold is not the Laundry Washer Mode cluster.";
79575
+ function withheld(reason) {
79576
+ return {
79577
+ [DeviceType.Washer]: {
79578
+ exported: false,
79579
+ reason
79580
+ },
79581
+ [DeviceType.Dryer]: {
79582
+ exported: false,
79583
+ reason
79584
+ },
79585
+ [DeviceType.Dishwasher]: {
79586
+ exported: false,
79587
+ reason
79588
+ }
79589
+ };
79590
+ }
79591
+ function offered(received) {
79592
+ return {
79593
+ [DeviceType.Washer]: {
79594
+ exported: true,
79595
+ as: received
79596
+ },
79597
+ [DeviceType.Dryer]: {
79598
+ exported: true,
79599
+ as: received
79600
+ },
79601
+ [DeviceType.Dishwasher]: {
79602
+ exported: true,
79603
+ as: received
79604
+ }
79605
+ };
79606
+ }
79607
+ offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
79367
79608
  Object.freeze({
79368
79609
  "accessories.getStatus": [{
79369
79610
  name: "deviceId",
@@ -80540,6 +80781,11 @@ Object.freeze({
80540
80781
  form: "single",
80541
80782
  optional: false
80542
80783
  }],
80784
+ "meter.getStatus": [{
80785
+ name: "deviceId",
80786
+ form: "single",
80787
+ optional: false
80788
+ }],
80543
80789
  "motion.getStatus": [{
80544
80790
  name: "deviceId",
80545
80791
  form: "single",
@@ -82147,7 +82393,6 @@ Object.freeze({
82147
82393
  "network-access": "ingress",
82148
82394
  "smtp-provider": "email"
82149
82395
  });
82150
- DeviceType.Camera;
82151
82396
  /**
82152
82397
  * A saved Customize assignment (D936). The schema is the type: callers use
82153
82398
  * `z.infer`, they do not restate the shape.
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.419",
39
+ version: "1.2.422",
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.332",
84
+ version: "1.2.334",
85
85
  scope: "default",
86
86
  shareConfig: {
87
87
  singleton: !0,