@camstack/addon-post-analysis 1.2.647 → 1.2.649

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 (16) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/{clip-model-registry-Bi5DcV3d.js → clip-model-registry-BweA9zEK.js} +245 -167
  3. package/dist/{clip-model-registry-Baro8DSl.mjs → clip-model-registry-DLCu17dL.mjs} +240 -168
  4. package/dist/embedding-encoder/index.js +1 -1
  5. package/dist/embedding-encoder/index.mjs +1 -1
  6. package/dist/pipeline-analytics/_stub.js +2 -2
  7. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-M_XNqkOs.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DFq-lnbD.mjs} +2 -2
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-YDf26qsN.mjs +26 -0
  9. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DQTr4r2P.mjs +26 -0
  10. package/dist/pipeline-analytics/{hostInit-DRa7YSGg.mjs → hostInit-Dog0wpFI.mjs} +2 -2
  11. package/dist/pipeline-analytics/index.js +10 -5
  12. package/dist/pipeline-analytics/index.mjs +10 -5
  13. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  14. package/package.json +2 -1
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D5tFxRsi.mjs +0 -26
  16. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DgC84J8L.mjs +0 -26
@@ -5676,7 +5676,7 @@ var ZodIssueCode = {
5676
5676
  var ZodFirstPartyTypeKind;
5677
5677
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5678
5678
  //#endregion
5679
- //#region ../types/dist/sleep-DFaVPxfm.mjs
5679
+ //#region ../types/dist/sleep-Crlmu_tO.mjs
5680
5680
  /**
5681
5681
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5682
5682
  * window to float samples (D455).
@@ -9214,11 +9214,11 @@ var CAP_NAMES = Object.freeze([
9214
9214
  Object.freeze({
9215
9215
  "air-quality-sensor": [
9216
9216
  {
9217
- "path": "co2Ppm",
9217
+ "path": "co2",
9218
9218
  "valueType": "number"
9219
9219
  },
9220
9220
  {
9221
- "path": "vocPpb",
9221
+ "path": "voc",
9222
9222
  "valueType": "number"
9223
9223
  },
9224
9224
  {
@@ -9268,7 +9268,7 @@ Object.freeze({
9268
9268
  }
9269
9269
  ],
9270
9270
  "ambient-light-sensor": [{
9271
- "path": "lux",
9271
+ "path": "illuminance",
9272
9272
  "valueType": "number"
9273
9273
  }],
9274
9274
  "audio-metrics": [
@@ -9329,7 +9329,7 @@ Object.freeze({
9329
9329
  ],
9330
9330
  "battery": [
9331
9331
  {
9332
- "path": "percentage",
9332
+ "path": "level",
9333
9333
  "valueType": "number"
9334
9334
  },
9335
9335
  {
@@ -9351,7 +9351,7 @@ Object.freeze({
9351
9351
  "valueType": "number"
9352
9352
  },
9353
9353
  {
9354
- "path": "volts",
9354
+ "path": "voltage",
9355
9355
  "valueType": "number"
9356
9356
  },
9357
9357
  {
@@ -9372,7 +9372,7 @@ Object.freeze({
9372
9372
  "valueType": "boolean"
9373
9373
  }],
9374
9374
  "brightness": [{
9375
- "path": "percentage",
9375
+ "path": "level",
9376
9376
  "valueType": "number"
9377
9377
  }],
9378
9378
  "broker": [{
@@ -9573,7 +9573,7 @@ Object.freeze({
9573
9573
  "valueType": "number"
9574
9574
  },
9575
9575
  {
9576
- "path": "mireds",
9576
+ "path": "colorTemperature",
9577
9577
  "valueType": "number"
9578
9578
  }
9579
9579
  ],
@@ -9752,15 +9752,15 @@ Object.freeze({
9752
9752
  "valueType": "string"
9753
9753
  },
9754
9754
  {
9755
- "path": "remainingSeconds",
9755
+ "path": "remaining",
9756
9756
  "valueType": "number"
9757
9757
  },
9758
9758
  {
9759
- "path": "delayedStartSeconds",
9759
+ "path": "delayedStart",
9760
9760
  "valueType": "number"
9761
9761
  },
9762
9762
  {
9763
- "path": "progressPercent",
9763
+ "path": "progress",
9764
9764
  "valueType": "number"
9765
9765
  },
9766
9766
  {
@@ -9874,7 +9874,7 @@ Object.freeze({
9874
9874
  ],
9875
9875
  "fan-control": [
9876
9876
  {
9877
- "path": "percentage",
9877
+ "path": "speed",
9878
9878
  "valueType": "number"
9879
9879
  },
9880
9880
  {
@@ -9974,7 +9974,7 @@ Object.freeze({
9974
9974
  }
9975
9975
  ],
9976
9976
  "humidity-sensor": [{
9977
- "path": "percent",
9977
+ "path": "humidity",
9978
9978
  "valueType": "number"
9979
9979
  }],
9980
9980
  "image": [{
@@ -10084,7 +10084,7 @@ Object.freeze({
10084
10084
  "valueType": "number"
10085
10085
  },
10086
10086
  {
10087
- "path": "progressPercent",
10087
+ "path": "progress",
10088
10088
  "valueType": "number"
10089
10089
  },
10090
10090
  {
@@ -10163,11 +10163,11 @@ Object.freeze({
10163
10163
  "valueType": "string"
10164
10164
  },
10165
10165
  {
10166
- "path": "positionMs",
10166
+ "path": "position",
10167
10167
  "valueType": "number"
10168
10168
  },
10169
10169
  {
10170
- "path": "durationMs",
10170
+ "path": "duration",
10171
10171
  "valueType": "number"
10172
10172
  },
10173
10173
  {
@@ -10269,11 +10269,11 @@ Object.freeze({
10269
10269
  ]
10270
10270
  },
10271
10271
  {
10272
- "path": "signalPercent",
10272
+ "path": "signal",
10273
10273
  "valueType": "number"
10274
10274
  },
10275
10275
  {
10276
- "path": "rssiDbm",
10276
+ "path": "rssi",
10277
10277
  "valueType": "number"
10278
10278
  },
10279
10279
  {
@@ -10404,23 +10404,23 @@ Object.freeze({
10404
10404
  ],
10405
10405
  "power-meter": [
10406
10406
  {
10407
- "path": "watts",
10407
+ "path": "power",
10408
10408
  "valueType": "number"
10409
10409
  },
10410
10410
  {
10411
- "path": "kwhTotal",
10411
+ "path": "energy",
10412
10412
  "valueType": "number"
10413
10413
  },
10414
10414
  {
10415
- "path": "volts",
10415
+ "path": "voltage",
10416
10416
  "valueType": "number"
10417
10417
  },
10418
10418
  {
10419
- "path": "amps",
10419
+ "path": "current",
10420
10420
  "valueType": "number"
10421
10421
  },
10422
10422
  {
10423
- "path": "va",
10423
+ "path": "apparentPower",
10424
10424
  "valueType": "number"
10425
10425
  },
10426
10426
  {
@@ -10448,14 +10448,10 @@ Object.freeze({
10448
10448
  {
10449
10449
  "path": "gps.accuracyMeters",
10450
10450
  "valueType": "number"
10451
- },
10452
- {
10453
- "path": "batteryPercent",
10454
- "valueType": "number"
10455
10451
  }
10456
10452
  ],
10457
10453
  "pressure-sensor": [{
10458
- "path": "hpa",
10454
+ "path": "pressure",
10459
10455
  "valueType": "number"
10460
10456
  }],
10461
10457
  "privacy-mask": [{
@@ -10769,7 +10765,7 @@ Object.freeze({
10769
10765
  "valueType": "boolean"
10770
10766
  }],
10771
10767
  "temperature-sensor": [{
10772
- "path": "celsius",
10768
+ "path": "temperature",
10773
10769
  "valueType": "number"
10774
10770
  }],
10775
10771
  "update": [
@@ -10817,7 +10813,7 @@ Object.freeze({
10817
10813
  "valueType": "string"
10818
10814
  },
10819
10815
  {
10820
- "path": "progressPercent",
10816
+ "path": "progress",
10821
10817
  "valueType": "number"
10822
10818
  },
10823
10819
  {
@@ -11447,7 +11443,7 @@ function errMsg(err) {
11447
11443
  return String(err);
11448
11444
  }
11449
11445
  //#endregion
11450
- //#region ../types/dist/composition-Bb8iwHEJ.mjs
11446
+ //#region ../types/dist/composition-DwA0uVW5.mjs
11451
11447
  /**
11452
11448
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
11453
11449
  * canonical form sorts object keys alphabetically at every depth so two
@@ -20148,7 +20144,7 @@ var CompositionEventPlanSchema = object({
20148
20144
  stateField: string(),
20149
20145
  fieldKey: string()
20150
20146
  });
20151
- /** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.celsius`. */
20147
+ /** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.temperature`. */
20152
20148
  var CompositionProblemSchema = object({
20153
20149
  code: _enum([
20154
20150
  "reserved-variant",
@@ -20430,12 +20426,13 @@ var CHANGED = {
20430
20426
  expr: "now"
20431
20427
  };
20432
20428
  function numeric(input) {
20429
+ const { alsoFrom, ...base } = input;
20433
20430
  return {
20434
- ...input,
20431
+ ...base,
20435
20432
  family: "numeric",
20436
20433
  deviceType: DeviceType.Sensor,
20437
20434
  memberDeviceType: DeviceType.Sensor,
20438
- memberDeviceTypes: [DeviceType.Sensor],
20435
+ memberDeviceTypes: [DeviceType.Sensor, ...alsoFrom?.deviceTypes ?? []],
20439
20436
  activeWhen: void 0,
20440
20437
  commandCaps: [],
20441
20438
  baseUnit: baseUnitOf(input.quantity),
@@ -20443,9 +20440,10 @@ function numeric(input) {
20443
20440
  accept: [{
20444
20441
  cap: input.outputCap,
20445
20442
  fieldPath: input.outputField
20446
- }]
20443
+ }, ...alsoFrom === void 0 ? [] : [alsoFrom.accept]]
20447
20444
  };
20448
20445
  }
20446
+ var CLIMATE_DEVICES = [DeviceType.Thermostat, DeviceType.Climate];
20449
20447
  function binary(input) {
20450
20448
  return {
20451
20449
  ...input,
@@ -20467,29 +20465,43 @@ var GROUP_TEMPLATES = [
20467
20465
  summary: "Mean, median, min, max or sum of temperatures. Offline and unknown members are left out, never read as 0 °C.",
20468
20466
  role: DeviceRole.TemperatureSensor,
20469
20467
  outputCap: "temperature-sensor",
20470
- outputField: "celsius",
20468
+ outputField: "temperature",
20471
20469
  quantity: "temperature",
20472
20470
  defaultAggregate: "mean",
20473
20471
  empty: "null",
20474
- companions: [NOW$2]
20472
+ companions: [NOW$2],
20473
+ alsoFrom: {
20474
+ deviceTypes: CLIMATE_DEVICES,
20475
+ accept: {
20476
+ cap: "climate-control",
20477
+ fieldPath: "currentTemp"
20478
+ }
20479
+ }
20475
20480
  }),
20476
20481
  numeric({
20477
20482
  id: "humidity",
20478
20483
  summary: "Humidity in percent. Offline and unknown members are left out, never read as 0 %.",
20479
20484
  role: DeviceRole.HumiditySensor,
20480
20485
  outputCap: "humidity-sensor",
20481
- outputField: "percent",
20486
+ outputField: "humidity",
20482
20487
  quantity: "humidity",
20483
20488
  defaultAggregate: "mean",
20484
20489
  empty: "null",
20485
- companions: [NOW$2]
20490
+ companions: [NOW$2],
20491
+ alsoFrom: {
20492
+ deviceTypes: CLIMATE_DEVICES,
20493
+ accept: {
20494
+ cap: "climate-control",
20495
+ fieldPath: "currentHumidity"
20496
+ }
20497
+ }
20486
20498
  }),
20487
20499
  numeric({
20488
20500
  id: "pressure",
20489
20501
  summary: "Pressure in hectopascals. Offline and unknown members are left out, never read as 0 hPa.",
20490
20502
  role: DeviceRole.PressureSensor,
20491
20503
  outputCap: "pressure-sensor",
20492
- outputField: "hpa",
20504
+ outputField: "pressure",
20493
20505
  quantity: "pressure",
20494
20506
  defaultAggregate: "mean",
20495
20507
  empty: "null",
@@ -20500,7 +20512,7 @@ var GROUP_TEMPLATES = [
20500
20512
  summary: "Illuminance in lux. Offline and unknown members are left out, never read as 0 lx.",
20501
20513
  role: DeviceRole.AmbientLightSensor,
20502
20514
  outputCap: "ambient-light-sensor",
20503
- outputField: "lux",
20515
+ outputField: "illuminance",
20504
20516
  quantity: "illuminance",
20505
20517
  defaultAggregate: "mean",
20506
20518
  empty: "null",
@@ -20511,7 +20523,7 @@ var GROUP_TEMPLATES = [
20511
20523
  summary: "Power in watts, summed by default. Nobody reporting omits the key rather than writing 0 W.",
20512
20524
  role: DeviceRole.PowerSensor,
20513
20525
  outputCap: "power-meter",
20514
- outputField: "watts",
20526
+ outputField: "power",
20515
20527
  quantity: "power",
20516
20528
  defaultAggregate: "sum",
20517
20529
  empty: "omit",
@@ -20522,7 +20534,7 @@ var GROUP_TEMPLATES = [
20522
20534
  summary: "Energy in kilowatt-hours, summed by default. Nobody reporting omits the key rather than writing 0 kWh.",
20523
20535
  role: DeviceRole.EnergySensor,
20524
20536
  outputCap: "power-meter",
20525
- outputField: "kwhTotal",
20537
+ outputField: "energy",
20526
20538
  quantity: "energy",
20527
20539
  defaultAggregate: "sum",
20528
20540
  empty: "omit",
@@ -20533,7 +20545,7 @@ var GROUP_TEMPLATES = [
20533
20545
  summary: "Battery charge in percent. Offline and unknown members are left out, never read as 0 %.",
20534
20546
  role: DeviceRole.BatterySensor,
20535
20547
  outputCap: "battery",
20536
- outputField: "percentage",
20548
+ outputField: "level",
20537
20549
  quantity: "percentage",
20538
20550
  defaultAggregate: "mean",
20539
20551
  empty: "null",
@@ -46303,6 +46315,43 @@ var NotificationActionSchema = object({
46303
46315
  */
46304
46316
  mode: _enum(["navigate", "background"]).optional()
46305
46317
  });
46318
+ /** A delivery parameter value: what a notifier declared it takes. */
46319
+ var DeliveryParamValueSchema = union([
46320
+ string(),
46321
+ number(),
46322
+ boolean()
46323
+ ]);
46324
+ /**
46325
+ * One extra delivery parameter a notifier KIND declares (D938). A rule that
46326
+ * addresses a target of that kind may set it; a kind that declares nothing is
46327
+ * never handed one. The admin UI derives its control from this descriptor —
46328
+ * no editor knows a service by name.
46329
+ *
46330
+ * Optional fields are `.optional()`, never `.default()` (a Zod default does not
46331
+ * run on the addon cap path).
46332
+ */
46333
+ var DeliveryParamSchema = object({
46334
+ key: string().min(1),
46335
+ label: string(),
46336
+ /** i18n key of the label, resolved by the declaring addon's namespace. */
46337
+ labelKey: string().optional(),
46338
+ type: _enum([
46339
+ "enum",
46340
+ "number",
46341
+ "boolean",
46342
+ "string"
46343
+ ]),
46344
+ /** `enum` only: the closed set of accepted values. */
46345
+ options: array(object({
46346
+ value: string(),
46347
+ label: string()
46348
+ })).optional(),
46349
+ /** `number` only. */
46350
+ min: number().optional(),
46351
+ max: number().optional(),
46352
+ /** What the notifier does when the rule sets nothing; shown as the placeholder. */
46353
+ default: DeliveryParamValueSchema.optional()
46354
+ });
46306
46355
  /**
46307
46356
  * The canonical notification. `body` is the only hard field (Apprise model).
46308
46357
  * `priority` is a 5-level ORDINAL (1=lowest … 3=normal(default) … 5=urgent),
@@ -46325,7 +46374,13 @@ var NotificationSchema = object({
46325
46374
  tag: string().optional(),
46326
46375
  deviceId: number().optional(),
46327
46376
  eventId: string().optional(),
46328
- metadata: record(string(), unknown()).optional()
46377
+ metadata: record(string(), unknown()).optional(),
46378
+ /**
46379
+ * Values for the parameters the target's kind DECLARES in
46380
+ * {@link TargetKindSchema} `deliveryParams`. Already validated against the
46381
+ * declaration by the sender; a notifier reads only the keys it declared.
46382
+ */
46383
+ delivery: record(string(), DeliveryParamValueSchema).optional()
46329
46384
  });
46330
46385
  /** One declared native severity/priority level for a kind. */
46331
46386
  var TargetKindLevelSchema = object({
@@ -46431,6 +46486,11 @@ var TargetKindSchema = object({
46431
46486
  */
46432
46487
  destinationKeys: array(string()).optional(),
46433
46488
  supportsDiscovery: boolean(),
46489
+ /**
46490
+ * Extra delivery parameters a rule may set for a target of this kind (D938).
46491
+ * Absent = none; the rule editor then offers nothing.
46492
+ */
46493
+ deliveryParams: array(DeliveryParamSchema).optional(),
46434
46494
  caps: TargetKindCapsSchema
46435
46495
  });
46436
46496
  /**
@@ -60584,7 +60644,9 @@ var ManifestShapeSchema = object({
60584
60644
  icon: string().optional()
60585
60645
  }).optional(),
60586
60646
  protected: boolean().optional(),
60587
- removable: boolean().optional()
60647
+ removable: boolean().optional(),
60648
+ /** Declared Integrations-page block (mirror of `AddonDeclaration.integrationSection`). */
60649
+ integrationSection: _enum(["system", "providers"]).optional()
60588
60650
  });
60589
60651
  var AddonProcessSchema = object({
60590
60652
  pid: number().optional(),
@@ -60958,9 +61020,9 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
60958
61020
  */
60959
61021
  var AirQualitySensorStatusSchema = object({
60960
61022
  /** Carbon dioxide concentration in ppm. */
60961
- co2Ppm: number().min(0).optional().meta(readingMeta("concentration-volume")),
61023
+ co2: number().min(0).optional().meta(readingMeta("concentration-volume")),
60962
61024
  /** Total volatile organic compounds in ppb. */
60963
- vocPpb: number().min(0).optional().meta(readingMeta("concentration-ppb")),
61025
+ voc: number().min(0).optional().meta(readingMeta("concentration-ppb")),
60964
61026
  /** Particulate matter ≤ 2.5 μm in µg/m³. */
60965
61027
  pm25: number().min(0).optional().meta(readingMeta("concentration-mass")),
60966
61028
  /** Particulate matter ≤ 10 μm in µg/m³. */
@@ -60993,12 +61055,12 @@ var airQualitySensorCapability = {
60993
61055
  * History (D850): recorded series.
60994
61056
  */
60995
61057
  history: { fields: {
60996
- co2Ppm: {
61058
+ co2: {
60997
61059
  kind: "gauge",
60998
61060
  unit: "ppm",
60999
61061
  deadband: 5
61000
61062
  },
61001
- vocPpb: {
61063
+ voc: {
61002
61064
  kind: "gauge",
61003
61065
  unit: "ppb",
61004
61066
  deadband: 5
@@ -61029,7 +61091,7 @@ var airQualitySensorCapability = {
61029
61091
  */
61030
61092
  var AmbientLightSensorStatusSchema = object({
61031
61093
  /** Current illuminance in lux (lx). `null` when the sample was refused (D393). */
61032
- lux: number().min(0).nullable().meta(readingMeta("illuminance", {
61094
+ illuminance: number().min(0).nullable().meta(readingMeta("illuminance", {
61033
61095
  precision: 0,
61034
61096
  label: "Illuminance"
61035
61097
  })),
@@ -61058,7 +61120,7 @@ var ambientLightSensorCapability = {
61058
61120
  /**
61059
61121
  * History (D850): recorded series. Wide range, so a RELATIVE deadband (10 %).
61060
61122
  */
61061
- history: { fields: { lux: {
61123
+ history: { fields: { illuminance: {
61062
61124
  kind: "gauge",
61063
61125
  unit: "lx",
61064
61126
  deadbandPct: 10,
@@ -61371,7 +61433,7 @@ var BatteryStatusSchema = object({
61371
61433
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
61372
61434
  * declines to band a non-finite reading, which is the correct shape.
61373
61435
  */
61374
- percentage: number().min(0).max(100).nullable().meta(readingMeta("percentage", { label: "Charge" })),
61436
+ level: number().min(0).max(100).nullable().meta(readingMeta("percentage", { label: "Charge" })),
61375
61437
  /**
61376
61438
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
61377
61439
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -61381,7 +61443,7 @@ var BatteryStatusSchema = object({
61381
61443
  * `'unknown'` is the absence of an answer: the provider has not read the
61382
61444
  * power fields yet, or the firmware reported neither. Before it existed,
61383
61445
  * two unreadable fields produced `'none'`, and a camera nobody had reached
61384
- * was drawn "on battery alone" — the same D315 defect `percentage` closed
61446
+ * was drawn "on battery alone" — the same D315 defect `level` closed
61385
61447
  * by going nullable. Consumers SKIP it (no charger state published, no
61386
61448
  * glyph, no HomeKit ChargingState) rather than coerce it either way.
61387
61449
  */
@@ -61405,7 +61467,7 @@ var BatteryStatusSchema = object({
61405
61467
  * that only report charge. A second reading on this cap, not a second
61406
61468
  * `numeric-sensor` on the same device.
61407
61469
  */
61408
- volts: number().nullable().optional().meta(readingMeta("voltage", { label: "Voltage" })),
61470
+ voltage: number().nullable().optional().meta(readingMeta("voltage", { label: "Voltage" })),
61409
61471
  /**
61410
61472
  * Ms epoch of the last time the device PROVED it was reachable — a
61411
61473
  * completed firmware round-trip, an observed wake, or an inbound push
@@ -61439,7 +61501,7 @@ var BatteryStatusSchema = object({
61439
61501
  /**
61440
61502
  * True when the source is a BINARY low-battery indicator (HA
61441
61503
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
61442
- * charge level — `percentage` is then a coarse stand-in (100 = normal,
61504
+ * charge level — `level` is then a coarse stand-in (100 = normal,
61443
61505
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
61444
61506
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
61445
61507
  */
@@ -61459,15 +61521,15 @@ var BATTERY_DEVICE_TYPES = [
61459
61521
  var batteryCustomize = {
61460
61522
  version: 1,
61461
61523
  targets: [{
61462
- id: "percentage",
61524
+ id: "level",
61463
61525
  cardinality: "scalar",
61464
61526
  vocabulary: {
61465
61527
  cap: "battery",
61466
- stateField: "percentage"
61528
+ stateField: "level"
61467
61529
  },
61468
61530
  deviceTypes: BATTERY_DEVICE_TYPES,
61469
61531
  apply: "add",
61470
- path: "percentage",
61532
+ path: "level",
61471
61533
  sources: [{
61472
61534
  kind: "field",
61473
61535
  valueKinds: ["number", "string"],
@@ -61561,7 +61623,7 @@ onStatusChanged: { data: object({
61561
61623
  schema: BatteryStatusSchema,
61562
61624
  kind: "push",
61563
61625
  empty: {
61564
- percentage: null,
61626
+ level: null,
61565
61627
  charging: "unknown",
61566
61628
  sleeping: false,
61567
61629
  lastUpdated: 0
@@ -61588,11 +61650,11 @@ onStatusChanged: { data: object({
61588
61650
  * History (D850): recorded series. The generic capture replaces the `battery` series of `pipeline-analytics:stats-5m`.
61589
61651
  */
61590
61652
  history: { fields: {
61591
- percentage: {
61653
+ level: {
61592
61654
  kind: "gauge",
61593
61655
  unit: "%"
61594
61656
  },
61595
- volts: {
61657
+ voltage: {
61596
61658
  kind: "gauge",
61597
61659
  unit: "V"
61598
61660
  }
@@ -61652,14 +61714,14 @@ var binaryCapability = {
61652
61714
  * controls to this single-method surface.
61653
61715
  *
61654
61716
  * The cap is intentionally minimal: a single `setBrightness({deviceId,
61655
- * percentage})` mutation plus the auto-injected `getStatus`. Drivers
61717
+ * level})` mutation plus the auto-injected `getStatus`. Drivers
61656
61718
  * that expose richer controls (color temperature, scenes, schedules)
61657
61719
  * should surface those via the device's `getSettingsUISchema()`
61658
61720
  * instead of bloating this cap.
61659
61721
  */
61660
61722
  var BrightnessStatusSchema = object({
61661
61723
  /** Current level as 0..100 inclusive. Firmware-reported. */
61662
- percentage: number().min(0).max(100).meta(readingMeta("percentage")),
61724
+ level: number().min(0).max(100).meta(readingMeta("percentage")),
61663
61725
  /** Ms epoch of the last operator-driven change. Useful for UI freshness. */
61664
61726
  lastChangedAt: number()
61665
61727
  });
@@ -61671,7 +61733,7 @@ var brightnessCapability = {
61671
61733
  deviceTypes: [DeviceType.Light],
61672
61734
  methods: { setBrightness: method(object({
61673
61735
  deviceId: number().int().nonnegative(),
61674
- percentage: number().min(0).max(100)
61736
+ level: number().min(0).max(100)
61675
61737
  }), _void(), {
61676
61738
  kind: "mutation",
61677
61739
  auth: "protected"
@@ -61684,7 +61746,7 @@ var brightnessCapability = {
61684
61746
  */
61685
61747
  onBrightnessChanged: { data: object({
61686
61748
  deviceId: number(),
61687
- percentage: number().min(0).max(100),
61749
+ level: number().min(0).max(100),
61688
61750
  lastChangedAt: number()
61689
61751
  }) } },
61690
61752
  status: {
@@ -61707,7 +61769,7 @@ onBrightnessChanged: { data: object({
61707
61769
  /**
61708
61770
  * History (D850): recorded series. Actuator tier: level keeps every change.
61709
61771
  */
61710
- history: { fields: { percentage: {
61772
+ history: { fields: { level: {
61711
61773
  kind: "gauge",
61712
61774
  unit: "%",
61713
61775
  minIntervalMs: 0
@@ -62331,11 +62393,11 @@ var ColorInputSchema = discriminatedUnion("mode", [
62331
62393
  }),
62332
62394
  object({
62333
62395
  mode: literal("mired"),
62334
- mireds: number().int().min(50).max(1e3)
62396
+ colorTemperature: number().int().min(50).max(1e3)
62335
62397
  })
62336
62398
  ]);
62337
62399
  var ColorStatusSchema = object({
62338
- /** Active color mode — which of `rgb` / `hsv` / `mireds` reflects
62400
+ /** Active color mode — which of `rgb` / `hsv` / `colorTemperature` reflects
62339
62401
  * the bulb's current state. */
62340
62402
  mode: _enum([
62341
62403
  "rgb",
@@ -62347,7 +62409,7 @@ var ColorStatusSchema = object({
62347
62409
  /** Populated when `mode === 'hsv'`. */
62348
62410
  hsv: HsvTripletSchema.optional(),
62349
62411
  /** Populated when `mode === 'mired'`. */
62350
- mireds: number().int().optional().meta(readingMeta("colour-temperature")),
62412
+ colorTemperature: number().int().optional().meta(readingMeta("colour-temperature")),
62351
62413
  /** Ms epoch of the last operator-driven change. */
62352
62414
  lastChangedAt: number()
62353
62415
  });
@@ -62379,7 +62441,7 @@ onColorChanged: { data: object({
62379
62441
  ]),
62380
62442
  rgb: RgbTripletSchema.optional(),
62381
62443
  hsv: HsvTripletSchema.optional(),
62382
- mireds: number().int().optional(),
62444
+ colorTemperature: number().int().optional(),
62383
62445
  lastChangedAt: number()
62384
62446
  }) } },
62385
62447
  status: {
@@ -63292,11 +63354,11 @@ var DishwasherStatusSchema = object({
63292
63354
  /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
63293
63355
  availablePrograms: array(string()),
63294
63356
  /** Seconds remaining on the active cycle, or null when not running / not known. */
63295
- remainingSeconds: number().int().nonnegative().nullable().meta(readingMeta("duration")),
63357
+ remaining: number().int().nonnegative().nullable().meta(readingMeta("duration")),
63296
63358
  /** Seconds the delayed start is set to (time until the cycle starts), or null. */
63297
- delayedStartSeconds: number().int().nonnegative().nullable().meta(readingMeta("duration")),
63359
+ delayedStart: number().int().nonnegative().nullable().meta(readingMeta("duration")),
63298
63360
  /** Cycle completion 0..100, or null when not applicable. */
63299
- progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
63361
+ progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
63300
63362
  /** True when the door is reported open; null when the door state is not known. */
63301
63363
  doorOpen: boolean().nullable(),
63302
63364
  /** True when the door is latched (locked) during a cycle; null when not reported. */
@@ -63515,14 +63577,14 @@ var dishwasherCapability = {
63515
63577
  runtimeState: DishwasherStatusSchema,
63516
63578
  durability: "session",
63517
63579
  history: { fields: {
63518
- progressPercent: {
63580
+ progress: {
63519
63581
  kind: "gauge",
63520
63582
  unit: "%",
63521
63583
  deadband: 2
63522
63584
  },
63523
63585
  state: { kind: "enum" },
63524
63586
  operationState: { kind: "enum" },
63525
- remainingSeconds: {
63587
+ remaining: {
63526
63588
  kind: "gauge",
63527
63589
  unit: "s",
63528
63590
  minIntervalMs: 6e4
@@ -64153,7 +64215,7 @@ var FanDirectionSchema = _enum(["forward", "reverse"]);
64153
64215
  var FanControlStatusSchema = object({
64154
64216
  /** Active speed as 0..100 inclusive. Null when the device has no
64155
64217
  * speed surface (single-speed fan). */
64156
- percentage: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
64218
+ speed: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
64157
64219
  /** Speed granularity the device accepts (HA `percentage_step`, e.g. 25 for
64158
64220
  * a 4-speed fan). Absent when unknown — the UI then falls back to step 1. */
64159
64221
  percentageStep: number().positive().optional().meta(readingMeta("percentage")),
@@ -64180,7 +64242,7 @@ var fanControlCapability = {
64180
64242
  methods: {
64181
64243
  setPercentage: method(object({
64182
64244
  deviceId: number().int().nonnegative(),
64183
- percentage: number().min(0).max(100)
64245
+ speed: number().min(0).max(100)
64184
64246
  }), _void(), {
64185
64247
  kind: "mutation",
64186
64248
  auth: "protected"
@@ -64213,7 +64275,7 @@ var fanControlCapability = {
64213
64275
  },
64214
64276
  /**
64215
64277
  * Runtime-state slice — mirrored by the kernel. UI fan speed
64216
- * sliders read `percentage` for live updates.
64278
+ * sliders read `speed` for live updates.
64217
64279
  */
64218
64280
  runtimeState: FanControlStatusSchema,
64219
64281
  /**
@@ -64227,7 +64289,7 @@ var fanControlCapability = {
64227
64289
  * History (D850): recorded series. Actuator tier: speed keeps every change.
64228
64290
  */
64229
64291
  history: { fields: {
64230
- percentage: {
64292
+ speed: {
64231
64293
  kind: "gauge",
64232
64294
  unit: "%",
64233
64295
  minIntervalMs: 0
@@ -64672,7 +64734,7 @@ var humidifierCapability = {
64672
64734
  */
64673
64735
  var HumiditySensorStatusSchema = object({
64674
64736
  /** Current relative humidity, 0..100. `null` when the sample was refused (D393). */
64675
- percent: number().min(0).max(100).nullable().meta(readingMeta("humidity", {
64737
+ humidity: number().min(0).max(100).nullable().meta(readingMeta("humidity", {
64676
64738
  precision: 0,
64677
64739
  label: "Humidity"
64678
64740
  })),
@@ -64701,7 +64763,7 @@ var humiditySensorCapability = {
64701
64763
  /**
64702
64764
  * History (D850): recorded series.
64703
64765
  */
64704
- history: { fields: { percent: {
64766
+ history: { fields: { humidity: {
64705
64767
  kind: "gauge",
64706
64768
  unit: "%",
64707
64769
  deadband: .5
@@ -65341,7 +65403,7 @@ var LawnMowerControlStatusSchema = object({
65341
65403
  batteryLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
65342
65404
  /** 0..100 mowing-completion percentage of the current task, or null when no
65343
65405
  * task is active / progress is unavailable. */
65344
- progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
65406
+ progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
65345
65407
  /** Current device/event code (dynamic — mostly status, sometimes an error),
65346
65408
  * or null when unknown. */
65347
65409
  currentCode: number().nullable().meta(readingMeta("none")),
@@ -65862,7 +65924,7 @@ var lockControlCapability = {
65862
65924
  volatileStateFields: ["lastChangedAt"]
65863
65925
  };
65864
65926
  /**
65865
- * A monotonic total between resets (D944). Energy uses `power-meter.kwhTotal`
65927
+ * A monotonic total between resets (D944). Energy uses `power-meter.energy`
65866
65928
  * so dashboards keep one series; every other instantaneous reading lands here.
65867
65929
  * `value` is the time integral in the source quantity's accumulated base
65868
65930
  * (base-unit seconds, or kWh on the power meter). `null` is a gap, never zero.
@@ -65956,10 +66018,10 @@ var MediaPlayerStatusSchema = object({
65956
66018
  currentMedia: MediaInfoSchema.nullable(),
65957
66019
  /** Current playback position in ms. Null when not seekable or
65958
66020
  * nothing is playing. Pair with `DeviceFeature.MediaPlayerSeek`. */
65959
- positionMs: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
66021
+ position: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
65960
66022
  /** Total duration of the current media in ms. Null when unknown
65961
66023
  * (live stream) or nothing is playing. */
65962
- durationMs: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
66024
+ duration: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
65963
66025
  /** Shuffle toggle. Null when no shuffle surface.
65964
66026
  * Pair with `DeviceFeature.MediaPlayerShuffle`. */
65965
66027
  shuffle: boolean().nullable(),
@@ -65998,7 +66060,7 @@ var mediaPlayerCapability = {
65998
66060
  }),
65999
66061
  seek: method(object({
66000
66062
  deviceId: number().int().nonnegative(),
66001
- positionMs: number().int().nonnegative()
66063
+ position: number().int().nonnegative()
66002
66064
  }), _void(), {
66003
66065
  kind: "mutation",
66004
66066
  auth: "protected"
@@ -66070,7 +66132,7 @@ var mediaPlayerCapability = {
66070
66132
  /**
66071
66133
  * History (D850): volume (a level an operator or an automation sets; the
66072
66134
  * default 10 s floor folds a slider drag into its end value) and mute.
66073
- * `positionMs` is not recorded: it moves continuously while playing.
66135
+ * `position` is not recorded: it moves continuously while playing.
66074
66136
  */
66075
66137
  history: { fields: {
66076
66138
  volumeLevel: {
@@ -67057,9 +67119,9 @@ var NetworkLinkStatusSchema = object({
67057
67119
  * one whose reading has not landed must not be drawn at 0 %. Consumers
67058
67120
  * SKIP a null rather than coerce it.
67059
67121
  */
67060
- signalPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
67122
+ signal: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
67061
67123
  /** Raw received signal strength in dBm, when the firmware reports one. */
67062
- rssiDbm: number().optional().meta(readingMeta("signal-level")),
67124
+ rssi: number().optional().meta(readingMeta("signal-level")),
67063
67125
  /** Network name of a wireless link, when the firmware reports it. */
67064
67126
  ssid: string().optional(),
67065
67127
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
@@ -67095,7 +67157,7 @@ onStatusChanged: { data: object({
67095
67157
  kind: "push",
67096
67158
  empty: {
67097
67159
  type: "unknown",
67098
- signalPercent: null,
67160
+ signal: null,
67099
67161
  lastUpdated: 0
67100
67162
  }
67101
67163
  },
@@ -67118,13 +67180,13 @@ onStatusChanged: { data: object({
67118
67180
  * History (D850): recorded series.
67119
67181
  */
67120
67182
  history: { fields: {
67121
- signalPercent: {
67183
+ signal: {
67122
67184
  kind: "gauge",
67123
67185
  unit: "%",
67124
67186
  deadband: 3,
67125
67187
  minIntervalMs: 6e4
67126
67188
  },
67127
- rssiDbm: {
67189
+ rssi: {
67128
67190
  kind: "gauge",
67129
67191
  unit: "dBm",
67130
67192
  deadband: 2,
@@ -68479,16 +68541,16 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
68479
68541
  * in real-world devices.
68480
68542
  */
68481
68543
  var PowerMeterStatusSchema = object({
68482
- /** Instantaneous power draw in watts. */
68483
- watts: number().optional().meta(readingMeta("power", { label: "Power" })),
68544
+ /** Instantaneous power draw (watts). */
68545
+ power: number().optional().meta(readingMeta("power", { label: "Power" })),
68484
68546
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
68485
- kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
68486
- /** Voltage in volts. */
68487
- volts: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
68547
+ energy: number().optional().meta(readingMeta("energy", { label: "Energy" })),
68548
+ /** Voltage (volts). */
68549
+ voltage: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
68488
68550
  /** Current in amperes. */
68489
- amps: number().optional().meta(readingMeta("current", { label: "Current" })),
68551
+ current: number().optional().meta(readingMeta("current", { label: "Current" })),
68490
68552
  /** Apparent power in volt-amperes. */
68491
- va: number().optional().meta(readingMeta("apparent-power")),
68553
+ apparentPower: number().optional().meta(readingMeta("apparent-power")),
68492
68554
  /** Power factor (0..1) if reported. */
68493
68555
  powerFactor: number().min(0).max(1).optional().meta(readingMeta("ratio")),
68494
68556
  /** Ms epoch when the slice was last updated. */
@@ -68546,14 +68608,14 @@ function powerTarget(id, unit) {
68546
68608
  advancedExpression: true
68547
68609
  };
68548
68610
  }
68549
- /** "Power and energy" extension: watts, energy, voltage and current from other devices (D951). */
68611
+ /** "Power and energy" extension: power, energy, voltage and current from other devices (D951). */
68550
68612
  var powerMeterCustomize = {
68551
68613
  version: 1,
68552
68614
  targets: [
68553
- powerTarget("watts", "W"),
68554
- powerTarget("kwhTotal", "kWh"),
68555
- powerTarget("volts", "V"),
68556
- powerTarget("amps", "A")
68615
+ powerTarget("power", "W"),
68616
+ powerTarget("energy", "kWh"),
68617
+ powerTarget("voltage", "V"),
68618
+ powerTarget("current", "A")
68557
68619
  ]
68558
68620
  };
68559
68621
  var powerMeterCapability = {
@@ -68569,41 +68631,41 @@ var powerMeterCapability = {
68569
68631
  },
68570
68632
  runtimeState: PowerMeterStatusSchema,
68571
68633
  /**
68572
- * Runtime-state durability: **restored** — as `numeric-sensor`; `kwhTotal` is an accumulator whose restored value is the baseline.
68634
+ * Runtime-state durability: **restored** — as `numeric-sensor`; `energy` is an accumulator whose restored value is the baseline.
68573
68635
  *
68574
68636
  * See `RuntimeStateDurability`. Enforced by
68575
68637
  * `scripts/check-runtime-state-durability.ts`.
68576
68638
  */
68577
68639
  durability: "restored",
68578
68640
  /**
68579
- * History (D850): recorded series. Gauges are floored at 30 s; `kwhTotal` is the one monotonic meter (counter).
68641
+ * History (D850): recorded series. Gauges are floored at 30 s; `energy` is the one monotonic meter (counter).
68580
68642
  */
68581
68643
  history: { fields: {
68582
- watts: {
68644
+ power: {
68583
68645
  kind: "gauge",
68584
68646
  unit: "W",
68585
68647
  deadband: 1,
68586
68648
  minIntervalMs: 3e4
68587
68649
  },
68588
- kwhTotal: {
68650
+ energy: {
68589
68651
  kind: "counter",
68590
68652
  unit: "kWh",
68591
68653
  deadband: .01,
68592
68654
  minIntervalMs: 6e4
68593
68655
  },
68594
- volts: {
68656
+ voltage: {
68595
68657
  kind: "gauge",
68596
68658
  unit: "V",
68597
68659
  deadband: 1,
68598
68660
  minIntervalMs: 3e4
68599
68661
  },
68600
- amps: {
68662
+ current: {
68601
68663
  kind: "gauge",
68602
68664
  unit: "A",
68603
68665
  deadband: .05,
68604
68666
  minIntervalMs: 3e4
68605
68667
  },
68606
- va: {
68668
+ apparentPower: {
68607
68669
  kind: "gauge",
68608
68670
  unit: "VA",
68609
68671
  deadband: 1,
@@ -68653,9 +68715,6 @@ var PresenceStatusSchema = object({
68653
68715
  location: string().nullable(),
68654
68716
  /** GPS coordinates when available. Null otherwise. */
68655
68717
  gps: GpsLocationSchema.nullable(),
68656
- /** Optional battery level of the tracking device (0..100). Null
68657
- * when not reported. */
68658
- batteryPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
68659
68718
  /** Ms epoch when the slice was last updated. */
68660
68719
  lastChangedAt: number()
68661
68720
  });
@@ -68684,14 +68743,7 @@ var presenceCapability = {
68684
68743
  * `scripts/check-runtime-state-durability.ts`.
68685
68744
  */
68686
68745
  durability: "restored",
68687
- /**
68688
- * History (D850): recorded series.
68689
- */
68690
- history: { fields: { batteryPercent: {
68691
- kind: "gauge",
68692
- unit: "%",
68693
- deadband: 1
68694
- } } },
68746
+ history: "none",
68695
68747
  /** Clock fields: written, but excluded from the compare that decides
68696
68748
  * whether persisting is worth a SQLite commit. */
68697
68749
  volatileStateFields: ["lastChangedAt"]
@@ -68706,7 +68758,7 @@ var presenceCapability = {
68706
68758
  */
68707
68759
  var PressureSensorStatusSchema = object({
68708
68760
  /** Current pressure in hPa. `null` when the sample was refused (D393). */
68709
- hpa: number().nullable().meta(readingMeta("pressure", { precision: 0 })),
68761
+ pressure: number().nullable().meta(readingMeta("pressure", { precision: 0 })),
68710
68762
  /** Ms epoch when the slice was last updated. */
68711
68763
  lastFetchedAt: number()
68712
68764
  });
@@ -68732,7 +68784,7 @@ var pressureSensorCapability = {
68732
68784
  /**
68733
68785
  * History (D850): recorded series.
68734
68786
  */
68735
- history: { fields: { hpa: {
68787
+ history: { fields: { pressure: {
68736
68788
  kind: "gauge",
68737
68789
  unit: "hPa",
68738
68790
  deadband: .1
@@ -72481,7 +72533,7 @@ var tamperCapability = {
72481
72533
  */
72482
72534
  var TemperatureSensorStatusSchema = object({
72483
72535
  /** Current temperature in Celsius. `null` when the sample was refused (D393). */
72484
- celsius: number().nullable().meta(readingMeta("temperature", {
72536
+ temperature: number().nullable().meta(readingMeta("temperature", {
72485
72537
  precision: 1,
72486
72538
  label: "Temperature"
72487
72539
  })),
@@ -72510,7 +72562,7 @@ var temperatureSensorCapability = {
72510
72562
  /**
72511
72563
  * History (D850): recorded series.
72512
72564
  */
72513
- history: { fields: { celsius: {
72565
+ history: { fields: { temperature: {
72514
72566
  kind: "gauge",
72515
72567
  unit: "°C",
72516
72568
  deadband: .1
@@ -72807,7 +72859,7 @@ var VacuumControlStatusSchema = object({
72807
72859
  /** Speed tokens the hardware accepts — drives the UI selector. */
72808
72860
  availableFanSpeeds: array(string()),
72809
72861
  /** 0..100 cleaning-completion percentage of the current task, or null. */
72810
- progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
72862
+ progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
72811
72863
  /** Current error code (0 / null = no error). */
72812
72864
  errorCode: number().nullable().meta(readingMeta("none")),
72813
72865
  /** Human label for {@link errorCode}, or null when none / undecodable. */
@@ -74514,7 +74566,7 @@ var BaseDevice = class {
74514
74566
  * `device-local-state.ts`. Drivers access via:
74515
74567
  *
74516
74568
  * `this.state.battery.sleeping = true` // patches the battery slice
74517
- * `const pct = this.state.battery.percentage` // reads the battery slice
74569
+ * `const pct = this.state.battery.level` // reads the battery slice
74518
74570
  * `this.state.deviceStatus.online = true` // mirrors `markOnline(true)`
74519
74571
  *
74520
74572
  * Adding a new cap with `runtimeState:` automatically extends this
@@ -74554,7 +74606,7 @@ var BaseDevice = class {
74554
74606
  * shape; drivers don't redeclare it, they just write through.
74555
74607
  *
74556
74608
  * Read: `this.runtimeState.getCapState('battery')` →
74557
- * `{percentage, charging, sleeping, lastUpdated}` for any
74609
+ * `{level, charging, sleeping, lastUpdated}` for any
74558
74610
  * provider that registers `batteryCapability`.
74559
74611
  * Write: `this.runtimeState.setCapState('battery', { … })`.
74560
74612
  *
@@ -85274,7 +85326,7 @@ var ACTUATOR_CAP_VOCABULARY = {
85274
85326
  label: t("Full brightness", "Luminosità massima"),
85275
85327
  phrase: t("Set {device} to full brightness", "Porta {device} alla massima luminosità"),
85276
85328
  icon: "sun",
85277
- args: { percentage: 100 }
85329
+ args: { level: 100 }
85278
85330
  },
85279
85331
  {
85280
85332
  id: "brightness.half",
@@ -85282,7 +85334,7 @@ var ACTUATOR_CAP_VOCABULARY = {
85282
85334
  label: t("Half brightness", "Luminosità a metà"),
85283
85335
  phrase: t("Dim {device} to half", "Abbassa {device} a metà luminosità"),
85284
85336
  icon: "sun-dim",
85285
- args: { percentage: 50 }
85337
+ args: { level: 50 }
85286
85338
  },
85287
85339
  {
85288
85340
  id: "brightness.off",
@@ -85290,16 +85342,16 @@ var ACTUATOR_CAP_VOCABULARY = {
85290
85342
  label: t("Brightness off", "Luminosità a zero"),
85291
85343
  phrase: t("Dim {device} to zero", "Abbassa {device} a zero"),
85292
85344
  icon: "lightbulb-off",
85293
- args: { percentage: 0 }
85345
+ args: { level: 0 }
85294
85346
  },
85295
85347
  {
85296
85348
  id: "brightness.set",
85297
85349
  method: "setBrightness",
85298
85350
  label: t("Set brightness", "Imposta la luminosità"),
85299
- phrase: t("Set the brightness of {device} to {percentage}", "Imposta la luminosità di {device} a {percentage}"),
85351
+ phrase: t("Set the brightness of {device} to {level}", "Imposta la luminosità di {device} a {level}"),
85300
85352
  icon: "sun-medium",
85301
85353
  openArgs: [{
85302
- key: "percentage",
85354
+ key: "level",
85303
85355
  label: PERCENT,
85304
85356
  offer: {
85305
85357
  kind: "number",
@@ -85313,13 +85365,13 @@ var ACTUATOR_CAP_VOCABULARY = {
85313
85365
  ],
85314
85366
  state: [{
85315
85367
  kind: "numeric",
85316
- field: "percentage",
85368
+ field: "level",
85317
85369
  quantity: t("the brightness", "la luminosità"),
85318
85370
  label: t("Brightness", "Luminosità"),
85319
85371
  unit: "%",
85320
85372
  icon: "sun"
85321
85373
  }],
85322
- events: { onBrightnessChanged: { notOperatorFacing: "the `percentage` state trigger reads the same change" } }
85374
+ events: { onBrightnessChanged: { notOperatorFacing: "the `level` state trigger reads the same change" } }
85323
85375
  },
85324
85376
  color: {
85325
85377
  scope: "device",
@@ -85333,7 +85385,7 @@ var ACTUATOR_CAP_VOCABULARY = {
85333
85385
  icon: "sun",
85334
85386
  args: { color: {
85335
85387
  mode: "mired",
85336
- mireds: 370
85388
+ colorTemperature: 370
85337
85389
  } }
85338
85390
  },
85339
85391
  {
@@ -85344,7 +85396,7 @@ var ACTUATOR_CAP_VOCABULARY = {
85344
85396
  icon: "snowflake",
85345
85397
  args: { color: {
85346
85398
  mode: "mired",
85347
- mireds: 200
85399
+ colorTemperature: 200
85348
85400
  } }
85349
85401
  },
85350
85402
  {
@@ -85958,7 +86010,7 @@ var ACTUATOR_CAP_VOCABULARY = {
85958
86010
  label: t("Fan off", "Ventilatore spento"),
85959
86011
  phrase: t("Stop {device}", "Ferma {device}"),
85960
86012
  icon: "power-off",
85961
- args: { percentage: 0 }
86013
+ args: { speed: 0 }
85962
86014
  },
85963
86015
  {
85964
86016
  id: "fan.full",
@@ -85966,16 +86018,16 @@ var ACTUATOR_CAP_VOCABULARY = {
85966
86018
  label: t("Fan full", "Ventilatore al massimo"),
85967
86019
  phrase: t("Run {device} at full speed", "Porta {device} alla massima velocità"),
85968
86020
  icon: "fan",
85969
- args: { percentage: 100 }
86021
+ args: { speed: 100 }
85970
86022
  },
85971
86023
  {
85972
86024
  id: "fan.speed",
85973
86025
  method: "setPercentage",
85974
86026
  label: t("Set speed", "Imposta la velocità"),
85975
- phrase: t("Set the speed of {device} to {percentage}", "Imposta la velocità di {device} al {percentage}"),
86027
+ phrase: t("Set the speed of {device} to {speed}", "Imposta la velocità di {device} al {speed}"),
85976
86028
  icon: "fan",
85977
86029
  openArgs: [{
85978
- key: "percentage",
86030
+ key: "speed",
85979
86031
  label: t("Speed", "Velocità"),
85980
86032
  offer: {
85981
86033
  kind: "number",
@@ -86037,7 +86089,7 @@ var ACTUATOR_CAP_VOCABULARY = {
86037
86089
  ],
86038
86090
  state: [{
86039
86091
  kind: "numeric",
86040
- field: "percentage",
86092
+ field: "speed",
86041
86093
  quantity: t("the speed", "la velocità"),
86042
86094
  label: t("Speed", "Velocità"),
86043
86095
  unit: "%",
@@ -86835,7 +86887,7 @@ var APPLIANCE_CAP_VOCABULARY = {
86835
86887
  },
86836
86888
  {
86837
86889
  kind: "numeric",
86838
- field: "progressPercent",
86890
+ field: "progress",
86839
86891
  quantity: t("the cycle progress", "l’avanzamento del lavaggio"),
86840
86892
  label: t("Progress", "Avanzamento"),
86841
86893
  unit: "%",
@@ -87193,10 +87245,10 @@ var APPLIANCE_CAP_VOCABULARY = {
87193
87245
  id: "media.seek",
87194
87246
  method: "seek",
87195
87247
  label: t("Seek", "Vai al punto"),
87196
- phrase: t("Move {device} to {positionMs}", "Porta {device} al punto {positionMs}"),
87248
+ phrase: t("Move {device} to {position}", "Porta {device} al punto {position}"),
87197
87249
  icon: "fast-forward",
87198
87250
  openArgs: [{
87199
- key: "positionMs",
87251
+ key: "position",
87200
87252
  label: t("Position", "Posizione"),
87201
87253
  offer: {
87202
87254
  kind: "number",
@@ -88245,7 +88297,7 @@ var SENSOR_CAP_VOCABULARY = {
88245
88297
  state: [
88246
88298
  {
88247
88299
  kind: "numeric",
88248
- field: "co2Ppm",
88300
+ field: "co2",
88249
88301
  quantity: t("the CO₂", "la CO₂"),
88250
88302
  label: t("CO₂", "CO₂"),
88251
88303
  unit: "ppm",
@@ -88253,7 +88305,7 @@ var SENSOR_CAP_VOCABULARY = {
88253
88305
  },
88254
88306
  {
88255
88307
  kind: "numeric",
88256
- field: "vocPpb",
88308
+ field: "voc",
88257
88309
  quantity: t("the VOC level", "il livello di COV"),
88258
88310
  label: t("VOC", "COV"),
88259
88311
  unit: "ppb",
@@ -88289,7 +88341,7 @@ var SENSOR_CAP_VOCABULARY = {
88289
88341
  noun: t("Light level", "Luminosità ambiente"),
88290
88342
  state: [{
88291
88343
  kind: "numeric",
88292
- field: "lux",
88344
+ field: "illuminance",
88293
88345
  quantity: t("the light level", "la luminosità"),
88294
88346
  label: t("Illuminance", "Illuminamento"),
88295
88347
  unit: "lx",
@@ -88492,7 +88544,7 @@ var SENSOR_CAP_VOCABULARY = {
88492
88544
  noun: t("Humidity", "Umidità"),
88493
88545
  state: [{
88494
88546
  kind: "numeric",
88495
- field: "percent",
88547
+ field: "humidity",
88496
88548
  quantity: t("the humidity", "l’umidità"),
88497
88549
  label: t("Humidity", "Umidità"),
88498
88550
  unit: "%",
@@ -88540,7 +88592,7 @@ var SENSOR_CAP_VOCABULARY = {
88540
88592
  state: [
88541
88593
  {
88542
88594
  kind: "numeric",
88543
- field: "watts",
88595
+ field: "power",
88544
88596
  quantity: t("the power draw", "il consumo"),
88545
88597
  label: t("Power", "Potenza"),
88546
88598
  unit: "W",
@@ -88548,7 +88600,7 @@ var SENSOR_CAP_VOCABULARY = {
88548
88600
  },
88549
88601
  {
88550
88602
  kind: "numeric",
88551
- field: "kwhTotal",
88603
+ field: "energy",
88552
88604
  quantity: t("the energy used", "l’energia consumata"),
88553
88605
  label: t("Energy", "Energia"),
88554
88606
  unit: "kWh",
@@ -88556,7 +88608,7 @@ var SENSOR_CAP_VOCABULARY = {
88556
88608
  },
88557
88609
  {
88558
88610
  kind: "numeric",
88559
- field: "volts",
88611
+ field: "voltage",
88560
88612
  quantity: t("the voltage", "la tensione"),
88561
88613
  label: t("Voltage", "Tensione"),
88562
88614
  unit: "V",
@@ -88564,7 +88616,7 @@ var SENSOR_CAP_VOCABULARY = {
88564
88616
  },
88565
88617
  {
88566
88618
  kind: "numeric",
88567
- field: "amps",
88619
+ field: "current",
88568
88620
  quantity: t("the current", "la corrente"),
88569
88621
  label: t("Current", "Corrente"),
88570
88622
  unit: "A",
@@ -88581,13 +88633,6 @@ var SENSOR_CAP_VOCABULARY = {
88581
88633
  label: t("Where", "Posizione"),
88582
88634
  phrase: t("When {device} is at {value}", "Quando {device} è in {value}"),
88583
88635
  icon: "map-pin"
88584
- }, {
88585
- kind: "numeric",
88586
- field: "batteryPercent",
88587
- quantity: t("the phone battery", "la batteria del telefono"),
88588
- label: t("Battery", "Batteria"),
88589
- unit: "%",
88590
- icon: "battery"
88591
88636
  }]
88592
88637
  },
88593
88638
  "pressure-sensor": {
@@ -88595,7 +88640,7 @@ var SENSOR_CAP_VOCABULARY = {
88595
88640
  noun: t("Pressure", "Pressione"),
88596
88641
  state: [{
88597
88642
  kind: "numeric",
88598
- field: "hpa",
88643
+ field: "pressure",
88599
88644
  quantity: t("the pressure", "la pressione"),
88600
88645
  label: t("Pressure", "Pressione"),
88601
88646
  unit: "hPa",
@@ -88631,7 +88676,7 @@ var SENSOR_CAP_VOCABULARY = {
88631
88676
  noun: t("Temperature", "Temperatura"),
88632
88677
  state: [{
88633
88678
  kind: "numeric",
88634
- field: "celsius",
88679
+ field: "temperature",
88635
88680
  quantity: t("the temperature", "la temperatura"),
88636
88681
  label: t("Temperature", "Temperatura"),
88637
88682
  unit: "°C",
@@ -88702,7 +88747,7 @@ var SENSOR_CAP_VOCABULARY = {
88702
88747
  state: [
88703
88748
  {
88704
88749
  kind: "numeric",
88705
- field: "percentage",
88750
+ field: "level",
88706
88751
  quantity: t("the battery level", "il livello della batteria"),
88707
88752
  label: t("Battery", "Batteria"),
88708
88753
  unit: "%",
@@ -88744,7 +88789,7 @@ var SENSOR_CAP_VOCABULARY = {
88744
88789
  icon: "battery-charging"
88745
88790
  }
88746
88791
  ],
88747
- events: { onStatusChanged: { notOperatorFacing: "the percentage / sleeping / charging state triggers each read one field of this change" } },
88792
+ events: { onStatusChanged: { notOperatorFacing: "the level / sleeping / charging state triggers each read one field of this change" } },
88748
88793
  extraEvents: [{
88749
88794
  category: EventCategory.DeviceAwake,
88750
88795
  label: t("Woke up", "Risvegliato"),
@@ -88762,7 +88807,7 @@ var SENSOR_CAP_VOCABULARY = {
88762
88807
  noun: t("Network link", "Collegamento di rete"),
88763
88808
  state: [{
88764
88809
  kind: "numeric",
88765
- field: "signalPercent",
88810
+ field: "signal",
88766
88811
  quantity: t("the signal strength", "l’intensità del segnale"),
88767
88812
  label: t("Signal", "Segnale"),
88768
88813
  unit: "%",
@@ -92133,6 +92178,33 @@ function isAudioClassName(name) {
92133
92178
  return name.trim().toLowerCase().startsWith(`${AUDIO_GROUP_KEY}-`);
92134
92179
  }
92135
92180
  new Set(["devices", "classes"]);
92181
+ function valueFor(param, raw) {
92182
+ switch (param.type) {
92183
+ case "enum": return typeof raw === "string" && (param.options ?? []).some((o) => o.value === raw) ? raw : void 0;
92184
+ case "number": {
92185
+ if (typeof raw !== "number" || !Number.isFinite(raw)) return void 0;
92186
+ const floor = param.min ?? Number.NEGATIVE_INFINITY;
92187
+ const ceil = param.max ?? Number.POSITIVE_INFINITY;
92188
+ return Math.min(ceil, Math.max(floor, raw));
92189
+ }
92190
+ case "boolean": return typeof raw === "boolean" ? raw : void 0;
92191
+ case "string": return typeof raw === "string" && raw.length > 0 ? raw : void 0;
92192
+ }
92193
+ }
92194
+ /**
92195
+ * The values a rule target's `params` contribute for a kind: only declared
92196
+ * keys, only valid values. `undefined` when nothing survives — a notifier that
92197
+ * declared nothing is never handed a `delivery` block.
92198
+ */
92199
+ function resolveDeliveryParams(declared, params) {
92200
+ if (declared === void 0 || params === void 0) return void 0;
92201
+ const out = {};
92202
+ for (const param of declared) {
92203
+ const value = valueFor(param, params[param.key]);
92204
+ if (value !== void 0) out[param.key] = value;
92205
+ }
92206
+ return Object.keys(out).length > 0 ? out : void 0;
92207
+ }
92136
92208
  /**
92137
92209
  * WHICH narrowing filter speaks about WHICH system-event kind — one predicate,
92138
92210
  * consumed by the rule ENGINE and by every rule EDITOR.
@@ -98558,6 +98630,12 @@ Object.defineProperty(exports, "resolveClusterModelPin", {
98558
98630
  return resolveClusterModelPin;
98559
98631
  }
98560
98632
  });
98633
+ Object.defineProperty(exports, "resolveDeliveryParams", {
98634
+ enumerable: true,
98635
+ get: function() {
98636
+ return resolveDeliveryParams;
98637
+ }
98638
+ });
98561
98639
  Object.defineProperty(exports, "resolveLocationMode", {
98562
98640
  enumerable: true,
98563
98641
  get: function() {