@camstack/addon-post-analysis 1.2.639 → 1.2.641

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 (15) hide show
  1. package/dist/{clip-model-registry-B-Dv5y3Z.mjs → clip-model-registry-Cw7Iy7Qi.mjs} +315 -28
  2. package/dist/{clip-model-registry-DEcrrqRz.js → clip-model-registry-Qr0XipkX.js} +315 -28
  3. package/dist/embedding-encoder/index.js +1 -1
  4. package/dist/embedding-encoder/index.mjs +1 -1
  5. package/dist/pipeline-analytics/_stub.js +2 -2
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DRZLmZDb.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Cct0TMzC.mjs} +2 -2
  7. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-_TUthUZh.mjs +26 -0
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CuNXxDlT.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-B07ueo2X.mjs → hostInit-B9c2FowI.mjs} +2 -2
  10. package/dist/pipeline-analytics/index.js +118 -23
  11. package/dist/pipeline-analytics/index.mjs +118 -23
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +1 -1
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D4TYbuPV.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Cc4lAtK3.mjs +0 -26
@@ -5640,7 +5640,7 @@ var ZodIssueCode = {
5640
5640
  var ZodFirstPartyTypeKind;
5641
5641
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5642
5642
  //#endregion
5643
- //#region ../types/dist/sleep-bykKrTgu.mjs
5643
+ //#region ../types/dist/sleep-0sD_LHLI.mjs
5644
5644
  /**
5645
5645
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5646
5646
  * window to float samples (D455).
@@ -9083,6 +9083,7 @@ var CAP_NAMES = Object.freeze([
9083
9083
  "login-method",
9084
9084
  "media-player",
9085
9085
  "mesh-network",
9086
+ "meter",
9086
9087
  "metrics-provider",
9087
9088
  "model-convert",
9088
9089
  "model-distributor",
@@ -10140,6 +10141,10 @@ Object.freeze({
10140
10141
  ]
10141
10142
  }
10142
10143
  ],
10144
+ "meter": [{
10145
+ "path": "value",
10146
+ "valueType": "number"
10147
+ }],
10143
10148
  "motion": [
10144
10149
  {
10145
10150
  "path": "detected",
@@ -10885,7 +10890,7 @@ Object.freeze({
10885
10890
  * can answer "may a rule actuate this?" without importing the schema barrel
10886
10891
  * (~144MB RSS per runner, D28).
10887
10892
  *
10888
- * Coverage: 93 device-scoped capabilities.
10893
+ * Coverage: 94 device-scoped capabilities.
10889
10894
  */
10890
10895
  var DEVICE_SCOPED_CAPS = new Set([
10891
10896
  "accessories",
@@ -10937,6 +10942,7 @@ var DEVICE_SCOPED_CAPS = new Set([
10937
10942
  "lawn-mower-control",
10938
10943
  "lock-control",
10939
10944
  "media-player",
10945
+ "meter",
10940
10946
  "motion",
10941
10947
  "motion-detection",
10942
10948
  "motion-trigger",
@@ -11026,7 +11032,7 @@ function sleep(ms) {
11026
11032
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
11027
11033
  }
11028
11034
  //#endregion
11029
- //#region ../types/dist/err-msg-BXKzRBwg.mjs
11035
+ //#region ../types/dist/err-msg-DIorGYeC.mjs
11030
11036
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
11031
11037
  DeviceType["Camera"] = "camera";
11032
11038
  DeviceType["Hub"] = "hub";
@@ -11120,8 +11126,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
11120
11126
  DeviceType["PetFeeder"] = "pet-feeder";
11121
11127
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
11122
11128
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
11123
- * Sources: native Bosch Home Connect, reusable by similar integrations. */
11129
+ * Sources: native Bosch Home Connect, reusable by similar integrations.
11130
+ * A plug-built dishwasher carries running-state and power instead. */
11124
11131
  DeviceType["Dishwasher"] = "dishwasher";
11132
+ /** Washing machine. A plug-built one is running while its power stays
11133
+ * above a threshold. No program cap — that surface is the dishwasher's. */
11134
+ DeviceType["Washer"] = "washer";
11135
+ /** Tumble dryer. Same plug-built running surface as {@link Washer}. */
11136
+ DeviceType["Dryer"] = "dryer";
11125
11137
  return DeviceType;
11126
11138
  }({});
11127
11139
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -11379,7 +11391,7 @@ function errMsg(err) {
11379
11391
  return String(err);
11380
11392
  }
11381
11393
  //#endregion
11382
- //#region ../types/dist/composition-OhpuespA.mjs
11394
+ //#region ../types/dist/composition-CpETZ4HL.mjs
11383
11395
  /**
11384
11396
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
11385
11397
  * canonical form sorts object keys alphabetically at every depth so two
@@ -12295,6 +12307,97 @@ function validateExpressionSource(src) {
12295
12307
  return null;
12296
12308
  }
12297
12309
  /**
12310
+ * One power reading becomes a washer, dryer or dishwasher (D944 helper).
12311
+ *
12312
+ * Standby of the control board is under 5 W; a motor or a heater is far
12313
+ * above that, so 5 W is the line. A door lock or a short pump spike is not
12314
+ * a cycle, so running starts only after 30 s above the line.
12315
+ *
12316
+ * A wash, dry or dishwasher pause (soak, heat-wait, heater off between
12317
+ * bursts) lasts several minutes. Ending the cycle on the first dip would
12318
+ * report "finished" in the middle of the program, so the stop dwell is
12319
+ * 10 minutes on every type. The number is stored per type so one machine
12320
+ * can move later without moving the others.
12321
+ */
12322
+ var APPLIANCE_TEMPLATE_ID = "appliance";
12323
+ var APPLIANCE_KINDS = [
12324
+ "washer",
12325
+ "dryer",
12326
+ "dishwasher"
12327
+ ];
12328
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
12329
+ /**
12330
+ * Statistics and integrals over a history read (D944).
12331
+ *
12332
+ * Pure: the same points always give the same answer, so a restart recomputes
12333
+ * rather than trusting a buffer. A gauge mean is time-weighted (value × ms),
12334
+ * never the mean of the samples. A hole with no held value is not integrated
12335
+ * as zero. A truncated read is not published.
12336
+ */
12337
+ var STATISTIC_STATS = [
12338
+ "min",
12339
+ "max",
12340
+ "mean",
12341
+ "sum",
12342
+ "count",
12343
+ "change"
12344
+ ];
12345
+ /**
12346
+ * The range a statistics or integral helper asks history for (D944).
12347
+ *
12348
+ * Calendar edges are the hub's timezone, never UTC midnight: a day is 23, 24
12349
+ * or 25 hours across a DST change. A tier is eligible only when its retention
12350
+ * is strictly longer than the longest that range can be. Forever qualifies.
12351
+ * Equal to a tier's retention is a refusal, not a short answer.
12352
+ */
12353
+ var MINUTE_MS = 6e4;
12354
+ var HOUR_MS = 60 * MINUTE_MS;
12355
+ var DAY_MS = 24 * HOUR_MS;
12356
+ var ROLLING_SPANS = [
12357
+ "1h",
12358
+ "24h",
12359
+ "2d",
12360
+ "7d",
12361
+ "30d",
12362
+ "custom"
12363
+ ];
12364
+ var CALENDAR_PERIODS = [
12365
+ "today",
12366
+ "yesterday",
12367
+ "this-week",
12368
+ "this-month"
12369
+ ];
12370
+ var RESET_PERIODS = [
12371
+ "never",
12372
+ "daily",
12373
+ "weekly",
12374
+ "monthly"
12375
+ ];
12376
+ 5 * MINUTE_MS;
12377
+ 24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
12378
+ 7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
12379
+ var StatisticWindowSchema = discriminatedUnion("kind", [object({
12380
+ kind: literal("rolling"),
12381
+ span: _enum(ROLLING_SPANS),
12382
+ customMinutes: number().int().min(5).optional()
12383
+ }).check((payload) => {
12384
+ if (payload.value.span === "custom" && payload.value.customMinutes === void 0) payload.issues.push({
12385
+ code: "custom",
12386
+ message: "a custom range needs a duration in minutes",
12387
+ path: ["customMinutes"],
12388
+ input: payload.value
12389
+ });
12390
+ if (payload.value.span !== "custom" && payload.value.customMinutes !== void 0) payload.issues.push({
12391
+ code: "custom",
12392
+ message: "only a custom range carries a duration",
12393
+ path: ["customMinutes"],
12394
+ input: payload.value
12395
+ });
12396
+ }), object({
12397
+ kind: literal("calendar"),
12398
+ period: _enum(CALENDAR_PERIODS)
12399
+ })]);
12400
+ /**
12298
12401
  * A composition source identity: `(addonId, stableId)`, never a numeric device
12299
12402
  * id. Split out so helper schemas can name it without a cycle through
12300
12403
  * `composition.ts` (D659).
@@ -12350,14 +12453,37 @@ var HelperMemberSchema = object({
12350
12453
  cap: string().min(1),
12351
12454
  fieldPath: string().min(1)
12352
12455
  });
12353
- var HelperSpecSchema = discriminatedUnion("kind", [object({
12354
- kind: literal("group"),
12355
- templateId: GroupTemplateIdSchema,
12356
- aggregate: AggregateReducerSchema,
12357
- members: array(HelperMemberSchema).min(1).max(64),
12358
- /** Actuator groups only. Readings leave this unset. */
12359
- active: ActiveCriterionSchema.optional()
12360
- })]);
12456
+ var HelperSpecSchema = discriminatedUnion("kind", [
12457
+ object({
12458
+ kind: literal("group"),
12459
+ templateId: GroupTemplateIdSchema,
12460
+ aggregate: AggregateReducerSchema,
12461
+ members: array(HelperMemberSchema).min(1).max(64),
12462
+ /** Actuator groups only. Readings leave this unset. */
12463
+ active: ActiveCriterionSchema.optional()
12464
+ }),
12465
+ object({
12466
+ kind: literal("appliance"),
12467
+ templateId: literal(APPLIANCE_TEMPLATE_ID),
12468
+ appliance: _enum(APPLIANCE_KINDS),
12469
+ thresholdWatts: number().positive(),
12470
+ startDwellMs: number().int().nonnegative(),
12471
+ stopDwellMs: number().int().nonnegative(),
12472
+ member: HelperMemberSchema
12473
+ }),
12474
+ object({
12475
+ kind: literal("statistic"),
12476
+ stat: _enum(STATISTIC_STATS),
12477
+ window: StatisticWindowSchema,
12478
+ source: HelperMemberSchema
12479
+ }),
12480
+ object({
12481
+ kind: literal("integral"),
12482
+ reset: _enum(RESET_PERIODS),
12483
+ output: _enum(["energy", "meter"]),
12484
+ source: HelperMemberSchema
12485
+ })
12486
+ ]);
12361
12487
  /** A composed device's stableId is this prefix plus the block id. */
12362
12488
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
12363
12489
  /** Longest snippet a `code` source may carry (slice 4). */
@@ -12431,6 +12557,26 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
12431
12557
  "omit",
12432
12558
  "offline"
12433
12559
  ])
12560
+ }),
12561
+ object({
12562
+ kind: literal("series"),
12563
+ read: CompositionFieldReadSchema,
12564
+ /** `value` is the statistic or the integral. The others are the gap counts. */
12565
+ publish: _enum([
12566
+ "value",
12567
+ "included",
12568
+ "excluded",
12569
+ "total"
12570
+ ]),
12571
+ /**
12572
+ * What an unanswered `value` does. Counts ignore this. `offline` leaves the
12573
+ * device unseeded until history answers, so a restart cannot publish 0.
12574
+ */
12575
+ empty: _enum([
12576
+ "null",
12577
+ "omit",
12578
+ "offline"
12579
+ ])
12434
12580
  })
12435
12581
  ]);
12436
12582
  var CompositionCommandTargetSchema = discriminatedUnion("kind", [object({
@@ -19478,7 +19624,8 @@ var CompositionProblemSchema = object({
19478
19624
  "native-capability-replace",
19479
19625
  "mixed-quantity",
19480
19626
  "helper-mismatch",
19481
- "member-constraint"
19627
+ "member-constraint",
19628
+ "retention"
19482
19629
  ]),
19483
19630
  path: string(),
19484
19631
  message: string()
@@ -19718,7 +19865,7 @@ Object.freeze({
19718
19865
  * One catalog row per base reading a group helper can build (D944 §3).
19719
19866
  * Data, not a form default written into the block.
19720
19867
  */
19721
- var NOW = {
19868
+ var NOW$1 = {
19722
19869
  fieldPath: "lastFetchedAt",
19723
19870
  expr: "now"
19724
19871
  };
@@ -19764,7 +19911,7 @@ var GROUP_TEMPLATES = [
19764
19911
  quantity: "temperature",
19765
19912
  defaultAggregate: "mean",
19766
19913
  empty: "null",
19767
- companions: [NOW]
19914
+ companions: [NOW$1]
19768
19915
  }),
19769
19916
  numeric({
19770
19917
  id: "humidity",
@@ -19775,7 +19922,7 @@ var GROUP_TEMPLATES = [
19775
19922
  quantity: "humidity",
19776
19923
  defaultAggregate: "mean",
19777
19924
  empty: "null",
19778
- companions: [NOW]
19925
+ companions: [NOW$1]
19779
19926
  }),
19780
19927
  numeric({
19781
19928
  id: "pressure",
@@ -19786,7 +19933,7 @@ var GROUP_TEMPLATES = [
19786
19933
  quantity: "pressure",
19787
19934
  defaultAggregate: "mean",
19788
19935
  empty: "null",
19789
- companions: [NOW]
19936
+ companions: [NOW$1]
19790
19937
  }),
19791
19938
  numeric({
19792
19939
  id: "illuminance",
@@ -19797,7 +19944,7 @@ var GROUP_TEMPLATES = [
19797
19944
  quantity: "illuminance",
19798
19945
  defaultAggregate: "mean",
19799
19946
  empty: "null",
19800
- companions: [NOW]
19947
+ companions: [NOW$1]
19801
19948
  }),
19802
19949
  numeric({
19803
19950
  id: "power",
@@ -19808,7 +19955,7 @@ var GROUP_TEMPLATES = [
19808
19955
  quantity: "power",
19809
19956
  defaultAggregate: "sum",
19810
19957
  empty: "omit",
19811
- companions: [NOW]
19958
+ companions: [NOW$1]
19812
19959
  }),
19813
19960
  numeric({
19814
19961
  id: "energy",
@@ -19819,7 +19966,7 @@ var GROUP_TEMPLATES = [
19819
19966
  quantity: "energy",
19820
19967
  defaultAggregate: "sum",
19821
19968
  empty: "omit",
19822
- companions: [NOW]
19969
+ companions: [NOW$1]
19823
19970
  }),
19824
19971
  numeric({
19825
19972
  id: "battery",
@@ -19854,7 +20001,7 @@ var GROUP_TEMPLATES = [
19854
20001
  quantity: "device",
19855
20002
  defaultAggregate: "mean",
19856
20003
  empty: "null",
19857
- companions: [NOW]
20004
+ companions: [NOW$1]
19858
20005
  }),
19859
20006
  binary({
19860
20007
  id: "motion",
@@ -19983,6 +20130,7 @@ function actuator(input) {
19983
20130
  }
19984
20131
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
19985
20132
  DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
20133
+ DeviceType.Camera;
19986
20134
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
19987
20135
  /**
19988
20136
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -64945,6 +65093,44 @@ var lockControlCapability = {
64945
65093
  volatileStateFields: ["lastChangedAt"]
64946
65094
  };
64947
65095
  /**
65096
+ * A monotonic total between resets (D944). Energy uses `power-meter.kwhTotal`
65097
+ * so dashboards keep one series; every other instantaneous reading lands here.
65098
+ * `value` is the time integral in the source quantity's accumulated base
65099
+ * (base-unit seconds, or kWh on the power meter). `null` is a gap, never zero.
65100
+ */
65101
+ var MeterStatusSchema = object({
65102
+ value: number().nullable().meta(readingMeta("device", { label: "Total" })),
65103
+ lastFetchedAt: number()
65104
+ });
65105
+ var meterCapability = {
65106
+ name: "meter",
65107
+ scope: "device",
65108
+ deviceNative: true,
65109
+ mode: "singleton",
65110
+ deviceTypes: [DeviceType.Sensor],
65111
+ methods: {},
65112
+ status: {
65113
+ schema: MeterStatusSchema,
65114
+ kind: "push"
65115
+ },
65116
+ runtimeState: MeterStatusSchema,
65117
+ /**
65118
+ * Runtime-state durability: **restored** — the total is a cache of the
65119
+ * history integral. A restart shows it only until the history pass
65120
+ * recomputes the open period; it is not an in-memory buffer.
65121
+ *
65122
+ * See `RuntimeStateDurability`. Enforced by
65123
+ * `scripts/check-runtime-state-durability.ts`.
65124
+ */
65125
+ durability: "restored",
65126
+ history: { fields: { value: {
65127
+ kind: "counter",
65128
+ deadband: .001,
65129
+ minIntervalMs: 6e4
65130
+ } } },
65131
+ volatileStateFields: ["lastFetchedAt"]
65132
+ };
65133
+ /**
64948
65134
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
64949
65135
  * Apple TV, Spotify, Roku, generic OTT receivers, …) on
64950
65136
  * `DeviceType.MediaPlayer`. Disjoint from the camera streaming
@@ -67531,7 +67717,12 @@ var powerMeterCapability = {
67531
67717
  scope: "device",
67532
67718
  deviceNative: true,
67533
67719
  mode: "singleton",
67534
- deviceTypes: [DeviceType.Sensor],
67720
+ deviceTypes: [
67721
+ DeviceType.Sensor,
67722
+ DeviceType.Washer,
67723
+ DeviceType.Dryer,
67724
+ DeviceType.Dishwasher
67725
+ ],
67535
67726
  methods: {},
67536
67727
  status: {
67537
67728
  schema: PowerMeterStatusSchema,
@@ -68269,6 +68460,8 @@ var runningCustomize = {
68269
68460
  stateField: "running"
68270
68461
  },
68271
68462
  deviceTypes: [
68463
+ DeviceType.Washer,
68464
+ DeviceType.Dryer,
68272
68465
  DeviceType.Dishwasher,
68273
68466
  DeviceType.Vacuum,
68274
68467
  DeviceType.LawnMower,
@@ -73022,7 +73215,7 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
73022
73215
  auth: "admin"
73023
73216
  });
73024
73217
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
73025
- 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;
73218
+ 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;
73026
73219
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
73027
73220
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
73028
73221
  new Set(CAP_NAMES);
@@ -73415,6 +73608,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
73415
73608
  lawnMowerControl: lawnMowerControlCapability,
73416
73609
  lockControl: lockControlCapability,
73417
73610
  mediaPlayer: mediaPlayerCapability,
73611
+ meter: meterCapability,
73418
73612
  motion: motionCapability,
73419
73613
  motionTrigger: motionTriggerCapability,
73420
73614
  motionZones: motionZonesCapability,
@@ -74191,7 +74385,7 @@ var DeclaredDevices = class {
74191
74385
  return removed;
74192
74386
  }
74193
74387
  };
74194
- 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;
74388
+ 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;
74195
74389
  new Set(Object.values(DeviceType));
74196
74390
  Object.freeze({
74197
74391
  "accessories.getStatus": {
@@ -78380,6 +78574,13 @@ Object.freeze({
78380
78574
  access: "create",
78381
78575
  role: "admin"
78382
78576
  },
78577
+ "meter.getStatus": {
78578
+ capName: "meter",
78579
+ capScope: "device",
78580
+ addonId: null,
78581
+ access: "view",
78582
+ role: "viewer"
78583
+ },
78383
78584
  "metricsProvider.collectSnapshot": {
78384
78585
  capName: "metrics-provider",
78385
78586
  capScope: "system",
@@ -86478,7 +86679,39 @@ var APPLIANCE_CAP_VOCABULARY = {
86478
86679
  phrase: t("When {device} finishes", "Quando {device} finisce"),
86479
86680
  icon: "square"
86480
86681
  }
86481
- }
86682
+ },
86683
+ overrides: { byType: {
86684
+ [DeviceType.Washer]: {
86685
+ state: { running: {
86686
+ whenTrue: t("When the washing machine starts", "Quando la lavatrice inizia"),
86687
+ whenFalse: t("When the washing machine has finished", "Quando la lavatrice ha finito")
86688
+ } },
86689
+ events: {
86690
+ onStarted: { phrase: t("When the washing machine starts", "Quando la lavatrice inizia") },
86691
+ onFinished: { phrase: t("When the washing machine has finished", "Quando la lavatrice ha finito") }
86692
+ }
86693
+ },
86694
+ [DeviceType.Dryer]: {
86695
+ state: { running: {
86696
+ whenTrue: t("When the dryer starts", "Quando l'asciugatrice inizia"),
86697
+ whenFalse: t("When the dryer has finished", "Quando l'asciugatrice ha finito")
86698
+ } },
86699
+ events: {
86700
+ onStarted: { phrase: t("When the dryer starts", "Quando l'asciugatrice inizia") },
86701
+ onFinished: { phrase: t("When the dryer has finished", "Quando l'asciugatrice ha finito") }
86702
+ }
86703
+ },
86704
+ [DeviceType.Dishwasher]: {
86705
+ state: { running: {
86706
+ whenTrue: t("When the dishwasher starts", "Quando la lavastoviglie inizia"),
86707
+ whenFalse: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito")
86708
+ } },
86709
+ events: {
86710
+ onStarted: { phrase: t("When the dishwasher starts", "Quando la lavastoviglie inizia") },
86711
+ onFinished: { phrase: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito") }
86712
+ }
86713
+ }
86714
+ } }
86482
86715
  },
86483
86716
  update: {
86484
86717
  scope: "device",
@@ -87306,6 +87539,17 @@ var SENSOR_CAP_VOCABULARY = {
87306
87539
  }],
87307
87540
  events: { onMotionChanged: { notOperatorFacing: "the `detected` state trigger phrases both edges, from the mirror that survives a dropped event (D49)" } }
87308
87541
  },
87542
+ meter: {
87543
+ scope: "device",
87544
+ noun: t("Meter", "Contatore"),
87545
+ state: [{
87546
+ kind: "numeric",
87547
+ field: "value",
87548
+ quantity: t("the total", "il totale"),
87549
+ label: t("Total", "Totale"),
87550
+ icon: "gauge"
87551
+ }]
87552
+ },
87309
87553
  "numeric-sensor": {
87310
87554
  scope: "device",
87311
87555
  noun: t("Sensor", "Sensore"),
@@ -87778,8 +88022,47 @@ function projectAction(cap, action) {
87778
88022
  };
87779
88023
  }
87780
88024
  Object.entries(CAP_VOCABULARY_BY_NAME).flatMap(([cap, entry]) => entry.scope === "device" ? (entry.actions ?? []).map((a) => projectAction(cap, a)) : []);
87781
- 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;
88025
+ 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;
87782
88026
  DeviceFeature.BatteryOperated;
88027
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
88028
+ 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.";
88029
+ 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.";
88030
+ var ALEXA_REASON = "Alexa has no laundry category in this export, and neither power nor running has an Alexa interface.";
88031
+ var GOOGLE_REASON = "Google WASHER, DRYER and DISHWASHER require RunCycle. A power threshold is not that trait, and this export does not publish RunCycle.";
88032
+ 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.";
88033
+ function withheld(reason) {
88034
+ return {
88035
+ [DeviceType.Washer]: {
88036
+ exported: false,
88037
+ reason
88038
+ },
88039
+ [DeviceType.Dryer]: {
88040
+ exported: false,
88041
+ reason
88042
+ },
88043
+ [DeviceType.Dishwasher]: {
88044
+ exported: false,
88045
+ reason
88046
+ }
88047
+ };
88048
+ }
88049
+ function offered(received) {
88050
+ return {
88051
+ [DeviceType.Washer]: {
88052
+ exported: true,
88053
+ as: received
88054
+ },
88055
+ [DeviceType.Dryer]: {
88056
+ exported: true,
88057
+ as: received
88058
+ },
88059
+ [DeviceType.Dishwasher]: {
88060
+ exported: true,
88061
+ as: received
88062
+ }
88063
+ };
88064
+ }
88065
+ offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
87783
88066
  Object.freeze({
87784
88067
  "accessories.getStatus": [{
87785
88068
  name: "deviceId",
@@ -88956,6 +89239,11 @@ Object.freeze({
88956
89239
  form: "single",
88957
89240
  optional: false
88958
89241
  }],
89242
+ "meter.getStatus": [{
89243
+ name: "deviceId",
89244
+ form: "single",
89245
+ optional: false
89246
+ }],
88959
89247
  "motion.getStatus": [{
88960
89248
  name: "deviceId",
88961
89249
  form: "single",
@@ -90660,7 +90948,6 @@ var BucketAccumulator = class {
90660
90948
  return n;
90661
90949
  }
90662
90950
  };
90663
- DeviceType.Camera;
90664
90951
  /**
90665
90952
  * A saved Customize assignment (D936). The schema is the type: callers use
90666
90953
  * `z.infer`, they do not restate the shape.