@camstack/addon-admin-ui 1.2.471 → 1.2.473

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 (140) hide show
  1. package/dist/assets/{AddonAssetIcon-D4joXvAw.js → AddonAssetIcon-DmwaRNVP.js} +1 -1
  2. package/dist/assets/Addons-Ch5dCeth.js +4 -0
  3. package/dist/assets/{AdminPage-92KQDOBy.js → AdminPage-B-1YjUaD.js} +1 -1
  4. package/dist/assets/{AdminSectionedPage-B-MH77Vx.js → AdminSectionedPage-DCas2jUy.js} +1 -1
  5. package/dist/assets/AiProfiles-ChvfjsXv.js +3 -0
  6. package/dist/assets/{BrokerForm-HjHrcv-P.js → BrokerForm-x5UJk9ci.js} +1 -1
  7. package/dist/assets/Build-CUVwS9XA.js +40 -0
  8. package/dist/assets/Calendars-BMLzvBb6.js +1 -0
  9. package/dist/assets/Cluster-DaFXU71S.js +1 -0
  10. package/dist/assets/CompositionCreateForm-BxelZLtf.js +1 -0
  11. package/dist/assets/{CompositionEditorPage-CdJtfEi1.js → CompositionEditorPage-B_ERZESY.js} +1 -1
  12. package/dist/assets/Data-CMHfgMXt.js +2 -0
  13. package/dist/assets/DeviceDetail-CAtDRoZZ.js +2 -0
  14. package/dist/assets/{DeviceDoActionFields-B7UlBxQ0.js → DeviceDoActionFields-BETAvCYe.js} +1 -1
  15. package/dist/assets/{Devices-BAfbzc8b.js → Devices-C1DTPVnZ.js} +1 -1
  16. package/dist/assets/{EmbedPlayerPage-CZM7W_SR.js → EmbedPlayerPage-Bw6TIHbX.js} +1 -1
  17. package/dist/assets/History-BXTYUTxj.js +1 -0
  18. package/dist/assets/Identity-DTOixhZS.js +1 -0
  19. package/dist/assets/IntegrationDetail-CnINeomo.js +1 -0
  20. package/dist/assets/IntegrationHub-DahW4X5K.js +1 -0
  21. package/dist/assets/Integrations-Dex6zRMx.js +1 -0
  22. package/dist/assets/Integrations-HN2iCOqd.js +1 -0
  23. package/dist/assets/{Library-X3g7Mvql.js → Library-gaMbp-Fr.js} +1 -1
  24. package/dist/assets/Locations-haT1EJbm.js +3 -0
  25. package/dist/assets/{Logs-C7Z3D9TY.js → Logs-CtH4NMql.js} +1 -1
  26. package/dist/assets/{MaskShapeCanvas-wRO0Yeyg.js → MaskShapeCanvas-Byp9XgNC.js} +1 -1
  27. package/dist/assets/{MotionZonesSettings-C8wTUqjQ.js → MotionZonesSettings-C35beRsS.js} +1 -1
  28. package/dist/assets/{MyAccess-Di7tv0VI.js → MyAccess-Dj5hcaLN.js} +1 -1
  29. package/dist/assets/{Network-3FZdyZoe.js → Network-D-v-cA54.js} +1 -1
  30. package/dist/assets/{NodeAddonsSettingsPanel-ivhHs40k.js → NodeAddonsSettingsPanel-CW_M8Xge.js} +1 -1
  31. package/dist/assets/Notifications-r5w4Ne2O.js +1 -0
  32. package/dist/assets/Pipeline-C85hColk.js +1 -0
  33. package/dist/assets/{PrivacyMaskSettings-DTetXxIV.js → PrivacyMaskSettings-SPaH91xV.js} +1 -1
  34. package/dist/assets/Recordings-ZYwRaSrC.js +1 -0
  35. package/dist/assets/{ScanNetworkModal-DPHdPawS.js → ScanNetworkModal-ClvLQ-ol.js} +1 -1
  36. package/dist/assets/{SceneMonitorEditor-KPTdSp1h.js → SceneMonitorEditor-BvqnlZ2i.js} +1 -1
  37. package/dist/assets/SessionsList-BCDysQfs.js +2 -0
  38. package/dist/assets/{Showroom-2gQYW-h2.js → Showroom-jPZcBd6K.js} +1 -1
  39. package/dist/assets/{System-CDHw7Mcx.js → System-B5Ny1ozj.js} +1 -1
  40. package/dist/assets/{Terminal-UXpMvEO1.js → Terminal-DYLSrpsL.js} +5 -5
  41. package/dist/assets/{Viewer-ukAW_oJQ.js → Viewer-GqkHpMmf.js} +1 -1
  42. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-KG1b6CPN.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-BlUFdak1.js} +1 -1
  43. package/dist/assets/{addon-icons-context-gPkLZQ_G.js → addon-icons-context-BUi2hqSA.js} +1 -1
  44. package/dist/assets/{archive-CxbMF2yZ.js → archive-Bs9ToeWK.js} +1 -1
  45. package/dist/assets/{assignment-candidates-CQGwwSSC.js → assignment-candidates-e6s6JtrJ.js} +1 -1
  46. package/dist/assets/{authed-media-DpHGiSZS.js → authed-media-BWhmwHt2.js} +1 -1
  47. package/dist/assets/{bell-off-CAN5HeZI.js → bell-off-CosUv2Rj.js} +1 -1
  48. package/dist/assets/{board-model-C6IplvmC.js → board-model-BtdRuNBI.js} +1 -1
  49. package/dist/assets/{boxes-BIYyTH0E.js → boxes-CA7Sh4JV.js} +1 -1
  50. package/dist/assets/circle-slash-0Ca1BMK0.js +1 -0
  51. package/dist/assets/client-DIBstlq5.js +358 -0
  52. package/dist/assets/{cloud-upload-DvGDSWZB.js → cloud-upload-olZ1M2tJ.js} +1 -1
  53. package/dist/assets/crop-BZM3UFyT.js +1 -0
  54. package/dist/assets/{device-integration-icon-CRiv1vER.js → device-integration-icon-656UPgnE.js} +1 -1
  55. package/dist/assets/device-picker-model-yjEyEWyS.js +1 -0
  56. package/dist/assets/dist-D6Fj77pb.js +358 -0
  57. package/dist/assets/{dist-BeSobRch.js → dist-G4Cxki3p.js} +1 -1
  58. package/dist/assets/{eraser-CvXO1d9P.js → eraser-CABcfjb2.js} +1 -1
  59. package/dist/assets/event-targets-CHOtaC2B.js +2 -0
  60. package/dist/assets/{format-Cz7vHmZ6.js → format-BYDOzxSv.js} +1 -1
  61. package/dist/assets/{hard-drive-download-xDn3u92n.js → hard-drive-download-ClcxzAVo.js} +1 -1
  62. package/dist/assets/{hostInit-Bcdd4neZ.js → hostInit-DXWqqcl-.js} +1 -1
  63. package/dist/assets/i18n-D3CF2V_j.js +1 -0
  64. package/dist/assets/{icons-Uf4a8HzM.js → icons-BmpL14Dq.js} +1 -1
  65. package/dist/assets/index-BvsP28fN.css +2 -0
  66. package/dist/assets/index-Cskol4XA.js +4 -0
  67. package/dist/assets/{key-D63R1Jty.js → key-CURebvKJ.js} +1 -1
  68. package/dist/assets/{key-round-BH39VAkM.js → key-round-BTmR8Ca5.js} +1 -1
  69. package/dist/assets/{layers-Cf6Xk9ts.js → layers-BCzFIxnd.js} +1 -1
  70. package/dist/assets/{linked-devices-model-DYRAb775.js → linked-devices-model-Uzvgx-iv.js} +1 -1
  71. package/dist/assets/{list-ordered-9heb6Myu.js → list-ordered-BpmnL-Ze.js} +1 -1
  72. package/dist/assets/{location-owned-usage-DPBYs4L0.js → location-owned-usage-ChLz8liX.js} +1 -1
  73. package/dist/assets/{log-in-D6jMFDmP.js → log-in-hW2oGppQ.js} +1 -1
  74. package/dist/assets/{memory-stick-thjjQqgp.js → memory-stick-DJEnjf6G.js} +1 -1
  75. package/dist/assets/{message-square-plus-RcviJHk6.js → message-square-plus-CZ2oQ3Vr.js} +1 -1
  76. package/dist/assets/{mf-entry-bootstrap-0-cbb0c272.js → mf-entry-bootstrap-0-0c9682e8.js} +2 -2
  77. package/dist/assets/{mic-off-DvjWBZuR.js → mic-off-KFKpp3gz.js} +1 -1
  78. package/dist/assets/{monitor-off-DEBUzb17.js → monitor-off-Cn5TAK6N.js} +1 -1
  79. package/dist/assets/{monitor-smartphone-rIimQM0r.js → monitor-smartphone-Jvu4UJGi.js} +1 -1
  80. package/dist/assets/mount-yjEyEWyS.js +1 -0
  81. package/dist/assets/{player-overlays-DDFLUcm1.js → player-overlays-B_ZfVBiA.js} +1 -1
  82. package/dist/assets/{recycle-CaQYaqJP.js → recycle-BDm5DJUQ.js} +1 -1
  83. package/dist/assets/remoteEntry-7WZh94sn.js +1 -0
  84. package/dist/assets/{scan-eye-BxF3-BiI.js → scan-eye-C7MTwcP4.js} +1 -1
  85. package/dist/assets/{scissors-DecmVZUv.js → scissors-BQnPBcjw.js} +1 -1
  86. package/dist/assets/{search-x-CiS8b7vy.js → search-x-DEyDFvNT.js} +1 -1
  87. package/dist/assets/{send-9ZOtM3uh.js → send-B3qo7thK.js} +1 -1
  88. package/dist/assets/{settings-2-DVEGaYSK.js → settings-2-C0X8oPpn.js} +1 -1
  89. package/dist/assets/{speaker-BLIN7g-W.js → speaker-pcRBhz9y.js} +1 -1
  90. package/dist/assets/src-BVr0SnD-.js +67 -0
  91. package/dist/assets/step-inspector-model-DjRSZkVO.js +1 -0
  92. package/dist/assets/{timer-reset-ESt9DRwd.js → timer-reset-CCky8ePa.js} +1 -1
  93. package/dist/assets/{ungroup-uBZnvhmn.js → ungroup-iaoDNnXe.js} +1 -1
  94. package/dist/assets/{unlink-BK0Zya0K.js → unlink-8OutaYJL.js} +1 -1
  95. package/dist/assets/{usb--Z_ViOoE.js → usb-DL2I9kcC.js} +1 -1
  96. package/dist/assets/{use-scenes-feed-Dpe5Lc_e.js → use-scenes-feed-4lpCQaI1.js} +1 -1
  97. package/dist/assets/{use-stationary-objects-D9diuPzc.js → use-stationary-objects-P_tT9TQq.js} +1 -1
  98. package/dist/assets/useEventInvalidation-yjEyEWyS.js +1 -0
  99. package/dist/assets/{useNodeUrlSelection-B-NA_JqT.js → useNodeUrlSelection-CiraZrDp.js} +1 -1
  100. package/dist/assets/user-round-4ZziAKb6.js +1 -0
  101. package/dist/assets/{user-x-HmMRNIMy.js → user-x-DYn__Nok.js} +1 -1
  102. package/dist/assets/{video-BISLfAY2.js → video-BcVXMTle.js} +1 -1
  103. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-w3oA3S6D.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-CXWzeD1i.js} +2 -2
  104. package/dist/index.html +10 -10
  105. package/dist/server/addon.js +447 -11
  106. package/package.json +1 -1
  107. package/dist/assets/Addons-BNo3Y3g8.js +0 -4
  108. package/dist/assets/AiProfiles-CTHbBMUB.js +0 -3
  109. package/dist/assets/Build-Dlf7sJhk.js +0 -40
  110. package/dist/assets/Calendars-YnCFbUE7.js +0 -1
  111. package/dist/assets/Cluster-C4BsKola.js +0 -1
  112. package/dist/assets/CompositionCreateForm-D_Nmi2nG.js +0 -1
  113. package/dist/assets/Data-DkPbjXNV.js +0 -2
  114. package/dist/assets/DeviceDetail-BSWf6l6J.js +0 -2
  115. package/dist/assets/History-BfD8lMf9.js +0 -1
  116. package/dist/assets/Identity-6QdzCJrT.js +0 -1
  117. package/dist/assets/IntegrationDetail-B4X-8vcl.js +0 -1
  118. package/dist/assets/IntegrationHub-DCSIyXBI.js +0 -1
  119. package/dist/assets/Integrations-JcvhEroF.js +0 -1
  120. package/dist/assets/Integrations-XcsYTI2I.js +0 -1
  121. package/dist/assets/Locations-C--r0_cW.js +0 -3
  122. package/dist/assets/Notifications-D4LJlejx.js +0 -1
  123. package/dist/assets/Pipeline-BMhn1YbR.js +0 -1
  124. package/dist/assets/Recordings-Ct8JWW27.js +0 -1
  125. package/dist/assets/SessionsList-DrklEq9Z.js +0 -2
  126. package/dist/assets/circle-slash-BWtbQj2T.js +0 -1
  127. package/dist/assets/client-BnEPcD6s.js +0 -358
  128. package/dist/assets/crop-CDWciXWB.js +0 -1
  129. package/dist/assets/device-picker-model-DPfjZqVB.js +0 -1
  130. package/dist/assets/dist-CMwJjIGP.js +0 -358
  131. package/dist/assets/event-targets-CIffOoYs.js +0 -2
  132. package/dist/assets/i18n-DsGcRtAk.js +0 -1
  133. package/dist/assets/index-BMUVtgYi.css +0 -2
  134. package/dist/assets/index-CgxpaFwe.js +0 -4
  135. package/dist/assets/mount-DPfjZqVB.js +0 -1
  136. package/dist/assets/remoteEntry-DqDbkZhO.js +0 -1
  137. package/dist/assets/src-CWZRb0ia.js +0 -67
  138. package/dist/assets/step-inspector-model-B6Fs3NZo.js +0 -1
  139. package/dist/assets/useEventInvalidation-DPfjZqVB.js +0 -1
  140. package/dist/assets/user-round-D2ADHRLF.js +0 -1
@@ -5435,7 +5435,7 @@ var ZodIssueCode = {
5435
5435
  var ZodFirstPartyTypeKind;
5436
5436
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5437
5437
  //#endregion
5438
- //#region ../types/dist/sleep-CARd6wZF.mjs
5438
+ //#region ../types/dist/sleep-B81gwQuR.mjs
5439
5439
  /**
5440
5440
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5441
5441
  * window to float samples (D455).
@@ -7961,6 +7961,53 @@ var READING_QUANTITIES = [
7961
7961
  ];
7962
7962
  var ReadingQuantitySchema = _enum(READING_QUANTITIES);
7963
7963
  new Set(READING_QUANTITIES);
7964
+ /**
7965
+ * Stored unit symbol for a quantity. `none` means the number is dimensionless
7966
+ * (or an index / ratio / count). `device` means the cap has no single unit.
7967
+ */
7968
+ var QUANTITY_BASE = {
7969
+ temperature: "°C",
7970
+ pressure: "hPa",
7971
+ speed: "m/s",
7972
+ precipitation: "mm",
7973
+ "precipitation-rate": "mm/h",
7974
+ length: "m",
7975
+ area: "m²",
7976
+ illuminance: "lx",
7977
+ irradiance: "W/m²",
7978
+ power: "W",
7979
+ energy: "kWh",
7980
+ voltage: "V",
7981
+ current: "A",
7982
+ "apparent-power": "VA",
7983
+ humidity: "%",
7984
+ percentage: "%",
7985
+ "concentration-volume": "ppm",
7986
+ "concentration-mass": "µg/m³",
7987
+ "concentration-ppb": "ppb",
7988
+ volume: "L",
7989
+ duration: "s",
7990
+ "duration-ms": "ms",
7991
+ information: "B",
7992
+ "sound-level": "dBFS",
7993
+ "signal-level": "dBm",
7994
+ "colour-temperature": "mired",
7995
+ angle: "°",
7996
+ bitrate: "kbps",
7997
+ rate: "fps",
7998
+ mass: "kg",
7999
+ index: "none",
8000
+ ratio: "none",
8001
+ count: "none",
8002
+ none: "none",
8003
+ device: "device"
8004
+ };
8005
+ /** The stored unit, or `undefined` when the quantity has no unit symbol. */
8006
+ function baseUnitOf(quantity) {
8007
+ const symbol = QUANTITY_BASE[quantity];
8008
+ if (symbol === "none" || symbol === "device") return void 0;
8009
+ return symbol;
8010
+ }
7964
8011
  function readingMeta(quantity, extras) {
7965
8012
  return {
7966
8013
  quantity,
@@ -8528,6 +8575,7 @@ var CAP_NAMES = Object.freeze([
8528
8575
  "filesystem-browse",
8529
8576
  "flood",
8530
8577
  "gas",
8578
+ "group-status",
8531
8579
  "heating-valve",
8532
8580
  "humidifier",
8533
8581
  "humidity-sensor",
@@ -9346,6 +9394,20 @@ Object.freeze({
9346
9394
  "path": "detected",
9347
9395
  "valueType": "boolean"
9348
9396
  }],
9397
+ "group-status": [
9398
+ {
9399
+ "path": "included",
9400
+ "valueType": "number"
9401
+ },
9402
+ {
9403
+ "path": "excluded",
9404
+ "valueType": "number"
9405
+ },
9406
+ {
9407
+ "path": "total",
9408
+ "valueType": "number"
9409
+ }
9410
+ ],
9349
9411
  "heating-valve": [{
9350
9412
  "path": "position",
9351
9413
  "valueType": "number"
@@ -10677,7 +10739,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
10677
10739
  return DeviceRole;
10678
10740
  }({});
10679
10741
  //#endregion
10680
- //#region ../types/dist/composition-kEl9mevu.mjs
10742
+ //#region ../types/dist/composition-B85l9j1M.mjs
10681
10743
  /**
10682
10744
  * The ffmpeg build every CamStack node downloads, per platform and arch.
10683
10745
  *
@@ -11432,15 +11494,67 @@ function validateExpressionSource(src) {
11432
11494
  }
11433
11495
  return null;
11434
11496
  }
11435
- /** A composed device's stableId is this prefix plus the block id. */
11436
- var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
11437
- /** Longest snippet a `code` source may carry (slice 4). */
11438
- var MAX_COMPOSITION_CODE_LENGTH = 2e4;
11497
+ /**
11498
+ * A composition source identity: `(addonId, stableId)`, never a numeric device
11499
+ * id. Split out so helper schemas can name it without a cycle through
11500
+ * `composition.ts` (D659).
11501
+ */
11439
11502
  var CompositionSourceRefSchema = object({
11440
11503
  /** The owning addon; `stableId` is unique only within it. */
11441
11504
  addonId: string().min(1),
11442
11505
  stableId: string().min(1)
11443
11506
  });
11507
+ var GROUP_TEMPLATE_IDS = [
11508
+ "temperature",
11509
+ "humidity",
11510
+ "pressure",
11511
+ "illuminance",
11512
+ "power",
11513
+ "energy",
11514
+ "battery",
11515
+ "numeric",
11516
+ "motion",
11517
+ "contact",
11518
+ "leak",
11519
+ "smoke",
11520
+ "occupancy",
11521
+ "binary"
11522
+ ];
11523
+ var NUMERIC_AGGREGATES = [
11524
+ "mean",
11525
+ "median",
11526
+ "min",
11527
+ "max",
11528
+ "sum"
11529
+ ];
11530
+ var BINARY_AGGREGATES = ["any", "all"];
11531
+ var AGGREGATE_REDUCERS = [
11532
+ "mean",
11533
+ "median",
11534
+ "min",
11535
+ "max",
11536
+ "sum",
11537
+ "any",
11538
+ "all"
11539
+ ];
11540
+ var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
11541
+ var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
11542
+ /** One member. The field is stored so occupancy can name motion or binary. */
11543
+ var HelperMemberSchema = object({
11544
+ source: CompositionSourceRefSchema,
11545
+ cap: string().min(1),
11546
+ fieldPath: string().min(1)
11547
+ });
11548
+ var HelperSpecSchema = discriminatedUnion("kind", [object({
11549
+ kind: literal("group"),
11550
+ templateId: GroupTemplateIdSchema,
11551
+ aggregate: AggregateReducerSchema,
11552
+ members: array(HelperMemberSchema).min(1).max(64)
11553
+ })]);
11554
+ /** A composed device's stableId is this prefix plus the block id. */
11555
+ var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
11556
+ /** Longest snippet a `code` source may carry (slice 4). */
11557
+ var MAX_COMPOSITION_CODE_LENGTH = 2e4;
11444
11558
  /** One field of one capability of one source device. */
11445
11559
  var CompositionFieldReadSchema = object({
11446
11560
  source: CompositionSourceRefSchema,
@@ -11484,7 +11598,33 @@ var CompositionCodeSourceSchema = object({
11484
11598
  var CompositionFieldSourceSchema = discriminatedUnion("kind", [
11485
11599
  CompositionFromSourceSchema,
11486
11600
  CompositionExpressionSourceSchema,
11487
- CompositionCodeSourceSchema
11601
+ CompositionCodeSourceSchema,
11602
+ object({
11603
+ kind: literal("aggregate"),
11604
+ reducer: _enum([
11605
+ "mean",
11606
+ "median",
11607
+ "min",
11608
+ "max",
11609
+ "sum",
11610
+ "any",
11611
+ "all"
11612
+ ]),
11613
+ reads: array(CompositionFieldReadSchema).min(1).max(64),
11614
+ /** `value` is the reading; the others are the member counts. */
11615
+ publish: _enum([
11616
+ "value",
11617
+ "included",
11618
+ "excluded",
11619
+ "total"
11620
+ ]),
11621
+ /** What a `value` publish does when nobody is included. Counts ignore this. */
11622
+ empty: _enum([
11623
+ "null",
11624
+ "omit",
11625
+ "offline"
11626
+ ])
11627
+ })
11488
11628
  ]);
11489
11629
  var CompositionCommandTargetSchema = discriminatedUnion("kind", [object({
11490
11630
  kind: literal("forward"),
@@ -11530,7 +11670,13 @@ var CompositionSchema = object({
11530
11670
  kind: literal("existing"),
11531
11671
  device: CompositionSourceRefSchema
11532
11672
  })]),
11533
- features: array(CompositionFeatureSchema).min(1).max(16)
11673
+ features: array(CompositionFeatureSchema).min(1).max(16),
11674
+ /**
11675
+ * Present when the block is a helper template. Absent on a free
11676
+ * composition (the room example, device 4603). The editor reads this,
11677
+ * never the compiled features.
11678
+ */
11679
+ helper: HelperSpecSchema.optional()
11534
11680
  }).superRefine((composition, ctx) => {
11535
11681
  const seen = /* @__PURE__ */ new Set();
11536
11682
  composition.features.forEach((feature, index) => {
@@ -17633,7 +17779,10 @@ var CompositionProblemSchema = object({
17633
17779
  "target-missing",
17634
17780
  "target-unreadable",
17635
17781
  "not-replaceable",
17636
- "native-capability-replace"
17782
+ "native-capability-replace",
17783
+ "mixed-quantity",
17784
+ "helper-mismatch",
17785
+ "member-constraint"
17637
17786
  ]),
17638
17787
  path: string(),
17639
17788
  message: string()
@@ -17654,7 +17803,8 @@ var CompositionUnavailableModeSchema = _enum([
17654
17803
  "null",
17655
17804
  "offline",
17656
17805
  "unknown",
17657
- "release"
17806
+ "release",
17807
+ "omit"
17658
17808
  ]);
17659
17809
  /**
17660
17810
  * `derived` reads a source · `clock` reads only `now`, recomputed when a sibling
@@ -17868,6 +18018,235 @@ Object.freeze({
17868
18018
  result: ["number", "null"]
17869
18019
  }
17870
18020
  });
18021
+ /**
18022
+ * One catalog row per base reading a group helper can build (D944 §3).
18023
+ * Data, not a form default written into the block.
18024
+ */
18025
+ var NOW = {
18026
+ fieldPath: "lastFetchedAt",
18027
+ expr: "now"
18028
+ };
18029
+ var CHANGED = {
18030
+ fieldPath: "lastChangedAt",
18031
+ expr: "now"
18032
+ };
18033
+ function numeric(input) {
18034
+ return {
18035
+ ...input,
18036
+ family: "numeric",
18037
+ deviceType: DeviceType.Sensor,
18038
+ memberDeviceType: DeviceType.Sensor,
18039
+ baseUnit: baseUnitOf(input.quantity),
18040
+ aggregates: NUMERIC_AGGREGATES,
18041
+ accept: [{
18042
+ cap: input.outputCap,
18043
+ fieldPath: input.outputField
18044
+ }]
18045
+ };
18046
+ }
18047
+ function binary(input) {
18048
+ return {
18049
+ ...input,
18050
+ family: "binary",
18051
+ deviceType: DeviceType.Sensor,
18052
+ memberDeviceType: DeviceType.Sensor,
18053
+ quantity: "none",
18054
+ baseUnit: void 0,
18055
+ aggregates: BINARY_AGGREGATES,
18056
+ empty: "offline"
18057
+ };
18058
+ }
18059
+ var GROUP_TEMPLATES = [
18060
+ numeric({
18061
+ id: "temperature",
18062
+ summary: "Mean, median, min, max or sum of temperatures. Offline and unknown members are left out, never read as 0 °C.",
18063
+ role: DeviceRole.TemperatureSensor,
18064
+ outputCap: "temperature-sensor",
18065
+ outputField: "celsius",
18066
+ quantity: "temperature",
18067
+ defaultAggregate: "mean",
18068
+ empty: "null",
18069
+ companions: [NOW]
18070
+ }),
18071
+ numeric({
18072
+ id: "humidity",
18073
+ summary: "Humidity in percent. Offline and unknown members are left out, never read as 0 %.",
18074
+ role: DeviceRole.HumiditySensor,
18075
+ outputCap: "humidity-sensor",
18076
+ outputField: "percent",
18077
+ quantity: "humidity",
18078
+ defaultAggregate: "mean",
18079
+ empty: "null",
18080
+ companions: [NOW]
18081
+ }),
18082
+ numeric({
18083
+ id: "pressure",
18084
+ summary: "Pressure in hectopascals. Offline and unknown members are left out, never read as 0 hPa.",
18085
+ role: DeviceRole.PressureSensor,
18086
+ outputCap: "pressure-sensor",
18087
+ outputField: "hpa",
18088
+ quantity: "pressure",
18089
+ defaultAggregate: "mean",
18090
+ empty: "null",
18091
+ companions: [NOW]
18092
+ }),
18093
+ numeric({
18094
+ id: "illuminance",
18095
+ summary: "Illuminance in lux. Offline and unknown members are left out, never read as 0 lx.",
18096
+ role: DeviceRole.AmbientLightSensor,
18097
+ outputCap: "ambient-light-sensor",
18098
+ outputField: "lux",
18099
+ quantity: "illuminance",
18100
+ defaultAggregate: "mean",
18101
+ empty: "null",
18102
+ companions: [NOW]
18103
+ }),
18104
+ numeric({
18105
+ id: "power",
18106
+ summary: "Power in watts, summed by default. Nobody reporting omits the key rather than writing 0 W.",
18107
+ role: DeviceRole.PowerSensor,
18108
+ outputCap: "power-meter",
18109
+ outputField: "watts",
18110
+ quantity: "power",
18111
+ defaultAggregate: "sum",
18112
+ empty: "omit",
18113
+ companions: [NOW]
18114
+ }),
18115
+ numeric({
18116
+ id: "energy",
18117
+ summary: "Energy in kilowatt-hours, summed by default. Nobody reporting omits the key rather than writing 0 kWh.",
18118
+ role: DeviceRole.EnergySensor,
18119
+ outputCap: "power-meter",
18120
+ outputField: "kwhTotal",
18121
+ quantity: "energy",
18122
+ defaultAggregate: "sum",
18123
+ empty: "omit",
18124
+ companions: [NOW]
18125
+ }),
18126
+ numeric({
18127
+ id: "battery",
18128
+ summary: "Battery charge in percent. Offline and unknown members are left out, never read as 0 %.",
18129
+ role: DeviceRole.BatterySensor,
18130
+ outputCap: "battery",
18131
+ outputField: "percentage",
18132
+ quantity: "percentage",
18133
+ defaultAggregate: "mean",
18134
+ empty: "null",
18135
+ companions: [
18136
+ {
18137
+ fieldPath: "charging",
18138
+ expr: "\"unknown\""
18139
+ },
18140
+ {
18141
+ fieldPath: "sleeping",
18142
+ expr: "false"
18143
+ },
18144
+ {
18145
+ fieldPath: "lastUpdated",
18146
+ expr: "now"
18147
+ }
18148
+ ]
18149
+ }),
18150
+ numeric({
18151
+ id: "numeric",
18152
+ summary: "A numeric reading in the members’ shared quantity. Mixed quantities are refused. Nobody reporting publishes null, not 0.",
18153
+ role: DeviceRole.NumericSensor,
18154
+ outputCap: "numeric-sensor",
18155
+ outputField: "value",
18156
+ quantity: "device",
18157
+ defaultAggregate: "mean",
18158
+ empty: "null",
18159
+ companions: [NOW]
18160
+ }),
18161
+ binary({
18162
+ id: "motion",
18163
+ summary: "Any or all motion. Offline and unknown members are left out, never read as off. Nobody reporting takes the device offline.",
18164
+ role: DeviceRole.MotionSensor,
18165
+ outputCap: "motion",
18166
+ outputField: "detected",
18167
+ defaultAggregate: "any",
18168
+ accept: [{
18169
+ cap: "motion",
18170
+ fieldPath: "detected"
18171
+ }],
18172
+ companions: [{
18173
+ fieldPath: "lastDetectedAt",
18174
+ expr: "null"
18175
+ }, {
18176
+ fieldPath: "autoClearAfterMs",
18177
+ expr: "null"
18178
+ }]
18179
+ }),
18180
+ binary({
18181
+ id: "contact",
18182
+ summary: "Any or all open contacts. Offline and unknown members are left out, never read as closed.",
18183
+ role: DeviceRole.ContactSensor,
18184
+ outputCap: "contact",
18185
+ outputField: "entryOpen",
18186
+ defaultAggregate: "any",
18187
+ accept: [{
18188
+ cap: "contact",
18189
+ fieldPath: "entryOpen"
18190
+ }],
18191
+ companions: [CHANGED]
18192
+ }),
18193
+ binary({
18194
+ id: "leak",
18195
+ summary: "Any or all leak detections. Offline and unknown members are left out, never read as dry.",
18196
+ role: DeviceRole.LeakSensor,
18197
+ outputCap: "flood",
18198
+ outputField: "flooded",
18199
+ defaultAggregate: "any",
18200
+ accept: [{
18201
+ cap: "flood",
18202
+ fieldPath: "flooded"
18203
+ }],
18204
+ companions: [CHANGED]
18205
+ }),
18206
+ binary({
18207
+ id: "smoke",
18208
+ summary: "Any or all smoke detections. Offline and unknown members are left out, never read as clear.",
18209
+ role: DeviceRole.SmokeSensor,
18210
+ outputCap: "smoke",
18211
+ outputField: "detected",
18212
+ defaultAggregate: "any",
18213
+ accept: [{
18214
+ cap: "smoke",
18215
+ fieldPath: "detected"
18216
+ }],
18217
+ companions: [CHANGED]
18218
+ }),
18219
+ binary({
18220
+ id: "occupancy",
18221
+ summary: "Any or all of motion or binary sensors, published as a binary. Presence zones are not aggregated. Nobody reporting is offline, not off.",
18222
+ role: DeviceRole.BinarySensor,
18223
+ outputCap: "binary",
18224
+ outputField: "on",
18225
+ defaultAggregate: "any",
18226
+ accept: [{
18227
+ cap: "motion",
18228
+ fieldPath: "detected"
18229
+ }, {
18230
+ cap: "binary",
18231
+ fieldPath: "on"
18232
+ }],
18233
+ companions: [CHANGED]
18234
+ }),
18235
+ binary({
18236
+ id: "binary",
18237
+ summary: "Any or all generic binary sensors. Offline and unknown members are left out, never read as off.",
18238
+ role: DeviceRole.BinarySensor,
18239
+ outputCap: "binary",
18240
+ outputField: "on",
18241
+ defaultAggregate: "any",
18242
+ accept: [{
18243
+ cap: "binary",
18244
+ fieldPath: "on"
18245
+ }],
18246
+ companions: [CHANGED]
18247
+ })
18248
+ ];
18249
+ new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
17871
18250
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
17872
18251
  /**
17873
18252
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -57688,6 +58067,24 @@ object({
57688
58067
  lastChangedAt: number()
57689
58068
  });
57690
58069
  DeviceType.Sensor;
58070
+ object({
58071
+ /** Members whose current value entered the aggregate. */
58072
+ included: number().int().nonnegative().meta(readingMeta("count", {
58073
+ precision: 0,
58074
+ label: "Reporting"
58075
+ })),
58076
+ /** Members left out: offline, unknown, or not a finite reading (D393). */
58077
+ excluded: number().int().nonnegative().meta(readingMeta("count", {
58078
+ precision: 0,
58079
+ label: "Excluded"
58080
+ })),
58081
+ /** `included` + `excluded`. */
58082
+ total: number().int().nonnegative().meta(readingMeta("count", {
58083
+ precision: 0,
58084
+ label: "Members"
58085
+ }))
58086
+ });
58087
+ DeviceType.Sensor;
57691
58088
  object({
57692
58089
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
57693
58090
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -67967,6 +68364,13 @@ Object.freeze({
67967
68364
  access: "view",
67968
68365
  role: "viewer"
67969
68366
  },
68367
+ "groupStatus.getStatus": {
68368
+ capName: "group-status",
68369
+ capScope: "device",
68370
+ addonId: null,
68371
+ access: "view",
68372
+ role: "viewer"
68373
+ },
67970
68374
  "heatingValve.getStatus": {
67971
68375
  capName: "heating-valve",
67972
68376
  capScope: "device",
@@ -77789,6 +78193,33 @@ var SENSOR_CAP_VOCABULARY = {
77789
78193
  icon: "flame"
77790
78194
  }]
77791
78195
  },
78196
+ "group-status": {
78197
+ scope: "device",
78198
+ noun: t("Group", "Gruppo"),
78199
+ state: [
78200
+ {
78201
+ kind: "numeric",
78202
+ field: "included",
78203
+ quantity: t("the members reporting", "i membri che rispondono"),
78204
+ label: t("Reporting", "Rispondono"),
78205
+ icon: "users"
78206
+ },
78207
+ {
78208
+ kind: "numeric",
78209
+ field: "excluded",
78210
+ quantity: t("the members left out", "i membri esclusi"),
78211
+ label: t("Excluded", "Esclusi"),
78212
+ icon: "users"
78213
+ },
78214
+ {
78215
+ kind: "numeric",
78216
+ field: "total",
78217
+ quantity: t("the member count", "il numero di membri"),
78218
+ label: t("Members", "Membri"),
78219
+ icon: "sigma"
78220
+ }
78221
+ ]
78222
+ },
77792
78223
  "humidity-sensor": {
77793
78224
  scope: "device",
77794
78225
  noun: t("Humidity", "Umidità"),
@@ -79254,6 +79685,11 @@ Object.freeze({
79254
79685
  form: "single",
79255
79686
  optional: false
79256
79687
  }],
79688
+ "groupStatus.getStatus": [{
79689
+ name: "deviceId",
79690
+ form: "single",
79691
+ optional: false
79692
+ }],
79257
79693
  "heatingValve.getStatus": [{
79258
79694
  name: "deviceId",
79259
79695
  form: "single",
@@ -82367,7 +82803,7 @@ var AdminUIAddon = class extends BaseAddon {
82367
82803
  capability: adminUiCapability,
82368
82804
  provider: {
82369
82805
  getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
82370
- getVersion: async () => ({ version: "1.2.471" })
82806
+ getVersion: async () => ({ version: "1.2.473" })
82371
82807
  }
82372
82808
  }];
82373
82809
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-admin-ui",
3
- "version": "1.2.471",
3
+ "version": "1.2.473",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Admin UI — Vite frontend build and server-side addon",