@camstack/addon-provider-bosch 0.1.30 → 0.1.32

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.
@@ -1,5 +1,5 @@
1
1
  import "node:crypto";
2
- //#region ../types/dist/event-category-hdMR7CTW.mjs
2
+ //#region ../types/dist/event-category-DmZDPDf_.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -626,7 +626,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
626
626
  * (a track was promoted to a stationary-registry entry) or departs (the
627
627
  * object moved / was removed). Telemetry (D8): lossy, drives a UI refresh of
628
628
  * the dedicated "Stationary" section — never the live event feed. Payload:
629
- * `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp }`.
629
+ * `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp, observedAt, zones }`.
630
630
  */
631
631
  EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
632
632
  /**
@@ -5447,7 +5447,7 @@ var ZodIssueCode = {
5447
5447
  var ZodFirstPartyTypeKind;
5448
5448
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5449
5449
  //#endregion
5450
- //#region ../types/dist/sleep-BHjNez61.mjs
5450
+ //#region ../types/dist/sleep-Crlmu_tO.mjs
5451
5451
  /**
5452
5452
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5453
5453
  * window to float samples (D455).
@@ -8783,11 +8783,11 @@ var CAP_NAMES = Object.freeze([
8783
8783
  Object.freeze({
8784
8784
  "air-quality-sensor": [
8785
8785
  {
8786
- "path": "co2Ppm",
8786
+ "path": "co2",
8787
8787
  "valueType": "number"
8788
8788
  },
8789
8789
  {
8790
- "path": "vocPpb",
8790
+ "path": "voc",
8791
8791
  "valueType": "number"
8792
8792
  },
8793
8793
  {
@@ -8837,7 +8837,7 @@ Object.freeze({
8837
8837
  }
8838
8838
  ],
8839
8839
  "ambient-light-sensor": [{
8840
- "path": "lux",
8840
+ "path": "illuminance",
8841
8841
  "valueType": "number"
8842
8842
  }],
8843
8843
  "audio-metrics": [
@@ -8898,7 +8898,7 @@ Object.freeze({
8898
8898
  ],
8899
8899
  "battery": [
8900
8900
  {
8901
- "path": "percentage",
8901
+ "path": "level",
8902
8902
  "valueType": "number"
8903
8903
  },
8904
8904
  {
@@ -8920,7 +8920,7 @@ Object.freeze({
8920
8920
  "valueType": "number"
8921
8921
  },
8922
8922
  {
8923
- "path": "volts",
8923
+ "path": "voltage",
8924
8924
  "valueType": "number"
8925
8925
  },
8926
8926
  {
@@ -8941,7 +8941,7 @@ Object.freeze({
8941
8941
  "valueType": "boolean"
8942
8942
  }],
8943
8943
  "brightness": [{
8944
- "path": "percentage",
8944
+ "path": "level",
8945
8945
  "valueType": "number"
8946
8946
  }],
8947
8947
  "broker": [{
@@ -9142,7 +9142,7 @@ Object.freeze({
9142
9142
  "valueType": "number"
9143
9143
  },
9144
9144
  {
9145
- "path": "mireds",
9145
+ "path": "colorTemperature",
9146
9146
  "valueType": "number"
9147
9147
  }
9148
9148
  ],
@@ -9321,15 +9321,15 @@ Object.freeze({
9321
9321
  "valueType": "string"
9322
9322
  },
9323
9323
  {
9324
- "path": "remainingSeconds",
9324
+ "path": "remaining",
9325
9325
  "valueType": "number"
9326
9326
  },
9327
9327
  {
9328
- "path": "delayedStartSeconds",
9328
+ "path": "delayedStart",
9329
9329
  "valueType": "number"
9330
9330
  },
9331
9331
  {
9332
- "path": "progressPercent",
9332
+ "path": "progress",
9333
9333
  "valueType": "number"
9334
9334
  },
9335
9335
  {
@@ -9443,7 +9443,7 @@ Object.freeze({
9443
9443
  ],
9444
9444
  "fan-control": [
9445
9445
  {
9446
- "path": "percentage",
9446
+ "path": "speed",
9447
9447
  "valueType": "number"
9448
9448
  },
9449
9449
  {
@@ -9543,7 +9543,7 @@ Object.freeze({
9543
9543
  }
9544
9544
  ],
9545
9545
  "humidity-sensor": [{
9546
- "path": "percent",
9546
+ "path": "humidity",
9547
9547
  "valueType": "number"
9548
9548
  }],
9549
9549
  "image": [{
@@ -9653,7 +9653,7 @@ Object.freeze({
9653
9653
  "valueType": "number"
9654
9654
  },
9655
9655
  {
9656
- "path": "progressPercent",
9656
+ "path": "progress",
9657
9657
  "valueType": "number"
9658
9658
  },
9659
9659
  {
@@ -9732,11 +9732,11 @@ Object.freeze({
9732
9732
  "valueType": "string"
9733
9733
  },
9734
9734
  {
9735
- "path": "positionMs",
9735
+ "path": "position",
9736
9736
  "valueType": "number"
9737
9737
  },
9738
9738
  {
9739
- "path": "durationMs",
9739
+ "path": "duration",
9740
9740
  "valueType": "number"
9741
9741
  },
9742
9742
  {
@@ -9838,11 +9838,11 @@ Object.freeze({
9838
9838
  ]
9839
9839
  },
9840
9840
  {
9841
- "path": "signalPercent",
9841
+ "path": "signal",
9842
9842
  "valueType": "number"
9843
9843
  },
9844
9844
  {
9845
- "path": "rssiDbm",
9845
+ "path": "rssi",
9846
9846
  "valueType": "number"
9847
9847
  },
9848
9848
  {
@@ -9973,23 +9973,23 @@ Object.freeze({
9973
9973
  ],
9974
9974
  "power-meter": [
9975
9975
  {
9976
- "path": "watts",
9976
+ "path": "power",
9977
9977
  "valueType": "number"
9978
9978
  },
9979
9979
  {
9980
- "path": "kwhTotal",
9980
+ "path": "energy",
9981
9981
  "valueType": "number"
9982
9982
  },
9983
9983
  {
9984
- "path": "volts",
9984
+ "path": "voltage",
9985
9985
  "valueType": "number"
9986
9986
  },
9987
9987
  {
9988
- "path": "amps",
9988
+ "path": "current",
9989
9989
  "valueType": "number"
9990
9990
  },
9991
9991
  {
9992
- "path": "va",
9992
+ "path": "apparentPower",
9993
9993
  "valueType": "number"
9994
9994
  },
9995
9995
  {
@@ -10017,14 +10017,10 @@ Object.freeze({
10017
10017
  {
10018
10018
  "path": "gps.accuracyMeters",
10019
10019
  "valueType": "number"
10020
- },
10021
- {
10022
- "path": "batteryPercent",
10023
- "valueType": "number"
10024
10020
  }
10025
10021
  ],
10026
10022
  "pressure-sensor": [{
10027
- "path": "hpa",
10023
+ "path": "pressure",
10028
10024
  "valueType": "number"
10029
10025
  }],
10030
10026
  "privacy-mask": [{
@@ -10338,7 +10334,7 @@ Object.freeze({
10338
10334
  "valueType": "boolean"
10339
10335
  }],
10340
10336
  "temperature-sensor": [{
10341
- "path": "celsius",
10337
+ "path": "temperature",
10342
10338
  "valueType": "number"
10343
10339
  }],
10344
10340
  "update": [
@@ -10386,7 +10382,7 @@ Object.freeze({
10386
10382
  "valueType": "string"
10387
10383
  },
10388
10384
  {
10389
- "path": "progressPercent",
10385
+ "path": "progress",
10390
10386
  "valueType": "number"
10391
10387
  },
10392
10388
  {
@@ -10871,7 +10867,7 @@ function errMsg(err) {
10871
10867
  return String(err);
10872
10868
  }
10873
10869
  //#endregion
10874
- //#region ../types/dist/composition-Bb8iwHEJ.mjs
10870
+ //#region ../types/dist/composition-CZImLpOI.mjs
10875
10871
  /**
10876
10872
  * The ffmpeg build every CamStack node downloads, per platform and arch.
10877
10873
  *
@@ -15391,6 +15387,14 @@ var AutomationConditionLeafSchema = object({
15391
15387
  array(union([string(), number()]))
15392
15388
  ])
15393
15389
  });
15390
+ var AutomationConditionStationaryPresentSchema = object({
15391
+ kind: literal("stationary-present"),
15392
+ deviceId: number().int().nonnegative(),
15393
+ /** Class names; a macro class matches every raw class that maps to it. */
15394
+ classes: array(string().min(1)).min(1).optional(),
15395
+ /** The parked object must be in at least one of these zones. */
15396
+ zones: array(string().min(1)).min(1).optional()
15397
+ });
15394
15398
  /**
15395
15399
  * The expression leaf, declared as a plain object rather than an intersection
15396
15400
  * with {@link ExpressionSourceSchema}: a discriminated union has to be able to
@@ -15424,7 +15428,8 @@ var AutomationConditionSchema = lazy(() => discriminatedUnion("kind", [
15424
15428
  child: AutomationConditionSchema
15425
15429
  }),
15426
15430
  AutomationConditionLeafSchema,
15427
- AutomationConditionExpressionSchema
15431
+ AutomationConditionExpressionSchema,
15432
+ AutomationConditionStationaryPresentSchema
15428
15433
  ]));
15429
15434
  /**
15430
15435
  * What starts a run.
@@ -15478,6 +15483,17 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
15478
15483
  /** Best-so-far confidence the track must reach. */
15479
15484
  minScore: number().min(0).max(1).optional()
15480
15485
  }),
15486
+ object({
15487
+ kind: literal("stationary"),
15488
+ deviceIds: array(number().int().nonnegative()).min(1),
15489
+ /** Class names; a macro class matches like the detection trigger. */
15490
+ classes: array(string().min(1)).min(1).optional(),
15491
+ /** The parked object must be in at least one of these zones. */
15492
+ zones: array(string().min(1)).min(1).optional(),
15493
+ /** `appeared`: it became parked. `departed`: the registry retired it.
15494
+ * The vocabulary of `PipelineAnalyticsStationaryChanged`. */
15495
+ phase: _enum(["appeared", "departed"])
15496
+ }),
15481
15497
  object({
15482
15498
  kind: literal("interval"),
15483
15499
  minutes: number().int().min(1).max(1440)
@@ -15687,7 +15703,8 @@ var AutomationConditionTraceNodeSchema = object({
15687
15703
  "any",
15688
15704
  "not",
15689
15705
  "condition",
15690
- "expression"
15706
+ "expression",
15707
+ "stationary-present"
15691
15708
  ]),
15692
15709
  outcome: TraceNodeOutcomeSchema,
15693
15710
  reason: string(),
@@ -18586,7 +18603,7 @@ var CompositionEventPlanSchema = object({
18586
18603
  stateField: string(),
18587
18604
  fieldKey: string()
18588
18605
  });
18589
- /** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.celsius`. */
18606
+ /** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.temperature`. */
18590
18607
  var CompositionProblemSchema = object({
18591
18608
  code: _enum([
18592
18609
  "reserved-variant",
@@ -18905,7 +18922,7 @@ var GROUP_TEMPLATES = [
18905
18922
  summary: "Mean, median, min, max or sum of temperatures. Offline and unknown members are left out, never read as 0 °C.",
18906
18923
  role: DeviceRole.TemperatureSensor,
18907
18924
  outputCap: "temperature-sensor",
18908
- outputField: "celsius",
18925
+ outputField: "temperature",
18909
18926
  quantity: "temperature",
18910
18927
  defaultAggregate: "mean",
18911
18928
  empty: "null",
@@ -18916,7 +18933,7 @@ var GROUP_TEMPLATES = [
18916
18933
  summary: "Humidity in percent. Offline and unknown members are left out, never read as 0 %.",
18917
18934
  role: DeviceRole.HumiditySensor,
18918
18935
  outputCap: "humidity-sensor",
18919
- outputField: "percent",
18936
+ outputField: "humidity",
18920
18937
  quantity: "humidity",
18921
18938
  defaultAggregate: "mean",
18922
18939
  empty: "null",
@@ -18927,7 +18944,7 @@ var GROUP_TEMPLATES = [
18927
18944
  summary: "Pressure in hectopascals. Offline and unknown members are left out, never read as 0 hPa.",
18928
18945
  role: DeviceRole.PressureSensor,
18929
18946
  outputCap: "pressure-sensor",
18930
- outputField: "hpa",
18947
+ outputField: "pressure",
18931
18948
  quantity: "pressure",
18932
18949
  defaultAggregate: "mean",
18933
18950
  empty: "null",
@@ -18938,7 +18955,7 @@ var GROUP_TEMPLATES = [
18938
18955
  summary: "Illuminance in lux. Offline and unknown members are left out, never read as 0 lx.",
18939
18956
  role: DeviceRole.AmbientLightSensor,
18940
18957
  outputCap: "ambient-light-sensor",
18941
- outputField: "lux",
18958
+ outputField: "illuminance",
18942
18959
  quantity: "illuminance",
18943
18960
  defaultAggregate: "mean",
18944
18961
  empty: "null",
@@ -18949,7 +18966,7 @@ var GROUP_TEMPLATES = [
18949
18966
  summary: "Power in watts, summed by default. Nobody reporting omits the key rather than writing 0 W.",
18950
18967
  role: DeviceRole.PowerSensor,
18951
18968
  outputCap: "power-meter",
18952
- outputField: "watts",
18969
+ outputField: "power",
18953
18970
  quantity: "power",
18954
18971
  defaultAggregate: "sum",
18955
18972
  empty: "omit",
@@ -18960,7 +18977,7 @@ var GROUP_TEMPLATES = [
18960
18977
  summary: "Energy in kilowatt-hours, summed by default. Nobody reporting omits the key rather than writing 0 kWh.",
18961
18978
  role: DeviceRole.EnergySensor,
18962
18979
  outputCap: "power-meter",
18963
- outputField: "kwhTotal",
18980
+ outputField: "energy",
18964
18981
  quantity: "energy",
18965
18982
  defaultAggregate: "sum",
18966
18983
  empty: "omit",
@@ -18971,7 +18988,7 @@ var GROUP_TEMPLATES = [
18971
18988
  summary: "Battery charge in percent. Offline and unknown members are left out, never read as 0 %.",
18972
18989
  role: DeviceRole.BatterySensor,
18973
18990
  outputCap: "battery",
18974
- outputField: "percentage",
18991
+ outputField: "level",
18975
18992
  quantity: "percentage",
18976
18993
  defaultAggregate: "mean",
18977
18994
  empty: "null",
@@ -57502,9 +57519,9 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
57502
57519
  */
57503
57520
  var AirQualitySensorStatusSchema = object({
57504
57521
  /** Carbon dioxide concentration in ppm. */
57505
- co2Ppm: number().min(0).optional().meta(readingMeta("concentration-volume")),
57522
+ co2: number().min(0).optional().meta(readingMeta("concentration-volume")),
57506
57523
  /** Total volatile organic compounds in ppb. */
57507
- vocPpb: number().min(0).optional().meta(readingMeta("concentration-ppb")),
57524
+ voc: number().min(0).optional().meta(readingMeta("concentration-ppb")),
57508
57525
  /** Particulate matter ≤ 2.5 μm in µg/m³. */
57509
57526
  pm25: number().min(0).optional().meta(readingMeta("concentration-mass")),
57510
57527
  /** Particulate matter ≤ 10 μm in µg/m³. */
@@ -57537,12 +57554,12 @@ var airQualitySensorCapability = {
57537
57554
  * History (D850): recorded series.
57538
57555
  */
57539
57556
  history: { fields: {
57540
- co2Ppm: {
57557
+ co2: {
57541
57558
  kind: "gauge",
57542
57559
  unit: "ppm",
57543
57560
  deadband: 5
57544
57561
  },
57545
- vocPpb: {
57562
+ voc: {
57546
57563
  kind: "gauge",
57547
57564
  unit: "ppb",
57548
57565
  deadband: 5
@@ -57573,7 +57590,7 @@ var airQualitySensorCapability = {
57573
57590
  */
57574
57591
  var AmbientLightSensorStatusSchema = object({
57575
57592
  /** Current illuminance in lux (lx). `null` when the sample was refused (D393). */
57576
- lux: number().min(0).nullable().meta(readingMeta("illuminance", {
57593
+ illuminance: number().min(0).nullable().meta(readingMeta("illuminance", {
57577
57594
  precision: 0,
57578
57595
  label: "Illuminance"
57579
57596
  })),
@@ -57602,7 +57619,7 @@ var ambientLightSensorCapability = {
57602
57619
  /**
57603
57620
  * History (D850): recorded series. Wide range, so a RELATIVE deadband (10 %).
57604
57621
  */
57605
- history: { fields: { lux: {
57622
+ history: { fields: { illuminance: {
57606
57623
  kind: "gauge",
57607
57624
  unit: "lx",
57608
57625
  deadbandPct: 10,
@@ -57915,7 +57932,7 @@ var BatteryStatusSchema = object({
57915
57932
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
57916
57933
  * declines to band a non-finite reading, which is the correct shape.
57917
57934
  */
57918
- percentage: number().min(0).max(100).nullable().meta(readingMeta("percentage", { label: "Charge" })),
57935
+ level: number().min(0).max(100).nullable().meta(readingMeta("percentage", { label: "Charge" })),
57919
57936
  /**
57920
57937
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
57921
57938
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -57925,7 +57942,7 @@ var BatteryStatusSchema = object({
57925
57942
  * `'unknown'` is the absence of an answer: the provider has not read the
57926
57943
  * power fields yet, or the firmware reported neither. Before it existed,
57927
57944
  * two unreadable fields produced `'none'`, and a camera nobody had reached
57928
- * was drawn "on battery alone" — the same D315 defect `percentage` closed
57945
+ * was drawn "on battery alone" — the same D315 defect `level` closed
57929
57946
  * by going nullable. Consumers SKIP it (no charger state published, no
57930
57947
  * glyph, no HomeKit ChargingState) rather than coerce it either way.
57931
57948
  */
@@ -57949,7 +57966,7 @@ var BatteryStatusSchema = object({
57949
57966
  * that only report charge. A second reading on this cap, not a second
57950
57967
  * `numeric-sensor` on the same device.
57951
57968
  */
57952
- volts: number().nullable().optional().meta(readingMeta("voltage", { label: "Voltage" })),
57969
+ voltage: number().nullable().optional().meta(readingMeta("voltage", { label: "Voltage" })),
57953
57970
  /**
57954
57971
  * Ms epoch of the last time the device PROVED it was reachable — a
57955
57972
  * completed firmware round-trip, an observed wake, or an inbound push
@@ -57983,7 +58000,7 @@ var BatteryStatusSchema = object({
57983
58000
  /**
57984
58001
  * True when the source is a BINARY low-battery indicator (HA
57985
58002
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
57986
- * charge level — `percentage` is then a coarse stand-in (100 = normal,
58003
+ * charge level — `level` is then a coarse stand-in (100 = normal,
57987
58004
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
57988
58005
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
57989
58006
  */
@@ -58003,15 +58020,15 @@ var BATTERY_DEVICE_TYPES = [
58003
58020
  var batteryCustomize = {
58004
58021
  version: 1,
58005
58022
  targets: [{
58006
- id: "percentage",
58023
+ id: "level",
58007
58024
  cardinality: "scalar",
58008
58025
  vocabulary: {
58009
58026
  cap: "battery",
58010
- stateField: "percentage"
58027
+ stateField: "level"
58011
58028
  },
58012
58029
  deviceTypes: BATTERY_DEVICE_TYPES,
58013
58030
  apply: "add",
58014
- path: "percentage",
58031
+ path: "level",
58015
58032
  sources: [{
58016
58033
  kind: "field",
58017
58034
  valueKinds: ["number", "string"],
@@ -58105,7 +58122,7 @@ onStatusChanged: { data: object({
58105
58122
  schema: BatteryStatusSchema,
58106
58123
  kind: "push",
58107
58124
  empty: {
58108
- percentage: null,
58125
+ level: null,
58109
58126
  charging: "unknown",
58110
58127
  sleeping: false,
58111
58128
  lastUpdated: 0
@@ -58132,11 +58149,11 @@ onStatusChanged: { data: object({
58132
58149
  * History (D850): recorded series. The generic capture replaces the `battery` series of `pipeline-analytics:stats-5m`.
58133
58150
  */
58134
58151
  history: { fields: {
58135
- percentage: {
58152
+ level: {
58136
58153
  kind: "gauge",
58137
58154
  unit: "%"
58138
58155
  },
58139
- volts: {
58156
+ voltage: {
58140
58157
  kind: "gauge",
58141
58158
  unit: "V"
58142
58159
  }
@@ -58196,14 +58213,14 @@ var binaryCapability = {
58196
58213
  * controls to this single-method surface.
58197
58214
  *
58198
58215
  * The cap is intentionally minimal: a single `setBrightness({deviceId,
58199
- * percentage})` mutation plus the auto-injected `getStatus`. Drivers
58216
+ * level})` mutation plus the auto-injected `getStatus`. Drivers
58200
58217
  * that expose richer controls (color temperature, scenes, schedules)
58201
58218
  * should surface those via the device's `getSettingsUISchema()`
58202
58219
  * instead of bloating this cap.
58203
58220
  */
58204
58221
  var BrightnessStatusSchema = object({
58205
58222
  /** Current level as 0..100 inclusive. Firmware-reported. */
58206
- percentage: number().min(0).max(100).meta(readingMeta("percentage")),
58223
+ level: number().min(0).max(100).meta(readingMeta("percentage")),
58207
58224
  /** Ms epoch of the last operator-driven change. Useful for UI freshness. */
58208
58225
  lastChangedAt: number()
58209
58226
  });
@@ -58215,7 +58232,7 @@ var brightnessCapability = {
58215
58232
  deviceTypes: [DeviceType.Light],
58216
58233
  methods: { setBrightness: method(object({
58217
58234
  deviceId: number().int().nonnegative(),
58218
- percentage: number().min(0).max(100)
58235
+ level: number().min(0).max(100)
58219
58236
  }), _void(), {
58220
58237
  kind: "mutation",
58221
58238
  auth: "protected"
@@ -58228,7 +58245,7 @@ var brightnessCapability = {
58228
58245
  */
58229
58246
  onBrightnessChanged: { data: object({
58230
58247
  deviceId: number(),
58231
- percentage: number().min(0).max(100),
58248
+ level: number().min(0).max(100),
58232
58249
  lastChangedAt: number()
58233
58250
  }) } },
58234
58251
  status: {
@@ -58251,7 +58268,7 @@ onBrightnessChanged: { data: object({
58251
58268
  /**
58252
58269
  * History (D850): recorded series. Actuator tier: level keeps every change.
58253
58270
  */
58254
- history: { fields: { percentage: {
58271
+ history: { fields: { level: {
58255
58272
  kind: "gauge",
58256
58273
  unit: "%",
58257
58274
  minIntervalMs: 0
@@ -58848,11 +58865,11 @@ var ColorInputSchema = discriminatedUnion("mode", [
58848
58865
  }),
58849
58866
  object({
58850
58867
  mode: literal("mired"),
58851
- mireds: number().int().min(50).max(1e3)
58868
+ colorTemperature: number().int().min(50).max(1e3)
58852
58869
  })
58853
58870
  ]);
58854
58871
  var ColorStatusSchema = object({
58855
- /** Active color mode — which of `rgb` / `hsv` / `mireds` reflects
58872
+ /** Active color mode — which of `rgb` / `hsv` / `colorTemperature` reflects
58856
58873
  * the bulb's current state. */
58857
58874
  mode: _enum([
58858
58875
  "rgb",
@@ -58864,7 +58881,7 @@ var ColorStatusSchema = object({
58864
58881
  /** Populated when `mode === 'hsv'`. */
58865
58882
  hsv: HsvTripletSchema.optional(),
58866
58883
  /** Populated when `mode === 'mired'`. */
58867
- mireds: number().int().optional().meta(readingMeta("colour-temperature")),
58884
+ colorTemperature: number().int().optional().meta(readingMeta("colour-temperature")),
58868
58885
  /** Ms epoch of the last operator-driven change. */
58869
58886
  lastChangedAt: number()
58870
58887
  });
@@ -58896,7 +58913,7 @@ onColorChanged: { data: object({
58896
58913
  ]),
58897
58914
  rgb: RgbTripletSchema.optional(),
58898
58915
  hsv: HsvTripletSchema.optional(),
58899
- mireds: number().int().optional(),
58916
+ colorTemperature: number().int().optional(),
58900
58917
  lastChangedAt: number()
58901
58918
  }) } },
58902
58919
  status: {
@@ -59781,11 +59798,11 @@ var DishwasherStatusSchema = object({
59781
59798
  /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
59782
59799
  availablePrograms: array(string()),
59783
59800
  /** Seconds remaining on the active cycle, or null when not running / not known. */
59784
- remainingSeconds: number().int().nonnegative().nullable().meta(readingMeta("duration")),
59801
+ remaining: number().int().nonnegative().nullable().meta(readingMeta("duration")),
59785
59802
  /** Seconds the delayed start is set to (time until the cycle starts), or null. */
59786
- delayedStartSeconds: number().int().nonnegative().nullable().meta(readingMeta("duration")),
59803
+ delayedStart: number().int().nonnegative().nullable().meta(readingMeta("duration")),
59787
59804
  /** Cycle completion 0..100, or null when not applicable. */
59788
- progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
59805
+ progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
59789
59806
  /** True when the door is reported open; null when the door state is not known. */
59790
59807
  doorOpen: boolean().nullable(),
59791
59808
  /** True when the door is latched (locked) during a cycle; null when not reported. */
@@ -60004,14 +60021,14 @@ var dishwasherCapability = {
60004
60021
  runtimeState: DishwasherStatusSchema,
60005
60022
  durability: "session",
60006
60023
  history: { fields: {
60007
- progressPercent: {
60024
+ progress: {
60008
60025
  kind: "gauge",
60009
60026
  unit: "%",
60010
60027
  deadband: 2
60011
60028
  },
60012
60029
  state: { kind: "enum" },
60013
60030
  operationState: { kind: "enum" },
60014
- remainingSeconds: {
60031
+ remaining: {
60015
60032
  kind: "gauge",
60016
60033
  unit: "s",
60017
60034
  minIntervalMs: 6e4
@@ -60602,7 +60619,7 @@ var FanDirectionSchema = _enum(["forward", "reverse"]);
60602
60619
  var FanControlStatusSchema = object({
60603
60620
  /** Active speed as 0..100 inclusive. Null when the device has no
60604
60621
  * speed surface (single-speed fan). */
60605
- percentage: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
60622
+ speed: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
60606
60623
  /** Speed granularity the device accepts (HA `percentage_step`, e.g. 25 for
60607
60624
  * a 4-speed fan). Absent when unknown — the UI then falls back to step 1. */
60608
60625
  percentageStep: number().positive().optional().meta(readingMeta("percentage")),
@@ -60629,7 +60646,7 @@ var fanControlCapability = {
60629
60646
  methods: {
60630
60647
  setPercentage: method(object({
60631
60648
  deviceId: number().int().nonnegative(),
60632
- percentage: number().min(0).max(100)
60649
+ speed: number().min(0).max(100)
60633
60650
  }), _void(), {
60634
60651
  kind: "mutation",
60635
60652
  auth: "protected"
@@ -60662,7 +60679,7 @@ var fanControlCapability = {
60662
60679
  },
60663
60680
  /**
60664
60681
  * Runtime-state slice — mirrored by the kernel. UI fan speed
60665
- * sliders read `percentage` for live updates.
60682
+ * sliders read `speed` for live updates.
60666
60683
  */
60667
60684
  runtimeState: FanControlStatusSchema,
60668
60685
  /**
@@ -60676,7 +60693,7 @@ var fanControlCapability = {
60676
60693
  * History (D850): recorded series. Actuator tier: speed keeps every change.
60677
60694
  */
60678
60695
  history: { fields: {
60679
- percentage: {
60696
+ speed: {
60680
60697
  kind: "gauge",
60681
60698
  unit: "%",
60682
60699
  minIntervalMs: 0
@@ -61121,7 +61138,7 @@ var humidifierCapability = {
61121
61138
  */
61122
61139
  var HumiditySensorStatusSchema = object({
61123
61140
  /** Current relative humidity, 0..100. `null` when the sample was refused (D393). */
61124
- percent: number().min(0).max(100).nullable().meta(readingMeta("humidity", {
61141
+ humidity: number().min(0).max(100).nullable().meta(readingMeta("humidity", {
61125
61142
  precision: 0,
61126
61143
  label: "Humidity"
61127
61144
  })),
@@ -61150,7 +61167,7 @@ var humiditySensorCapability = {
61150
61167
  /**
61151
61168
  * History (D850): recorded series.
61152
61169
  */
61153
- history: { fields: { percent: {
61170
+ history: { fields: { humidity: {
61154
61171
  kind: "gauge",
61155
61172
  unit: "%",
61156
61173
  deadband: .5
@@ -61790,7 +61807,7 @@ var LawnMowerControlStatusSchema = object({
61790
61807
  batteryLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
61791
61808
  /** 0..100 mowing-completion percentage of the current task, or null when no
61792
61809
  * task is active / progress is unavailable. */
61793
- progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
61810
+ progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
61794
61811
  /** Current device/event code (dynamic — mostly status, sometimes an error),
61795
61812
  * or null when unknown. */
61796
61813
  currentCode: number().nullable().meta(readingMeta("none")),
@@ -62290,7 +62307,7 @@ var lockControlCapability = {
62290
62307
  volatileStateFields: ["lastChangedAt"]
62291
62308
  };
62292
62309
  /**
62293
- * A monotonic total between resets (D944). Energy uses `power-meter.kwhTotal`
62310
+ * A monotonic total between resets (D944). Energy uses `power-meter.energy`
62294
62311
  * so dashboards keep one series; every other instantaneous reading lands here.
62295
62312
  * `value` is the time integral in the source quantity's accumulated base
62296
62313
  * (base-unit seconds, or kWh on the power meter). `null` is a gap, never zero.
@@ -62384,10 +62401,10 @@ var MediaPlayerStatusSchema = object({
62384
62401
  currentMedia: MediaInfoSchema.nullable(),
62385
62402
  /** Current playback position in ms. Null when not seekable or
62386
62403
  * nothing is playing. Pair with `DeviceFeature.MediaPlayerSeek`. */
62387
- positionMs: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
62404
+ position: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
62388
62405
  /** Total duration of the current media in ms. Null when unknown
62389
62406
  * (live stream) or nothing is playing. */
62390
- durationMs: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
62407
+ duration: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
62391
62408
  /** Shuffle toggle. Null when no shuffle surface.
62392
62409
  * Pair with `DeviceFeature.MediaPlayerShuffle`. */
62393
62410
  shuffle: boolean().nullable(),
@@ -62426,7 +62443,7 @@ var mediaPlayerCapability = {
62426
62443
  }),
62427
62444
  seek: method(object({
62428
62445
  deviceId: number().int().nonnegative(),
62429
- positionMs: number().int().nonnegative()
62446
+ position: number().int().nonnegative()
62430
62447
  }), _void(), {
62431
62448
  kind: "mutation",
62432
62449
  auth: "protected"
@@ -62498,7 +62515,7 @@ var mediaPlayerCapability = {
62498
62515
  /**
62499
62516
  * History (D850): volume (a level an operator or an automation sets; the
62500
62517
  * default 10 s floor folds a slider drag into its end value) and mute.
62501
- * `positionMs` is not recorded: it moves continuously while playing.
62518
+ * `position` is not recorded: it moves continuously while playing.
62502
62519
  */
62503
62520
  history: { fields: {
62504
62521
  volumeLevel: {
@@ -63460,9 +63477,9 @@ var NetworkLinkStatusSchema = object({
63460
63477
  * one whose reading has not landed must not be drawn at 0 %. Consumers
63461
63478
  * SKIP a null rather than coerce it.
63462
63479
  */
63463
- signalPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
63480
+ signal: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
63464
63481
  /** Raw received signal strength in dBm, when the firmware reports one. */
63465
- rssiDbm: number().optional().meta(readingMeta("signal-level")),
63482
+ rssi: number().optional().meta(readingMeta("signal-level")),
63466
63483
  /** Network name of a wireless link, when the firmware reports it. */
63467
63484
  ssid: string().optional(),
63468
63485
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
@@ -63498,7 +63515,7 @@ onStatusChanged: { data: object({
63498
63515
  kind: "push",
63499
63516
  empty: {
63500
63517
  type: "unknown",
63501
- signalPercent: null,
63518
+ signal: null,
63502
63519
  lastUpdated: 0
63503
63520
  }
63504
63521
  },
@@ -63521,13 +63538,13 @@ onStatusChanged: { data: object({
63521
63538
  * History (D850): recorded series.
63522
63539
  */
63523
63540
  history: { fields: {
63524
- signalPercent: {
63541
+ signal: {
63525
63542
  kind: "gauge",
63526
63543
  unit: "%",
63527
63544
  deadband: 3,
63528
63545
  minIntervalMs: 6e4
63529
63546
  },
63530
- rssiDbm: {
63547
+ rssi: {
63531
63548
  kind: "gauge",
63532
63549
  unit: "dBm",
63533
63550
  deadband: 2,
@@ -64847,16 +64864,16 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
64847
64864
  * in real-world devices.
64848
64865
  */
64849
64866
  var PowerMeterStatusSchema = object({
64850
- /** Instantaneous power draw in watts. */
64851
- watts: number().optional().meta(readingMeta("power", { label: "Power" })),
64867
+ /** Instantaneous power draw (watts). */
64868
+ power: number().optional().meta(readingMeta("power", { label: "Power" })),
64852
64869
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
64853
- kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
64854
- /** Voltage in volts. */
64855
- volts: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
64870
+ energy: number().optional().meta(readingMeta("energy", { label: "Energy" })),
64871
+ /** Voltage (volts). */
64872
+ voltage: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
64856
64873
  /** Current in amperes. */
64857
- amps: number().optional().meta(readingMeta("current", { label: "Current" })),
64874
+ current: number().optional().meta(readingMeta("current", { label: "Current" })),
64858
64875
  /** Apparent power in volt-amperes. */
64859
- va: number().optional().meta(readingMeta("apparent-power")),
64876
+ apparentPower: number().optional().meta(readingMeta("apparent-power")),
64860
64877
  /** Power factor (0..1) if reported. */
64861
64878
  powerFactor: number().min(0).max(1).optional().meta(readingMeta("ratio")),
64862
64879
  /** Ms epoch when the slice was last updated. */
@@ -64914,14 +64931,14 @@ function powerTarget(id, unit) {
64914
64931
  advancedExpression: true
64915
64932
  };
64916
64933
  }
64917
- /** "Power and energy" extension: watts, energy, voltage and current from other devices (D951). */
64934
+ /** "Power and energy" extension: power, energy, voltage and current from other devices (D951). */
64918
64935
  var powerMeterCustomize = {
64919
64936
  version: 1,
64920
64937
  targets: [
64921
- powerTarget("watts", "W"),
64922
- powerTarget("kwhTotal", "kWh"),
64923
- powerTarget("volts", "V"),
64924
- powerTarget("amps", "A")
64938
+ powerTarget("power", "W"),
64939
+ powerTarget("energy", "kWh"),
64940
+ powerTarget("voltage", "V"),
64941
+ powerTarget("current", "A")
64925
64942
  ]
64926
64943
  };
64927
64944
  var powerMeterCapability = {
@@ -64937,41 +64954,41 @@ var powerMeterCapability = {
64937
64954
  },
64938
64955
  runtimeState: PowerMeterStatusSchema,
64939
64956
  /**
64940
- * Runtime-state durability: **restored** — as `numeric-sensor`; `kwhTotal` is an accumulator whose restored value is the baseline.
64957
+ * Runtime-state durability: **restored** — as `numeric-sensor`; `energy` is an accumulator whose restored value is the baseline.
64941
64958
  *
64942
64959
  * See `RuntimeStateDurability`. Enforced by
64943
64960
  * `scripts/check-runtime-state-durability.ts`.
64944
64961
  */
64945
64962
  durability: "restored",
64946
64963
  /**
64947
- * History (D850): recorded series. Gauges are floored at 30 s; `kwhTotal` is the one monotonic meter (counter).
64964
+ * History (D850): recorded series. Gauges are floored at 30 s; `energy` is the one monotonic meter (counter).
64948
64965
  */
64949
64966
  history: { fields: {
64950
- watts: {
64967
+ power: {
64951
64968
  kind: "gauge",
64952
64969
  unit: "W",
64953
64970
  deadband: 1,
64954
64971
  minIntervalMs: 3e4
64955
64972
  },
64956
- kwhTotal: {
64973
+ energy: {
64957
64974
  kind: "counter",
64958
64975
  unit: "kWh",
64959
64976
  deadband: .01,
64960
64977
  minIntervalMs: 6e4
64961
64978
  },
64962
- volts: {
64979
+ voltage: {
64963
64980
  kind: "gauge",
64964
64981
  unit: "V",
64965
64982
  deadband: 1,
64966
64983
  minIntervalMs: 3e4
64967
64984
  },
64968
- amps: {
64985
+ current: {
64969
64986
  kind: "gauge",
64970
64987
  unit: "A",
64971
64988
  deadband: .05,
64972
64989
  minIntervalMs: 3e4
64973
64990
  },
64974
- va: {
64991
+ apparentPower: {
64975
64992
  kind: "gauge",
64976
64993
  unit: "VA",
64977
64994
  deadband: 1,
@@ -65021,9 +65038,6 @@ var PresenceStatusSchema = object({
65021
65038
  location: string().nullable(),
65022
65039
  /** GPS coordinates when available. Null otherwise. */
65023
65040
  gps: GpsLocationSchema.nullable(),
65024
- /** Optional battery level of the tracking device (0..100). Null
65025
- * when not reported. */
65026
- batteryPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
65027
65041
  /** Ms epoch when the slice was last updated. */
65028
65042
  lastChangedAt: number()
65029
65043
  });
@@ -65052,14 +65066,7 @@ var presenceCapability = {
65052
65066
  * `scripts/check-runtime-state-durability.ts`.
65053
65067
  */
65054
65068
  durability: "restored",
65055
- /**
65056
- * History (D850): recorded series.
65057
- */
65058
- history: { fields: { batteryPercent: {
65059
- kind: "gauge",
65060
- unit: "%",
65061
- deadband: 1
65062
- } } },
65069
+ history: "none",
65063
65070
  /** Clock fields: written, but excluded from the compare that decides
65064
65071
  * whether persisting is worth a SQLite commit. */
65065
65072
  volatileStateFields: ["lastChangedAt"]
@@ -65074,7 +65081,7 @@ var presenceCapability = {
65074
65081
  */
65075
65082
  var PressureSensorStatusSchema = object({
65076
65083
  /** Current pressure in hPa. `null` when the sample was refused (D393). */
65077
- hpa: number().nullable().meta(readingMeta("pressure", { precision: 0 })),
65084
+ pressure: number().nullable().meta(readingMeta("pressure", { precision: 0 })),
65078
65085
  /** Ms epoch when the slice was last updated. */
65079
65086
  lastFetchedAt: number()
65080
65087
  });
@@ -65100,7 +65107,7 @@ var pressureSensorCapability = {
65100
65107
  /**
65101
65108
  * History (D850): recorded series.
65102
65109
  */
65103
- history: { fields: { hpa: {
65110
+ history: { fields: { pressure: {
65104
65111
  kind: "gauge",
65105
65112
  unit: "hPa",
65106
65113
  deadband: .1
@@ -68807,7 +68814,7 @@ var tamperCapability = {
68807
68814
  */
68808
68815
  var TemperatureSensorStatusSchema = object({
68809
68816
  /** Current temperature in Celsius. `null` when the sample was refused (D393). */
68810
- celsius: number().nullable().meta(readingMeta("temperature", {
68817
+ temperature: number().nullable().meta(readingMeta("temperature", {
68811
68818
  precision: 1,
68812
68819
  label: "Temperature"
68813
68820
  })),
@@ -68836,7 +68843,7 @@ var temperatureSensorCapability = {
68836
68843
  /**
68837
68844
  * History (D850): recorded series.
68838
68845
  */
68839
- history: { fields: { celsius: {
68846
+ history: { fields: { temperature: {
68840
68847
  kind: "gauge",
68841
68848
  unit: "°C",
68842
68849
  deadband: .1
@@ -69133,7 +69140,7 @@ var VacuumControlStatusSchema = object({
69133
69140
  /** Speed tokens the hardware accepts — drives the UI selector. */
69134
69141
  availableFanSpeeds: array(string()),
69135
69142
  /** 0..100 cleaning-completion percentage of the current task, or null. */
69136
- progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
69143
+ progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
69137
69144
  /** Current error code (0 / null = no error). */
69138
69145
  errorCode: number().nullable().meta(readingMeta("none")),
69139
69146
  /** Human label for {@link errorCode}, or null when none / undecodable. */
@@ -71201,7 +71208,7 @@ var BaseDevice = class {
71201
71208
  * `device-local-state.ts`. Drivers access via:
71202
71209
  *
71203
71210
  * `this.state.battery.sleeping = true` // patches the battery slice
71204
- * `const pct = this.state.battery.percentage` // reads the battery slice
71211
+ * `const pct = this.state.battery.level` // reads the battery slice
71205
71212
  * `this.state.deviceStatus.online = true` // mirrors `markOnline(true)`
71206
71213
  *
71207
71214
  * Adding a new cap with `runtimeState:` automatically extends this
@@ -71241,7 +71248,7 @@ var BaseDevice = class {
71241
71248
  * shape; drivers don't redeclare it, they just write through.
71242
71249
  *
71243
71250
  * Read: `this.runtimeState.getCapState('battery')` →
71244
- * `{percentage, charging, sleeping, lastUpdated}` for any
71251
+ * `{level, charging, sleeping, lastUpdated}` for any
71245
71252
  * provider that registers `batteryCapability`.
71246
71253
  * Write: `this.runtimeState.setCapState('battery', { … })`.
71247
71254
  *
@@ -82444,7 +82451,7 @@ var ACTUATOR_CAP_VOCABULARY = {
82444
82451
  label: t("Full brightness", "Luminosità massima"),
82445
82452
  phrase: t("Set {device} to full brightness", "Porta {device} alla massima luminosità"),
82446
82453
  icon: "sun",
82447
- args: { percentage: 100 }
82454
+ args: { level: 100 }
82448
82455
  },
82449
82456
  {
82450
82457
  id: "brightness.half",
@@ -82452,7 +82459,7 @@ var ACTUATOR_CAP_VOCABULARY = {
82452
82459
  label: t("Half brightness", "Luminosità a metà"),
82453
82460
  phrase: t("Dim {device} to half", "Abbassa {device} a metà luminosità"),
82454
82461
  icon: "sun-dim",
82455
- args: { percentage: 50 }
82462
+ args: { level: 50 }
82456
82463
  },
82457
82464
  {
82458
82465
  id: "brightness.off",
@@ -82460,16 +82467,16 @@ var ACTUATOR_CAP_VOCABULARY = {
82460
82467
  label: t("Brightness off", "Luminosità a zero"),
82461
82468
  phrase: t("Dim {device} to zero", "Abbassa {device} a zero"),
82462
82469
  icon: "lightbulb-off",
82463
- args: { percentage: 0 }
82470
+ args: { level: 0 }
82464
82471
  },
82465
82472
  {
82466
82473
  id: "brightness.set",
82467
82474
  method: "setBrightness",
82468
82475
  label: t("Set brightness", "Imposta la luminosità"),
82469
- phrase: t("Set the brightness of {device} to {percentage}", "Imposta la luminosità di {device} a {percentage}"),
82476
+ phrase: t("Set the brightness of {device} to {level}", "Imposta la luminosità di {device} a {level}"),
82470
82477
  icon: "sun-medium",
82471
82478
  openArgs: [{
82472
- key: "percentage",
82479
+ key: "level",
82473
82480
  label: PERCENT,
82474
82481
  offer: {
82475
82482
  kind: "number",
@@ -82483,13 +82490,13 @@ var ACTUATOR_CAP_VOCABULARY = {
82483
82490
  ],
82484
82491
  state: [{
82485
82492
  kind: "numeric",
82486
- field: "percentage",
82493
+ field: "level",
82487
82494
  quantity: t("the brightness", "la luminosità"),
82488
82495
  label: t("Brightness", "Luminosità"),
82489
82496
  unit: "%",
82490
82497
  icon: "sun"
82491
82498
  }],
82492
- events: { onBrightnessChanged: { notOperatorFacing: "the `percentage` state trigger reads the same change" } }
82499
+ events: { onBrightnessChanged: { notOperatorFacing: "the `level` state trigger reads the same change" } }
82493
82500
  },
82494
82501
  color: {
82495
82502
  scope: "device",
@@ -82503,7 +82510,7 @@ var ACTUATOR_CAP_VOCABULARY = {
82503
82510
  icon: "sun",
82504
82511
  args: { color: {
82505
82512
  mode: "mired",
82506
- mireds: 370
82513
+ colorTemperature: 370
82507
82514
  } }
82508
82515
  },
82509
82516
  {
@@ -82514,7 +82521,7 @@ var ACTUATOR_CAP_VOCABULARY = {
82514
82521
  icon: "snowflake",
82515
82522
  args: { color: {
82516
82523
  mode: "mired",
82517
- mireds: 200
82524
+ colorTemperature: 200
82518
82525
  } }
82519
82526
  },
82520
82527
  {
@@ -83128,7 +83135,7 @@ var ACTUATOR_CAP_VOCABULARY = {
83128
83135
  label: t("Fan off", "Ventilatore spento"),
83129
83136
  phrase: t("Stop {device}", "Ferma {device}"),
83130
83137
  icon: "power-off",
83131
- args: { percentage: 0 }
83138
+ args: { speed: 0 }
83132
83139
  },
83133
83140
  {
83134
83141
  id: "fan.full",
@@ -83136,16 +83143,16 @@ var ACTUATOR_CAP_VOCABULARY = {
83136
83143
  label: t("Fan full", "Ventilatore al massimo"),
83137
83144
  phrase: t("Run {device} at full speed", "Porta {device} alla massima velocità"),
83138
83145
  icon: "fan",
83139
- args: { percentage: 100 }
83146
+ args: { speed: 100 }
83140
83147
  },
83141
83148
  {
83142
83149
  id: "fan.speed",
83143
83150
  method: "setPercentage",
83144
83151
  label: t("Set speed", "Imposta la velocità"),
83145
- phrase: t("Set the speed of {device} to {percentage}", "Imposta la velocità di {device} al {percentage}"),
83152
+ phrase: t("Set the speed of {device} to {speed}", "Imposta la velocità di {device} al {speed}"),
83146
83153
  icon: "fan",
83147
83154
  openArgs: [{
83148
- key: "percentage",
83155
+ key: "speed",
83149
83156
  label: t("Speed", "Velocità"),
83150
83157
  offer: {
83151
83158
  kind: "number",
@@ -83207,7 +83214,7 @@ var ACTUATOR_CAP_VOCABULARY = {
83207
83214
  ],
83208
83215
  state: [{
83209
83216
  kind: "numeric",
83210
- field: "percentage",
83217
+ field: "speed",
83211
83218
  quantity: t("the speed", "la velocità"),
83212
83219
  label: t("Speed", "Velocità"),
83213
83220
  unit: "%",
@@ -84005,7 +84012,7 @@ var APPLIANCE_CAP_VOCABULARY = {
84005
84012
  },
84006
84013
  {
84007
84014
  kind: "numeric",
84008
- field: "progressPercent",
84015
+ field: "progress",
84009
84016
  quantity: t("the cycle progress", "l’avanzamento del lavaggio"),
84010
84017
  label: t("Progress", "Avanzamento"),
84011
84018
  unit: "%",
@@ -84363,10 +84370,10 @@ var APPLIANCE_CAP_VOCABULARY = {
84363
84370
  id: "media.seek",
84364
84371
  method: "seek",
84365
84372
  label: t("Seek", "Vai al punto"),
84366
- phrase: t("Move {device} to {positionMs}", "Porta {device} al punto {positionMs}"),
84373
+ phrase: t("Move {device} to {position}", "Porta {device} al punto {position}"),
84367
84374
  icon: "fast-forward",
84368
84375
  openArgs: [{
84369
- key: "positionMs",
84376
+ key: "position",
84370
84377
  label: t("Position", "Posizione"),
84371
84378
  offer: {
84372
84379
  kind: "number",
@@ -85415,7 +85422,7 @@ var SENSOR_CAP_VOCABULARY = {
85415
85422
  state: [
85416
85423
  {
85417
85424
  kind: "numeric",
85418
- field: "co2Ppm",
85425
+ field: "co2",
85419
85426
  quantity: t("the CO₂", "la CO₂"),
85420
85427
  label: t("CO₂", "CO₂"),
85421
85428
  unit: "ppm",
@@ -85423,7 +85430,7 @@ var SENSOR_CAP_VOCABULARY = {
85423
85430
  },
85424
85431
  {
85425
85432
  kind: "numeric",
85426
- field: "vocPpb",
85433
+ field: "voc",
85427
85434
  quantity: t("the VOC level", "il livello di COV"),
85428
85435
  label: t("VOC", "COV"),
85429
85436
  unit: "ppb",
@@ -85459,7 +85466,7 @@ var SENSOR_CAP_VOCABULARY = {
85459
85466
  noun: t("Light level", "Luminosità ambiente"),
85460
85467
  state: [{
85461
85468
  kind: "numeric",
85462
- field: "lux",
85469
+ field: "illuminance",
85463
85470
  quantity: t("the light level", "la luminosità"),
85464
85471
  label: t("Illuminance", "Illuminamento"),
85465
85472
  unit: "lx",
@@ -85662,7 +85669,7 @@ var SENSOR_CAP_VOCABULARY = {
85662
85669
  noun: t("Humidity", "Umidità"),
85663
85670
  state: [{
85664
85671
  kind: "numeric",
85665
- field: "percent",
85672
+ field: "humidity",
85666
85673
  quantity: t("the humidity", "l’umidità"),
85667
85674
  label: t("Humidity", "Umidità"),
85668
85675
  unit: "%",
@@ -85710,7 +85717,7 @@ var SENSOR_CAP_VOCABULARY = {
85710
85717
  state: [
85711
85718
  {
85712
85719
  kind: "numeric",
85713
- field: "watts",
85720
+ field: "power",
85714
85721
  quantity: t("the power draw", "il consumo"),
85715
85722
  label: t("Power", "Potenza"),
85716
85723
  unit: "W",
@@ -85718,7 +85725,7 @@ var SENSOR_CAP_VOCABULARY = {
85718
85725
  },
85719
85726
  {
85720
85727
  kind: "numeric",
85721
- field: "kwhTotal",
85728
+ field: "energy",
85722
85729
  quantity: t("the energy used", "l’energia consumata"),
85723
85730
  label: t("Energy", "Energia"),
85724
85731
  unit: "kWh",
@@ -85726,7 +85733,7 @@ var SENSOR_CAP_VOCABULARY = {
85726
85733
  },
85727
85734
  {
85728
85735
  kind: "numeric",
85729
- field: "volts",
85736
+ field: "voltage",
85730
85737
  quantity: t("the voltage", "la tensione"),
85731
85738
  label: t("Voltage", "Tensione"),
85732
85739
  unit: "V",
@@ -85734,7 +85741,7 @@ var SENSOR_CAP_VOCABULARY = {
85734
85741
  },
85735
85742
  {
85736
85743
  kind: "numeric",
85737
- field: "amps",
85744
+ field: "current",
85738
85745
  quantity: t("the current", "la corrente"),
85739
85746
  label: t("Current", "Corrente"),
85740
85747
  unit: "A",
@@ -85751,13 +85758,6 @@ var SENSOR_CAP_VOCABULARY = {
85751
85758
  label: t("Where", "Posizione"),
85752
85759
  phrase: t("When {device} is at {value}", "Quando {device} è in {value}"),
85753
85760
  icon: "map-pin"
85754
- }, {
85755
- kind: "numeric",
85756
- field: "batteryPercent",
85757
- quantity: t("the phone battery", "la batteria del telefono"),
85758
- label: t("Battery", "Batteria"),
85759
- unit: "%",
85760
- icon: "battery"
85761
85761
  }]
85762
85762
  },
85763
85763
  "pressure-sensor": {
@@ -85765,7 +85765,7 @@ var SENSOR_CAP_VOCABULARY = {
85765
85765
  noun: t("Pressure", "Pressione"),
85766
85766
  state: [{
85767
85767
  kind: "numeric",
85768
- field: "hpa",
85768
+ field: "pressure",
85769
85769
  quantity: t("the pressure", "la pressione"),
85770
85770
  label: t("Pressure", "Pressione"),
85771
85771
  unit: "hPa",
@@ -85801,7 +85801,7 @@ var SENSOR_CAP_VOCABULARY = {
85801
85801
  noun: t("Temperature", "Temperatura"),
85802
85802
  state: [{
85803
85803
  kind: "numeric",
85804
- field: "celsius",
85804
+ field: "temperature",
85805
85805
  quantity: t("the temperature", "la temperatura"),
85806
85806
  label: t("Temperature", "Temperatura"),
85807
85807
  unit: "°C",
@@ -85872,7 +85872,7 @@ var SENSOR_CAP_VOCABULARY = {
85872
85872
  state: [
85873
85873
  {
85874
85874
  kind: "numeric",
85875
- field: "percentage",
85875
+ field: "level",
85876
85876
  quantity: t("the battery level", "il livello della batteria"),
85877
85877
  label: t("Battery", "Batteria"),
85878
85878
  unit: "%",
@@ -85914,7 +85914,7 @@ var SENSOR_CAP_VOCABULARY = {
85914
85914
  icon: "battery-charging"
85915
85915
  }
85916
85916
  ],
85917
- events: { onStatusChanged: { notOperatorFacing: "the percentage / sleeping / charging state triggers each read one field of this change" } },
85917
+ events: { onStatusChanged: { notOperatorFacing: "the level / sleeping / charging state triggers each read one field of this change" } },
85918
85918
  extraEvents: [{
85919
85919
  category: EventCategory.DeviceAwake,
85920
85920
  label: t("Woke up", "Risvegliato"),
@@ -85932,7 +85932,7 @@ var SENSOR_CAP_VOCABULARY = {
85932
85932
  noun: t("Network link", "Collegamento di rete"),
85933
85933
  state: [{
85934
85934
  kind: "numeric",
85935
- field: "signalPercent",
85935
+ field: "signal",
85936
85936
  quantity: t("the signal strength", "l’intensità del segnale"),
85937
85937
  label: t("Signal", "Segnale"),
85938
85938
  unit: "%",
@@ -90420,6 +90420,17 @@ function ingestReading(input) {
90420
90420
  };
90421
90421
  }
90422
90422
  /**
90423
+ * The data-plane prefix every `VendorLoginProxy` is served under
90424
+ * (`/addon/<addonId>/vendor-login/<attemptId>/<vendorHost>/…`).
90425
+ *
90426
+ * The hub consults an addon's data-plane prefixes BEFORE its HTTP routes, so a
90427
+ * prefix equal to the first segment of a route the addon serves swallows that
90428
+ * route. A sign-in addon serves `/login/start|status|commit|cancel`; the proxy
90429
+ * therefore lives on a segment no addon route uses. One constant, so the entry
90430
+ * path, the mount and the docs cannot drift apart.
90431
+ */
90432
+ var VENDOR_LOGIN_PROXY_PREFIX = "vendor-login";
90433
+ /**
90423
90434
  * Where an OAuth round-trip ends: the admin-ui completion route
90424
90435
  * (`/sso-complete`, the page every popup sign-in already lands on), with the
90425
90436
  * OUTCOME in the URL fragment.
@@ -90661,19 +90672,17 @@ function sendPlain(res, status, text) {
90661
90672
  }
90662
90673
  var VendorLoginProxy = class {
90663
90674
  #addonId;
90664
- #prefix;
90665
90675
  #logger;
90666
90676
  #now;
90667
90677
  #fetch;
90668
90678
  #attempts = /* @__PURE__ */ new Map();
90669
90679
  constructor(options) {
90670
90680
  this.#addonId = options.addonId;
90671
- this.#prefix = options.prefix;
90672
90681
  this.#logger = options.logger;
90673
90682
  this.#now = options.now ?? (() => Date.now());
90674
90683
  this.#fetch = options.fetchFn ?? globalThis.fetch.bind(globalThis);
90675
90684
  }
90676
- /** The `DataPlaneHandler` to pass to `ctx.dataPlane.serve({ prefix, access: 'admin', … })`. */
90685
+ /** The `DataPlaneHandler` to pass to `ctx.dataPlane.serve({ prefix: VENDOR_LOGIN_PROXY_PREFIX, access: 'admin', … })`. */
90677
90686
  handler = (req, res) => this.#handle(req, res);
90678
90687
  /** Register an attempt. A one-shot capability: refused hosts are rejected up front. */
90679
90688
  open(spec) {
@@ -90710,11 +90719,11 @@ var VendorLoginProxy = class {
90710
90719
  basePath: "",
90711
90720
  upstreams: attempt.upstreams
90712
90721
  }, url.host) === void 0) return null;
90713
- return `/addon/${this.#addonId}/${this.#prefix}/${attemptId}/${url.host}${url.pathname}${url.search}`;
90722
+ return `/addon/${this.#addonId}/${VENDOR_LOGIN_PROXY_PREFIX}/${attemptId}/${url.host}${url.pathname}${url.search}`;
90714
90723
  }
90715
90724
  #routeFor(attemptId, attempt, forwardedPrefix) {
90716
90725
  return {
90717
- basePath: `${forwardedPrefix}/addon/${this.#addonId}/${this.#prefix}/${attemptId}`,
90726
+ basePath: `${forwardedPrefix}/addon/${this.#addonId}/${VENDOR_LOGIN_PROXY_PREFIX}/${attemptId}`,
90718
90727
  upstreams: attempt.upstreams
90719
90728
  };
90720
90729
  }
@@ -90864,4 +90873,4 @@ var VendorLoginProxy = class {
90864
90873
  var MB = 1024 * 1024;
90865
90874
  1024 * MB, 3072 * MB;
90866
90875
  //#endregion
90867
- export { defineCustomActions as A, string as B, temperatureSensorCapability as C, errMsg as D, DeviceType as E, boolean as F, unknown as H, literal as I, number as L, isSecretMarkerLike as M, _enum as N, createEvent as O, array as P, object as R, switchCapability as S, DeviceRole as T, EventCategory as U, union as V, numericSensorCapability as _, VendorLoginProxy as a, runningFromDishwasherOperation as b, climateControlCapability as c, deviceAdoptionCapability as d, dishwasherCapability as f, ingestReading as g, heatingValveCapability as h, RUNNING_STATE_COLD as i, isSecretMarker as j, customAction as k, connectionTestCapability as l, eventEmitterCapability as m, BaseDeviceProvider as n, batteryCapability as o, enumSensorCapability as p, DishwasherOperationStateSchema as r, binaryCapability as s, BaseDevice as t, consumablesCapability as u, powerMeterCapability as v, waterHeaterCapability as w, runningStateCapability as x, quantityFromUnit as y, record as z };
90876
+ export { customAction as A, record as B, switchCapability as C, DeviceType as D, DeviceRole as E, array as F, union as H, boolean as I, literal as L, isSecretMarker as M, isSecretMarkerLike as N, errMsg as O, _enum as P, number as R, runningStateCapability as S, waterHeaterCapability as T, unknown as U, string as V, EventCategory as W, ingestReading as _, VENDOR_LOGIN_PROXY_PREFIX as a, quantityFromUnit as b, binaryCapability as c, consumablesCapability as d, deviceAdoptionCapability as f, heatingValveCapability as g, eventEmitterCapability as h, RUNNING_STATE_COLD as i, defineCustomActions as j, createEvent as k, climateControlCapability as l, enumSensorCapability as m, BaseDeviceProvider as n, VendorLoginProxy as o, dishwasherCapability as p, DishwasherOperationStateSchema as r, batteryCapability as s, BaseDevice as t, connectionTestCapability as u, numericSensorCapability as v, temperatureSensorCapability as w, runningFromDishwasherOperation as x, powerMeterCapability as y, object as z };