@camstack/addon-training 0.1.80 → 0.1.81

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 (20) hide show
  1. package/dist/{MotionZonesSettings-BliuxpCH.mjs → MotionZonesSettings-Ca-6XXfI.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-CKL9xV-S.mjs → PrivacyMaskSettings-BCUM9T8S.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-BE7rVggL.mjs → SceneMonitorEditor-CjJ891SK.mjs} +1 -1
  4. package/dist/_stub.js +7 -7
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-DyaQwk4k.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cr7Pmc7w.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-9NmkfCw8.mjs +26 -0
  7. package/dist/{dist-BCUHufOe.mjs → dist-BEHbfGro.mjs} +2046 -50
  8. package/dist/{dist-FpC7GFu_.js → dist-CdN9FdUa.js} +2046 -50
  9. package/dist/{hostInit-DxnxYPQ_.mjs → hostInit-XwE0hfA0.mjs} +3 -3
  10. package/dist/index.js +1 -1
  11. package/dist/orchestrator/training.addon.js +1 -1
  12. package/dist/orchestrator/training.addon.mjs +1 -1
  13. package/dist/{player-overlays-1cASdLh_.mjs → player-overlays-Bk8LUHwl.mjs} +1 -1
  14. package/dist/providers/modal/training-modal.addon.js +1 -1
  15. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  16. package/dist/remoteEntry.js +1 -1
  17. package/dist/{responsive-Ctl0WYwk.mjs → responsive-DkRlf-GQ.mjs} +1 -1
  18. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-C_798y4H.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-DslbW4nN.mjs} +1 -1
  19. package/package.json +1 -1
  20. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DKoALssM.mjs +0 -26
@@ -32,7 +32,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
32
32
  }) : target, mod));
33
33
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
34
  require("node:crypto");
35
- //#region ../types/dist/event-category-Ceif8n-v.mjs
35
+ //#region ../types/dist/event-category-DHXxB8t9.mjs
36
36
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
37
37
  EventCategory["SystemBoot"] = "system.boot";
38
38
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -328,7 +328,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
328
328
  * TRANSITION into that state (never per dispatch), and the node is dropped
329
329
  * from the placement candidate set for as long as it holds.
330
330
  *
331
- * This exists because the state was previously invisible: little-unraid
331
+ * This exists because the state was previously invisible: agent-a
332
332
  * absorbed 283k inference errors in a day while still being handed cameras,
333
333
  * and nothing in the system said so.
334
334
  *
@@ -5600,7 +5600,7 @@ var ZodIssueCode = {
5600
5600
  var ZodFirstPartyTypeKind;
5601
5601
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5602
5602
  //#endregion
5603
- //#region ../types/dist/sleep-CYfIZzGv.mjs
5603
+ //#region ../types/dist/sleep-BErAxhul.mjs
5604
5604
  /**
5605
5605
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5606
5606
  * window to float samples (D455).
@@ -8800,6 +8800,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8800
8800
  kind: "mutation",
8801
8801
  auth: "admin"
8802
8802
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8803
+ Object.freeze({ "doorbell": "lastPressedAt" });
8804
+ /** Every capability name, so addon code can check a name without the schema graph. */
8805
+ var CAP_NAMES = Object.freeze([
8806
+ "accessories",
8807
+ "addon-pages",
8808
+ "addon-pages-source",
8809
+ "addon-routes",
8810
+ "addon-settings",
8811
+ "addon-widgets",
8812
+ "addon-widgets-source",
8813
+ "addons",
8814
+ "admin-ui",
8815
+ "air-quality-sensor",
8816
+ "alarm-panel",
8817
+ "alerts",
8818
+ "ambient-light-sensor",
8819
+ "audio-analysis",
8820
+ "audio-analyzer",
8821
+ "audio-codec",
8822
+ "audio-metrics",
8823
+ "auth-provider",
8824
+ "automation-control",
8825
+ "backup",
8826
+ "battery",
8827
+ "binary",
8828
+ "brightness",
8829
+ "broker",
8830
+ "button",
8831
+ "calendar-source",
8832
+ "calendars",
8833
+ "camera-credentials",
8834
+ "camera-grid-layout",
8835
+ "camera-pipeline-config",
8836
+ "camera-streams",
8837
+ "carbon-monoxide",
8838
+ "climate-control",
8839
+ "color",
8840
+ "composer",
8841
+ "connection-test",
8842
+ "connectivity",
8843
+ "consumables",
8844
+ "contact",
8845
+ "control",
8846
+ "core-blocks",
8847
+ "cover",
8848
+ "custom-model-registry",
8849
+ "data-store-provider",
8850
+ "database-snapshot",
8851
+ "day-night",
8852
+ "decoder",
8853
+ "detection-pipeline",
8854
+ "device-admin-link",
8855
+ "device-adoption",
8856
+ "device-credentials",
8857
+ "device-discovery",
8858
+ "device-export",
8859
+ "device-extension",
8860
+ "device-history",
8861
+ "device-manager",
8862
+ "device-ops",
8863
+ "device-provider",
8864
+ "device-removal-hook",
8865
+ "device-state",
8866
+ "device-status",
8867
+ "dishwasher",
8868
+ "display-palette",
8869
+ "doorbell",
8870
+ "embedding-encoder",
8871
+ "enum-sensor",
8872
+ "event-emitter",
8873
+ "face-gallery",
8874
+ "failure-contribution",
8875
+ "fan-control",
8876
+ "feature-probe",
8877
+ "filesystem-browse",
8878
+ "flood",
8879
+ "gas",
8880
+ "heating-valve",
8881
+ "humidifier",
8882
+ "humidity-sensor",
8883
+ "image",
8884
+ "image-settings",
8885
+ "integrations",
8886
+ "intercom",
8887
+ "keychain",
8888
+ "keychain-admin",
8889
+ "lawn-mower-control",
8890
+ "llm",
8891
+ "llm-runtime",
8892
+ "load-contribution",
8893
+ "local-network",
8894
+ "lock-control",
8895
+ "log-channels",
8896
+ "log-destination",
8897
+ "login-method",
8898
+ "media-player",
8899
+ "mesh-network",
8900
+ "metrics-provider",
8901
+ "model-convert",
8902
+ "model-distributor",
8903
+ "motion",
8904
+ "motion-detection",
8905
+ "motion-trigger",
8906
+ "motion-zones",
8907
+ "mqtt-broker",
8908
+ "native-object-detection",
8909
+ "navigation",
8910
+ "network-access",
8911
+ "network-link",
8912
+ "network-quality",
8913
+ "node-certificates",
8914
+ "nodes",
8915
+ "notification-output",
8916
+ "notification-rules",
8917
+ "notifier",
8918
+ "numeric-sensor",
8919
+ "oauth-integration",
8920
+ "oidc-connections",
8921
+ "osd",
8922
+ "osd-manager",
8923
+ "pet-feeder",
8924
+ "pipeline-analytics",
8925
+ "pipeline-executor",
8926
+ "pipeline-orchestrator",
8927
+ "pipeline-runner",
8928
+ "plate-gallery",
8929
+ "platform-probe",
8930
+ "power-meter",
8931
+ "presence",
8932
+ "pressure-sensor",
8933
+ "privacy-mask",
8934
+ "ptz",
8935
+ "ptz-autotrack",
8936
+ "reboot",
8937
+ "record-entries",
8938
+ "recording",
8939
+ "recording-archive",
8940
+ "recording-export",
8941
+ "recording-onboard",
8942
+ "recording-signal",
8943
+ "records",
8944
+ "running-state",
8945
+ "scene-monitor",
8946
+ "script-runner",
8947
+ "server-management",
8948
+ "settings-store",
8949
+ "smoke",
8950
+ "smtp-provider",
8951
+ "snapshot",
8952
+ "sso-bridge",
8953
+ "storage",
8954
+ "storage-admin",
8955
+ "storage-evictable",
8956
+ "storage-migration",
8957
+ "storage-occupancy",
8958
+ "storage-provider",
8959
+ "stream-broker",
8960
+ "stream-catalog",
8961
+ "stream-params",
8962
+ "stream-signals",
8963
+ "switch",
8964
+ "system",
8965
+ "tamper",
8966
+ "temperature-sensor",
8967
+ "terminal-session",
8968
+ "toast",
8969
+ "training",
8970
+ "training-provider",
8971
+ "turn-provider",
8972
+ "update",
8973
+ "user-management",
8974
+ "user-passkeys",
8975
+ "vacuum-control",
8976
+ "valve",
8977
+ "vector-store",
8978
+ "vibration",
8979
+ "videoclips",
8980
+ "viewer-ui",
8981
+ "water-heater",
8982
+ "weather",
8983
+ "webrtc-session",
8984
+ "zone-analytics",
8985
+ "zone-rules",
8986
+ "zones"
8987
+ ]);
8988
+ Object.freeze({
8989
+ "air-quality-sensor": [
8990
+ {
8991
+ "path": "co2Ppm",
8992
+ "valueType": "number"
8993
+ },
8994
+ {
8995
+ "path": "vocPpb",
8996
+ "valueType": "number"
8997
+ },
8998
+ {
8999
+ "path": "pm25",
9000
+ "valueType": "number"
9001
+ },
9002
+ {
9003
+ "path": "pm10",
9004
+ "valueType": "number"
9005
+ },
9006
+ {
9007
+ "path": "aqi",
9008
+ "valueType": "number"
9009
+ },
9010
+ {
9011
+ "path": "unit",
9012
+ "valueType": "string"
9013
+ },
9014
+ {
9015
+ "path": "precision",
9016
+ "valueType": "number"
9017
+ }
9018
+ ],
9019
+ "alarm-panel": [
9020
+ {
9021
+ "path": "state",
9022
+ "valueType": "enum",
9023
+ "enumValues": [
9024
+ "disarmed",
9025
+ "armed_home",
9026
+ "armed_away",
9027
+ "armed_night",
9028
+ "armed_vacation",
9029
+ "armed_custom_bypass",
9030
+ "arming",
9031
+ "disarming",
9032
+ "pending",
9033
+ "triggered"
9034
+ ]
9035
+ },
9036
+ {
9037
+ "path": "targetMode",
9038
+ "valueType": "enum",
9039
+ "enumValues": [
9040
+ "home",
9041
+ "away",
9042
+ "night",
9043
+ "vacation",
9044
+ "custom_bypass"
9045
+ ]
9046
+ },
9047
+ {
9048
+ "path": "requiresCode",
9049
+ "valueType": "boolean"
9050
+ }
9051
+ ],
9052
+ "ambient-light-sensor": [
9053
+ {
9054
+ "path": "lux",
9055
+ "valueType": "number"
9056
+ },
9057
+ {
9058
+ "path": "unit",
9059
+ "valueType": "string"
9060
+ },
9061
+ {
9062
+ "path": "precision",
9063
+ "valueType": "number"
9064
+ }
9065
+ ],
9066
+ "audio-metrics": [
9067
+ {
9068
+ "path": "ts",
9069
+ "valueType": "number"
9070
+ },
9071
+ {
9072
+ "path": "windowSec",
9073
+ "valueType": "number"
9074
+ },
9075
+ {
9076
+ "path": "level.rms",
9077
+ "valueType": "number"
9078
+ },
9079
+ {
9080
+ "path": "level.dbfs",
9081
+ "valueType": "number"
9082
+ },
9083
+ {
9084
+ "path": "peakDbfs",
9085
+ "valueType": "number"
9086
+ },
9087
+ {
9088
+ "path": "avgDbfs",
9089
+ "valueType": "number"
9090
+ },
9091
+ {
9092
+ "path": "current.className",
9093
+ "valueType": "string"
9094
+ },
9095
+ {
9096
+ "path": "current.score",
9097
+ "valueType": "number"
9098
+ },
9099
+ {
9100
+ "path": "current.timestamp",
9101
+ "valueType": "number"
9102
+ }
9103
+ ],
9104
+ "automation-control": [
9105
+ {
9106
+ "path": "enabled",
9107
+ "valueType": "boolean"
9108
+ },
9109
+ {
9110
+ "path": "isRunning",
9111
+ "valueType": "boolean"
9112
+ },
9113
+ {
9114
+ "path": "lastTriggeredAt",
9115
+ "valueType": "number"
9116
+ },
9117
+ {
9118
+ "path": "lastError",
9119
+ "valueType": "string"
9120
+ }
9121
+ ],
9122
+ "battery": [
9123
+ {
9124
+ "path": "percentage",
9125
+ "valueType": "number"
9126
+ },
9127
+ {
9128
+ "path": "charging",
9129
+ "valueType": "enum",
9130
+ "enumValues": [
9131
+ "dc",
9132
+ "solar",
9133
+ "none",
9134
+ "unknown"
9135
+ ]
9136
+ },
9137
+ {
9138
+ "path": "sleeping",
9139
+ "valueType": "boolean"
9140
+ },
9141
+ {
9142
+ "path": "lastUpdated",
9143
+ "valueType": "number"
9144
+ },
9145
+ {
9146
+ "path": "lastContactAt",
9147
+ "valueType": "number"
9148
+ },
9149
+ {
9150
+ "path": "lastFullRefreshAt",
9151
+ "valueType": "number"
9152
+ },
9153
+ {
9154
+ "path": "binary",
9155
+ "valueType": "boolean"
9156
+ }
9157
+ ],
9158
+ "binary": [{
9159
+ "path": "on",
9160
+ "valueType": "boolean"
9161
+ }],
9162
+ "brightness": [{
9163
+ "path": "percentage",
9164
+ "valueType": "number"
9165
+ }],
9166
+ "broker": [{
9167
+ "path": "brokerCount",
9168
+ "valueType": "number"
9169
+ }, {
9170
+ "path": "connectedCount",
9171
+ "valueType": "number"
9172
+ }],
9173
+ "camera-credentials": [
9174
+ {
9175
+ "path": "host",
9176
+ "valueType": "string"
9177
+ },
9178
+ {
9179
+ "path": "port",
9180
+ "valueType": "number"
9181
+ },
9182
+ {
9183
+ "path": "onvifPort",
9184
+ "valueType": "number"
9185
+ },
9186
+ {
9187
+ "path": "rtspPort",
9188
+ "valueType": "number"
9189
+ },
9190
+ {
9191
+ "path": "https",
9192
+ "valueType": "boolean"
9193
+ },
9194
+ {
9195
+ "path": "hasUsername",
9196
+ "valueType": "boolean"
9197
+ },
9198
+ {
9199
+ "path": "hasPassword",
9200
+ "valueType": "boolean"
9201
+ },
9202
+ {
9203
+ "path": "onvifProfile",
9204
+ "valueType": "string"
9205
+ }
9206
+ ],
9207
+ "camera-streams": [
9208
+ {
9209
+ "path": "online",
9210
+ "valueType": "boolean"
9211
+ },
9212
+ {
9213
+ "path": "slotStatuses.high",
9214
+ "valueType": "enum",
9215
+ "enumValues": [
9216
+ "unassigned",
9217
+ "idle",
9218
+ "connecting",
9219
+ "streaming",
9220
+ "error"
9221
+ ]
9222
+ },
9223
+ {
9224
+ "path": "slotStatuses.mid",
9225
+ "valueType": "enum",
9226
+ "enumValues": [
9227
+ "unassigned",
9228
+ "idle",
9229
+ "connecting",
9230
+ "streaming",
9231
+ "error"
9232
+ ]
9233
+ },
9234
+ {
9235
+ "path": "slotStatuses.low",
9236
+ "valueType": "enum",
9237
+ "enumValues": [
9238
+ "unassigned",
9239
+ "idle",
9240
+ "connecting",
9241
+ "streaming",
9242
+ "error"
9243
+ ]
9244
+ },
9245
+ {
9246
+ "path": "slotErrors.high",
9247
+ "valueType": "string"
9248
+ },
9249
+ {
9250
+ "path": "slotErrors.mid",
9251
+ "valueType": "string"
9252
+ },
9253
+ {
9254
+ "path": "slotErrors.low",
9255
+ "valueType": "string"
9256
+ }
9257
+ ],
9258
+ "carbon-monoxide": [{
9259
+ "path": "detected",
9260
+ "valueType": "boolean"
9261
+ }],
9262
+ "climate-control": [
9263
+ {
9264
+ "path": "mode",
9265
+ "valueType": "enum",
9266
+ "enumValues": [
9267
+ "off",
9268
+ "heat",
9269
+ "cool",
9270
+ "auto",
9271
+ "heat_cool",
9272
+ "fan_only",
9273
+ "dry"
9274
+ ]
9275
+ },
9276
+ {
9277
+ "path": "fanMode",
9278
+ "valueType": "string"
9279
+ },
9280
+ {
9281
+ "path": "preset",
9282
+ "valueType": "string"
9283
+ },
9284
+ {
9285
+ "path": "target",
9286
+ "valueType": "number"
9287
+ },
9288
+ {
9289
+ "path": "targetHigh",
9290
+ "valueType": "number"
9291
+ },
9292
+ {
9293
+ "path": "targetLow",
9294
+ "valueType": "number"
9295
+ },
9296
+ {
9297
+ "path": "targetHumidity",
9298
+ "valueType": "number"
9299
+ },
9300
+ {
9301
+ "path": "currentTemp",
9302
+ "valueType": "number"
9303
+ },
9304
+ {
9305
+ "path": "currentHumidity",
9306
+ "valueType": "number"
9307
+ },
9308
+ {
9309
+ "path": "swingVertical",
9310
+ "valueType": "boolean"
9311
+ },
9312
+ {
9313
+ "path": "swingHorizontal",
9314
+ "valueType": "boolean"
9315
+ },
9316
+ {
9317
+ "path": "minTemp",
9318
+ "valueType": "number"
9319
+ },
9320
+ {
9321
+ "path": "maxTemp",
9322
+ "valueType": "number"
9323
+ },
9324
+ {
9325
+ "path": "tempStep",
9326
+ "valueType": "number"
9327
+ }
9328
+ ],
9329
+ "color": [
9330
+ {
9331
+ "path": "mode",
9332
+ "valueType": "enum",
9333
+ "enumValues": [
9334
+ "rgb",
9335
+ "hsv",
9336
+ "mired"
9337
+ ]
9338
+ },
9339
+ {
9340
+ "path": "rgb.r",
9341
+ "valueType": "number"
9342
+ },
9343
+ {
9344
+ "path": "rgb.g",
9345
+ "valueType": "number"
9346
+ },
9347
+ {
9348
+ "path": "rgb.b",
9349
+ "valueType": "number"
9350
+ },
9351
+ {
9352
+ "path": "hsv.h",
9353
+ "valueType": "number"
9354
+ },
9355
+ {
9356
+ "path": "hsv.s",
9357
+ "valueType": "number"
9358
+ },
9359
+ {
9360
+ "path": "hsv.v",
9361
+ "valueType": "number"
9362
+ },
9363
+ {
9364
+ "path": "mireds",
9365
+ "valueType": "number"
9366
+ }
9367
+ ],
9368
+ "connectivity": [{
9369
+ "path": "connected",
9370
+ "valueType": "boolean"
9371
+ }],
9372
+ "contact": [{
9373
+ "path": "entryOpen",
9374
+ "valueType": "boolean"
9375
+ }],
9376
+ "control": [
9377
+ {
9378
+ "path": "kind",
9379
+ "valueType": "enum",
9380
+ "enumValues": [
9381
+ "numeric",
9382
+ "select",
9383
+ "text",
9384
+ "datetime"
9385
+ ]
9386
+ },
9387
+ {
9388
+ "path": "unit",
9389
+ "valueType": "string"
9390
+ },
9391
+ {
9392
+ "path": "min",
9393
+ "valueType": "number"
9394
+ },
9395
+ {
9396
+ "path": "max",
9397
+ "valueType": "number"
9398
+ },
9399
+ {
9400
+ "path": "step",
9401
+ "valueType": "number"
9402
+ },
9403
+ {
9404
+ "path": "precision",
9405
+ "valueType": "number"
9406
+ },
9407
+ {
9408
+ "path": "format",
9409
+ "valueType": "enum",
9410
+ "enumValues": [
9411
+ "date",
9412
+ "time",
9413
+ "datetime"
9414
+ ]
9415
+ }
9416
+ ],
9417
+ "cover": [
9418
+ {
9419
+ "path": "state",
9420
+ "valueType": "enum",
9421
+ "enumValues": [
9422
+ "open",
9423
+ "opening",
9424
+ "closing",
9425
+ "closed",
9426
+ "stopped"
9427
+ ]
9428
+ },
9429
+ {
9430
+ "path": "position",
9431
+ "valueType": "number"
9432
+ },
9433
+ {
9434
+ "path": "tiltPosition",
9435
+ "valueType": "number"
9436
+ }
9437
+ ],
9438
+ "day-night": [
9439
+ {
9440
+ "path": "mode",
9441
+ "valueType": "enum",
9442
+ "enumValues": [
9443
+ "auto",
9444
+ "day",
9445
+ "night",
9446
+ "schedule"
9447
+ ]
9448
+ },
9449
+ {
9450
+ "path": "sensitivity",
9451
+ "valueType": "number"
9452
+ },
9453
+ {
9454
+ "path": "switchDelaySec",
9455
+ "valueType": "number"
9456
+ }
9457
+ ],
9458
+ "device-adoption": [
9459
+ {
9460
+ "path": "lastDiscoveryAt",
9461
+ "valueType": "number"
9462
+ },
9463
+ {
9464
+ "path": "candidateCount",
9465
+ "valueType": "number"
9466
+ },
9467
+ {
9468
+ "path": "adoptedCount",
9469
+ "valueType": "number"
9470
+ },
9471
+ {
9472
+ "path": "lastError",
9473
+ "valueType": "string"
9474
+ }
9475
+ ],
9476
+ "device-discovery": [{
9477
+ "path": "lastDiscoveryAt",
9478
+ "valueType": "number"
9479
+ }, {
9480
+ "path": "lastError",
9481
+ "valueType": "string"
9482
+ }],
9483
+ "device-export": [
9484
+ {
9485
+ "path": "linkState",
9486
+ "valueType": "enum",
9487
+ "enumValues": [
9488
+ "unlinked",
9489
+ "linked",
9490
+ "error"
9491
+ ]
9492
+ },
9493
+ {
9494
+ "path": "exposedDeviceCount",
9495
+ "valueType": "number"
9496
+ },
9497
+ {
9498
+ "path": "error",
9499
+ "valueType": "string"
9500
+ },
9501
+ {
9502
+ "path": "setup.qr",
9503
+ "valueType": "string"
9504
+ },
9505
+ {
9506
+ "path": "setup.note",
9507
+ "valueType": "string"
9508
+ }
9509
+ ],
9510
+ "device-status": [{
9511
+ "path": "online",
9512
+ "valueType": "boolean"
9513
+ }],
9514
+ "dishwasher": [
9515
+ {
9516
+ "path": "availability",
9517
+ "valueType": "enum",
9518
+ "enumValues": [
9519
+ "available",
9520
+ "offline",
9521
+ "description-missing"
9522
+ ]
9523
+ },
9524
+ {
9525
+ "path": "state",
9526
+ "valueType": "enum",
9527
+ "enumValues": [
9528
+ "idle",
9529
+ "running",
9530
+ "paused",
9531
+ "finished",
9532
+ "error",
9533
+ "unavailable"
9534
+ ]
9535
+ },
9536
+ {
9537
+ "path": "operationState",
9538
+ "valueType": "enum",
9539
+ "enumValues": [
9540
+ "Inactive",
9541
+ "Ready",
9542
+ "DelayedStart",
9543
+ "Run",
9544
+ "Pause",
9545
+ "ActionRequired",
9546
+ "Finished",
9547
+ "Error",
9548
+ "Aborting"
9549
+ ]
9550
+ },
9551
+ {
9552
+ "path": "program",
9553
+ "valueType": "string"
9554
+ },
9555
+ {
9556
+ "path": "selectedProgram",
9557
+ "valueType": "string"
9558
+ },
9559
+ {
9560
+ "path": "remainingSeconds",
9561
+ "valueType": "number"
9562
+ },
9563
+ {
9564
+ "path": "delayedStartSeconds",
9565
+ "valueType": "number"
9566
+ },
9567
+ {
9568
+ "path": "progressPercent",
9569
+ "valueType": "number"
9570
+ },
9571
+ {
9572
+ "path": "doorOpen",
9573
+ "valueType": "boolean"
9574
+ },
9575
+ {
9576
+ "path": "doorLocked",
9577
+ "valueType": "boolean"
9578
+ },
9579
+ {
9580
+ "path": "remoteStartAllowed",
9581
+ "valueType": "boolean"
9582
+ },
9583
+ {
9584
+ "path": "remoteControlActive",
9585
+ "valueType": "boolean"
9586
+ },
9587
+ {
9588
+ "path": "localControlActive",
9589
+ "valueType": "boolean"
9590
+ },
9591
+ {
9592
+ "path": "powerOn",
9593
+ "valueType": "boolean"
9594
+ },
9595
+ {
9596
+ "path": "powerState",
9597
+ "valueType": "string"
9598
+ },
9599
+ {
9600
+ "path": "filterCleaningDue",
9601
+ "valueType": "boolean"
9602
+ },
9603
+ {
9604
+ "path": "machineCareDue",
9605
+ "valueType": "boolean"
9606
+ },
9607
+ {
9608
+ "path": "machineCareRemainingRuns",
9609
+ "valueType": "number"
9610
+ },
9611
+ {
9612
+ "path": "halfLoad",
9613
+ "valueType": "boolean"
9614
+ },
9615
+ {
9616
+ "path": "hygienePlus",
9617
+ "valueType": "boolean"
9618
+ },
9619
+ {
9620
+ "path": "extraDry",
9621
+ "valueType": "boolean"
9622
+ },
9623
+ {
9624
+ "path": "intensiveZone",
9625
+ "valueType": "boolean"
9626
+ },
9627
+ {
9628
+ "path": "varioSpeedPlus",
9629
+ "valueType": "boolean"
9630
+ },
9631
+ {
9632
+ "path": "childLock",
9633
+ "valueType": "boolean"
9634
+ },
9635
+ {
9636
+ "path": "errorCode",
9637
+ "valueType": "number"
9638
+ },
9639
+ {
9640
+ "path": "errorLabel",
9641
+ "valueType": "string"
9642
+ }
9643
+ ],
9644
+ "doorbell": [{
9645
+ "path": "lastPressedAt",
9646
+ "valueType": "number"
9647
+ }, {
9648
+ "path": "pressCountSinceStart",
9649
+ "valueType": "number"
9650
+ }],
9651
+ "enum-sensor": [{
9652
+ "path": "value",
9653
+ "valueType": "string"
9654
+ }, {
9655
+ "path": "format",
9656
+ "valueType": "enum",
9657
+ "enumValues": [
9658
+ "date",
9659
+ "time",
9660
+ "datetime"
9661
+ ]
9662
+ }],
9663
+ "event-emitter": [
9664
+ {
9665
+ "path": "lastEvent.deviceId",
9666
+ "valueType": "number"
9667
+ },
9668
+ {
9669
+ "path": "lastEvent.eventType",
9670
+ "valueType": "string"
9671
+ },
9672
+ {
9673
+ "path": "lastEvent.timestamp",
9674
+ "valueType": "number"
9675
+ },
9676
+ {
9677
+ "path": "lastEvent.seq",
9678
+ "valueType": "number"
9679
+ },
9680
+ {
9681
+ "path": "eventCountSinceStart",
9682
+ "valueType": "number"
9683
+ }
9684
+ ],
9685
+ "fan-control": [
9686
+ {
9687
+ "path": "percentage",
9688
+ "valueType": "number"
9689
+ },
9690
+ {
9691
+ "path": "percentageStep",
9692
+ "valueType": "number"
9693
+ },
9694
+ {
9695
+ "path": "preset",
9696
+ "valueType": "string"
9697
+ },
9698
+ {
9699
+ "path": "direction",
9700
+ "valueType": "enum",
9701
+ "enumValues": ["forward", "reverse"]
9702
+ },
9703
+ {
9704
+ "path": "oscillating",
9705
+ "valueType": "boolean"
9706
+ }
9707
+ ],
9708
+ "feature-probe": [
9709
+ {
9710
+ "path": "deviceType",
9711
+ "valueType": "string"
9712
+ },
9713
+ {
9714
+ "path": "model",
9715
+ "valueType": "string"
9716
+ },
9717
+ {
9718
+ "path": "channelCount",
9719
+ "valueType": "number"
9720
+ },
9721
+ {
9722
+ "path": "lastProbedAt",
9723
+ "valueType": "number"
9724
+ }
9725
+ ],
9726
+ "flood": [{
9727
+ "path": "flooded",
9728
+ "valueType": "boolean"
9729
+ }],
9730
+ "gas": [{
9731
+ "path": "detected",
9732
+ "valueType": "boolean"
9733
+ }],
9734
+ "heating-valve": [{
9735
+ "path": "position",
9736
+ "valueType": "number"
9737
+ }],
9738
+ "humidifier": [
9739
+ {
9740
+ "path": "on",
9741
+ "valueType": "boolean"
9742
+ },
9743
+ {
9744
+ "path": "currentHumidity",
9745
+ "valueType": "number"
9746
+ },
9747
+ {
9748
+ "path": "targetHumidity",
9749
+ "valueType": "number"
9750
+ },
9751
+ {
9752
+ "path": "mode",
9753
+ "valueType": "string"
9754
+ },
9755
+ {
9756
+ "path": "action",
9757
+ "valueType": "string"
9758
+ },
9759
+ {
9760
+ "path": "minHumidity",
9761
+ "valueType": "number"
9762
+ },
9763
+ {
9764
+ "path": "maxHumidity",
9765
+ "valueType": "number"
9766
+ }
9767
+ ],
9768
+ "humidity-sensor": [
9769
+ {
9770
+ "path": "percent",
9771
+ "valueType": "number"
9772
+ },
9773
+ {
9774
+ "path": "unit",
9775
+ "valueType": "string"
9776
+ },
9777
+ {
9778
+ "path": "precision",
9779
+ "valueType": "number"
9780
+ }
9781
+ ],
9782
+ "image": [{
9783
+ "path": "url",
9784
+ "valueType": "string"
9785
+ }, {
9786
+ "path": "lastUpdated",
9787
+ "valueType": "number"
9788
+ }],
9789
+ "image-settings": [
9790
+ {
9791
+ "path": "brightness",
9792
+ "valueType": "number"
9793
+ },
9794
+ {
9795
+ "path": "contrast",
9796
+ "valueType": "number"
9797
+ },
9798
+ {
9799
+ "path": "saturation",
9800
+ "valueType": "number"
9801
+ },
9802
+ {
9803
+ "path": "sharpness",
9804
+ "valueType": "number"
9805
+ },
9806
+ {
9807
+ "path": "mirror",
9808
+ "valueType": "boolean"
9809
+ },
9810
+ {
9811
+ "path": "flip",
9812
+ "valueType": "boolean"
9813
+ },
9814
+ {
9815
+ "path": "rotate",
9816
+ "valueType": "enum",
9817
+ "enumValues": [
9818
+ "0",
9819
+ "90",
9820
+ "180",
9821
+ "270"
9822
+ ]
9823
+ },
9824
+ {
9825
+ "path": "whiteBalance",
9826
+ "valueType": "enum",
9827
+ "enumValues": ["auto", "manual"]
9828
+ },
9829
+ {
9830
+ "path": "warmth",
9831
+ "valueType": "number"
9832
+ },
9833
+ {
9834
+ "path": "exposureMode",
9835
+ "valueType": "enum",
9836
+ "enumValues": ["auto", "manual"]
9837
+ },
9838
+ {
9839
+ "path": "backlightMode",
9840
+ "valueType": "enum",
9841
+ "enumValues": [
9842
+ "off",
9843
+ "blc",
9844
+ "wdr",
9845
+ "hlc"
9846
+ ]
9847
+ }
9848
+ ],
9849
+ "intercom": [
9850
+ {
9851
+ "path": "talking",
9852
+ "valueType": "boolean"
9853
+ },
9854
+ {
9855
+ "path": "lastSessionAt",
9856
+ "valueType": "number"
9857
+ },
9858
+ {
9859
+ "path": "ability.sampleRate",
9860
+ "valueType": "number"
9861
+ },
9862
+ {
9863
+ "path": "ability.duplex",
9864
+ "valueType": "enum",
9865
+ "enumValues": ["half", "full"]
9866
+ },
9867
+ {
9868
+ "path": "ability.maxBacklogMs",
9869
+ "valueType": "number"
9870
+ }
9871
+ ],
9872
+ "lawn-mower-control": [
9873
+ {
9874
+ "path": "activity",
9875
+ "valueType": "enum",
9876
+ "enumValues": [
9877
+ "idle",
9878
+ "mowing",
9879
+ "paused",
9880
+ "docked",
9881
+ "error"
9882
+ ]
9883
+ },
9884
+ {
9885
+ "path": "batteryLevel",
9886
+ "valueType": "number"
9887
+ },
9888
+ {
9889
+ "path": "progressPercent",
9890
+ "valueType": "number"
9891
+ },
9892
+ {
9893
+ "path": "currentCode",
9894
+ "valueType": "number"
9895
+ },
9896
+ {
9897
+ "path": "currentCodeLabel",
9898
+ "valueType": "string"
9899
+ },
9900
+ {
9901
+ "path": "severity",
9902
+ "valueType": "enum",
9903
+ "enumValues": [
9904
+ "info",
9905
+ "warning",
9906
+ "error"
9907
+ ]
9908
+ }
9909
+ ],
9910
+ "lock-control": [{
9911
+ "path": "state",
9912
+ "valueType": "enum",
9913
+ "enumValues": [
9914
+ "locked",
9915
+ "unlocked",
9916
+ "locking",
9917
+ "unlocking",
9918
+ "jammed"
9919
+ ]
9920
+ }],
9921
+ "media-player": [
9922
+ {
9923
+ "path": "state",
9924
+ "valueType": "enum",
9925
+ "enumValues": [
9926
+ "off",
9927
+ "on",
9928
+ "idle",
9929
+ "playing",
9930
+ "paused",
9931
+ "buffering",
9932
+ "standby"
9933
+ ]
9934
+ },
9935
+ {
9936
+ "path": "volumeLevel",
9937
+ "valueType": "number"
9938
+ },
9939
+ {
9940
+ "path": "isMuted",
9941
+ "valueType": "boolean"
9942
+ },
9943
+ {
9944
+ "path": "source",
9945
+ "valueType": "string"
9946
+ },
9947
+ {
9948
+ "path": "currentMedia.type",
9949
+ "valueType": "string"
9950
+ },
9951
+ {
9952
+ "path": "currentMedia.title",
9953
+ "valueType": "string"
9954
+ },
9955
+ {
9956
+ "path": "currentMedia.artist",
9957
+ "valueType": "string"
9958
+ },
9959
+ {
9960
+ "path": "currentMedia.album",
9961
+ "valueType": "string"
9962
+ },
9963
+ {
9964
+ "path": "currentMedia.imageUrl",
9965
+ "valueType": "string"
9966
+ },
9967
+ {
9968
+ "path": "positionMs",
9969
+ "valueType": "number"
9970
+ },
9971
+ {
9972
+ "path": "durationMs",
9973
+ "valueType": "number"
9974
+ },
9975
+ {
9976
+ "path": "shuffle",
9977
+ "valueType": "boolean"
9978
+ },
9979
+ {
9980
+ "path": "repeat",
9981
+ "valueType": "enum",
9982
+ "enumValues": [
9983
+ "off",
9984
+ "all",
9985
+ "one"
9986
+ ]
9987
+ }
9988
+ ],
9989
+ "motion": [
9990
+ {
9991
+ "path": "detected",
9992
+ "valueType": "boolean"
9993
+ },
9994
+ {
9995
+ "path": "lastDetectedAt",
9996
+ "valueType": "number"
9997
+ },
9998
+ {
9999
+ "path": "autoClearAfterMs",
10000
+ "valueType": "number"
10001
+ }
10002
+ ],
10003
+ "motion-trigger": [{
10004
+ "path": "enabled",
10005
+ "valueType": "boolean"
10006
+ }],
10007
+ "motion-zones": [{
10008
+ "path": "enabled",
10009
+ "valueType": "boolean"
10010
+ }, {
10011
+ "path": "sensitivity",
10012
+ "valueType": "number"
10013
+ }],
10014
+ "mqtt-broker": [{
10015
+ "path": "brokerCount",
10016
+ "valueType": "number"
10017
+ }, {
10018
+ "path": "embeddedRunning",
10019
+ "valueType": "boolean"
10020
+ }],
10021
+ "native-object-detection": [{
10022
+ "path": "enabled",
10023
+ "valueType": "boolean"
10024
+ }],
10025
+ "navigation": [
10026
+ {
10027
+ "path": "mode",
10028
+ "valueType": "enum",
10029
+ "enumValues": [
10030
+ "idle",
10031
+ "cleaning",
10032
+ "spot",
10033
+ "following",
10034
+ "goto",
10035
+ "returning",
10036
+ "paused",
10037
+ "unknown"
10038
+ ]
10039
+ },
10040
+ {
10041
+ "path": "following",
10042
+ "valueType": "boolean"
10043
+ },
10044
+ {
10045
+ "path": "flash",
10046
+ "valueType": "boolean"
10047
+ },
10048
+ {
10049
+ "path": "lightMode",
10050
+ "valueType": "enum",
10051
+ "enumValues": ["auto", "manual"]
10052
+ },
10053
+ {
10054
+ "path": "lightLevel",
10055
+ "valueType": "number"
10056
+ }
10057
+ ],
10058
+ "network-link": [
10059
+ {
10060
+ "path": "type",
10061
+ "valueType": "enum",
10062
+ "enumValues": [
10063
+ "wifi",
10064
+ "ethernet",
10065
+ "cellular",
10066
+ "unknown"
10067
+ ]
10068
+ },
10069
+ {
10070
+ "path": "signalPercent",
10071
+ "valueType": "number"
10072
+ },
10073
+ {
10074
+ "path": "rssiDbm",
10075
+ "valueType": "number"
10076
+ },
10077
+ {
10078
+ "path": "ssid",
10079
+ "valueType": "string"
10080
+ },
10081
+ {
10082
+ "path": "lastUpdated",
10083
+ "valueType": "number"
10084
+ }
10085
+ ],
10086
+ "notifier": [
10087
+ {
10088
+ "path": "lastSentAt",
10089
+ "valueType": "number"
10090
+ },
10091
+ {
10092
+ "path": "lastError",
10093
+ "valueType": "string"
10094
+ },
10095
+ {
10096
+ "path": "queueDepth",
10097
+ "valueType": "number"
10098
+ },
10099
+ {
10100
+ "path": "supports.image",
10101
+ "valueType": "boolean"
10102
+ },
10103
+ {
10104
+ "path": "supports.priority",
10105
+ "valueType": "boolean"
10106
+ },
10107
+ {
10108
+ "path": "supports.data",
10109
+ "valueType": "boolean"
10110
+ },
10111
+ {
10112
+ "path": "supports.actions",
10113
+ "valueType": "boolean"
10114
+ },
10115
+ {
10116
+ "path": "supports.recipients",
10117
+ "valueType": "boolean"
10118
+ }
10119
+ ],
10120
+ "numeric-sensor": [
10121
+ {
10122
+ "path": "value",
10123
+ "valueType": "number"
10124
+ },
10125
+ {
10126
+ "path": "unit",
10127
+ "valueType": "string"
10128
+ },
10129
+ {
10130
+ "path": "precision",
10131
+ "valueType": "number"
10132
+ }
10133
+ ],
10134
+ "pet-feeder": [
10135
+ {
10136
+ "path": "foodLevel",
10137
+ "valueType": "number"
10138
+ },
10139
+ {
10140
+ "path": "food1",
10141
+ "valueType": "number"
10142
+ },
10143
+ {
10144
+ "path": "food2",
10145
+ "valueType": "number"
10146
+ },
10147
+ {
10148
+ "path": "lowFood",
10149
+ "valueType": "boolean"
10150
+ },
10151
+ {
10152
+ "path": "batteryPower",
10153
+ "valueType": "number"
10154
+ },
10155
+ {
10156
+ "path": "desiccantLeftDays",
10157
+ "valueType": "number"
10158
+ },
10159
+ {
10160
+ "path": "feeding",
10161
+ "valueType": "boolean"
10162
+ },
10163
+ {
10164
+ "path": "status",
10165
+ "valueType": "enum",
10166
+ "enumValues": [
10167
+ "normal",
10168
+ "offline",
10169
+ "on_batteries"
10170
+ ]
10171
+ },
10172
+ {
10173
+ "path": "error",
10174
+ "valueType": "string"
10175
+ },
10176
+ {
10177
+ "path": "errorCode",
10178
+ "valueType": "number"
10179
+ },
10180
+ {
10181
+ "path": "isDualHopper",
10182
+ "valueType": "boolean"
10183
+ },
10184
+ {
10185
+ "path": "childLock",
10186
+ "valueType": "boolean"
10187
+ },
10188
+ {
10189
+ "path": "indicatorLight",
10190
+ "valueType": "boolean"
10191
+ },
10192
+ {
10193
+ "path": "feedSound",
10194
+ "valueType": "boolean"
10195
+ },
10196
+ {
10197
+ "path": "volume",
10198
+ "valueType": "number"
10199
+ }
10200
+ ],
10201
+ "power-meter": [
10202
+ {
10203
+ "path": "watts",
10204
+ "valueType": "number"
10205
+ },
10206
+ {
10207
+ "path": "kwhTotal",
10208
+ "valueType": "number"
10209
+ },
10210
+ {
10211
+ "path": "volts",
10212
+ "valueType": "number"
10213
+ },
10214
+ {
10215
+ "path": "amps",
10216
+ "valueType": "number"
10217
+ },
10218
+ {
10219
+ "path": "va",
10220
+ "valueType": "number"
10221
+ },
10222
+ {
10223
+ "path": "powerFactor",
10224
+ "valueType": "number"
10225
+ },
10226
+ {
10227
+ "path": "unit",
10228
+ "valueType": "string"
10229
+ },
10230
+ {
10231
+ "path": "precision",
10232
+ "valueType": "number"
10233
+ }
10234
+ ],
10235
+ "presence": [
10236
+ {
10237
+ "path": "state",
10238
+ "valueType": "string"
10239
+ },
10240
+ {
10241
+ "path": "location",
10242
+ "valueType": "string"
10243
+ },
10244
+ {
10245
+ "path": "gps.latitude",
10246
+ "valueType": "number"
10247
+ },
10248
+ {
10249
+ "path": "gps.longitude",
10250
+ "valueType": "number"
10251
+ },
10252
+ {
10253
+ "path": "gps.accuracyMeters",
10254
+ "valueType": "number"
10255
+ },
10256
+ {
10257
+ "path": "batteryPercent",
10258
+ "valueType": "number"
10259
+ }
10260
+ ],
10261
+ "pressure-sensor": [
10262
+ {
10263
+ "path": "hpa",
10264
+ "valueType": "number"
10265
+ },
10266
+ {
10267
+ "path": "unit",
10268
+ "valueType": "string"
10269
+ },
10270
+ {
10271
+ "path": "precision",
10272
+ "valueType": "number"
10273
+ }
10274
+ ],
10275
+ "privacy-mask": [{
10276
+ "path": "enabled",
10277
+ "valueType": "boolean"
10278
+ }, {
10279
+ "path": "audioEnabled",
10280
+ "valueType": "boolean"
10281
+ }],
10282
+ "ptz": [
10283
+ {
10284
+ "path": "pan",
10285
+ "valueType": "number"
10286
+ },
10287
+ {
10288
+ "path": "tilt",
10289
+ "valueType": "number"
10290
+ },
10291
+ {
10292
+ "path": "zoom",
10293
+ "valueType": "number"
10294
+ },
10295
+ {
10296
+ "path": "autofocus",
10297
+ "valueType": "boolean"
10298
+ }
10299
+ ],
10300
+ "ptz-autotrack": [
10301
+ {
10302
+ "path": "enabled",
10303
+ "valueType": "boolean"
10304
+ },
10305
+ {
10306
+ "path": "currentSettings.targetType",
10307
+ "valueType": "string"
10308
+ },
10309
+ {
10310
+ "path": "currentSettings.stopDelaySeconds",
10311
+ "valueType": "number"
10312
+ },
10313
+ {
10314
+ "path": "currentSettings.disappearDelaySeconds",
10315
+ "valueType": "number"
10316
+ }
10317
+ ],
10318
+ "recording-archive": [
10319
+ {
10320
+ "path": "deviceId",
10321
+ "valueType": "number"
10322
+ },
10323
+ {
10324
+ "path": "enabled",
10325
+ "valueType": "boolean"
10326
+ },
10327
+ {
10328
+ "path": "activeMode",
10329
+ "valueType": "enum",
10330
+ "enumValues": [
10331
+ "off",
10332
+ "events",
10333
+ "continuous",
10334
+ "on-device-decision"
10335
+ ]
10336
+ },
10337
+ {
10338
+ "path": "nodeId",
10339
+ "valueType": "string"
10340
+ },
10341
+ {
10342
+ "path": "storageBytes",
10343
+ "valueType": "number"
10344
+ }
10345
+ ],
10346
+ "recording-onboard": [
10347
+ {
10348
+ "path": "primaryTrackId",
10349
+ "valueType": "string"
10350
+ },
10351
+ {
10352
+ "path": "enabled",
10353
+ "valueType": "boolean"
10354
+ },
10355
+ {
10356
+ "path": "overwriteWhenFull",
10357
+ "valueType": "boolean"
10358
+ },
10359
+ {
10360
+ "path": "preRecordSec",
10361
+ "valueType": "number"
10362
+ },
10363
+ {
10364
+ "path": "postRecordSec",
10365
+ "valueType": "number"
10366
+ },
10367
+ {
10368
+ "path": "segmentMinutes",
10369
+ "valueType": "number"
10370
+ },
10371
+ {
10372
+ "path": "unreadableWindows",
10373
+ "valueType": "number"
10374
+ },
10375
+ {
10376
+ "path": "recordingToNowhere",
10377
+ "valueType": "boolean"
10378
+ }
10379
+ ],
10380
+ "recording-signal": [{
10381
+ "path": "active",
10382
+ "valueType": "boolean"
10383
+ }, {
10384
+ "path": "reason",
10385
+ "valueType": "string"
10386
+ }],
10387
+ "running-state": [
10388
+ {
10389
+ "path": "running",
10390
+ "valueType": "boolean"
10391
+ },
10392
+ {
10393
+ "path": "since",
10394
+ "valueType": "number"
10395
+ },
10396
+ {
10397
+ "path": "source",
10398
+ "valueType": "enum",
10399
+ "enumValues": ["native", "assigned"]
10400
+ },
10401
+ {
10402
+ "path": "phase",
10403
+ "valueType": "string"
10404
+ }
10405
+ ],
10406
+ "script-runner": [
10407
+ {
10408
+ "path": "isRunning",
10409
+ "valueType": "boolean"
10410
+ },
10411
+ {
10412
+ "path": "lastRunAt",
10413
+ "valueType": "number"
10414
+ },
10415
+ {
10416
+ "path": "lastRunSuccess",
10417
+ "valueType": "boolean"
10418
+ },
10419
+ {
10420
+ "path": "lastError",
10421
+ "valueType": "string"
10422
+ }
10423
+ ],
10424
+ "smoke": [{
10425
+ "path": "detected",
10426
+ "valueType": "boolean"
10427
+ }],
10428
+ "snapshot": [
10429
+ {
10430
+ "path": "lastCapturedAt",
10431
+ "valueType": "number"
10432
+ },
10433
+ {
10434
+ "path": "cacheAgeMs",
10435
+ "valueType": "number"
10436
+ },
10437
+ {
10438
+ "path": "lastBytes",
10439
+ "valueType": "number"
10440
+ },
10441
+ {
10442
+ "path": "lastStreamId",
10443
+ "valueType": "string"
10444
+ }
10445
+ ],
10446
+ "stream-params": [
10447
+ {
10448
+ "path": "main.width",
10449
+ "valueType": "number"
10450
+ },
10451
+ {
10452
+ "path": "main.height",
10453
+ "valueType": "number"
10454
+ },
10455
+ {
10456
+ "path": "main.codec",
10457
+ "valueType": "enum",
10458
+ "enumValues": ["h264", "h265"]
10459
+ },
10460
+ {
10461
+ "path": "main.framerate",
10462
+ "valueType": "number"
10463
+ },
10464
+ {
10465
+ "path": "main.bitrate",
10466
+ "valueType": "number"
10467
+ },
10468
+ {
10469
+ "path": "main.bitrateMode",
10470
+ "valueType": "enum",
10471
+ "enumValues": ["vbr", "cbr"]
10472
+ },
10473
+ {
10474
+ "path": "main.encoderProfile",
10475
+ "valueType": "enum",
10476
+ "enumValues": [
10477
+ "high",
10478
+ "main",
10479
+ "baseline"
10480
+ ]
10481
+ },
10482
+ {
10483
+ "path": "main.gop",
10484
+ "valueType": "number"
10485
+ },
10486
+ {
10487
+ "path": "main.audio",
10488
+ "valueType": "boolean"
10489
+ },
10490
+ {
10491
+ "path": "sub.width",
10492
+ "valueType": "number"
10493
+ },
10494
+ {
10495
+ "path": "sub.height",
10496
+ "valueType": "number"
10497
+ },
10498
+ {
10499
+ "path": "sub.codec",
10500
+ "valueType": "enum",
10501
+ "enumValues": ["h264", "h265"]
10502
+ },
10503
+ {
10504
+ "path": "sub.framerate",
10505
+ "valueType": "number"
10506
+ },
10507
+ {
10508
+ "path": "sub.bitrate",
10509
+ "valueType": "number"
10510
+ },
10511
+ {
10512
+ "path": "sub.bitrateMode",
10513
+ "valueType": "enum",
10514
+ "enumValues": ["vbr", "cbr"]
10515
+ },
10516
+ {
10517
+ "path": "sub.encoderProfile",
10518
+ "valueType": "enum",
10519
+ "enumValues": [
10520
+ "high",
10521
+ "main",
10522
+ "baseline"
10523
+ ]
10524
+ },
10525
+ {
10526
+ "path": "sub.gop",
10527
+ "valueType": "number"
10528
+ },
10529
+ {
10530
+ "path": "sub.audio",
10531
+ "valueType": "boolean"
10532
+ },
10533
+ {
10534
+ "path": "ext.width",
10535
+ "valueType": "number"
10536
+ },
10537
+ {
10538
+ "path": "ext.height",
10539
+ "valueType": "number"
10540
+ },
10541
+ {
10542
+ "path": "ext.codec",
10543
+ "valueType": "enum",
10544
+ "enumValues": ["h264", "h265"]
10545
+ },
10546
+ {
10547
+ "path": "ext.framerate",
10548
+ "valueType": "number"
10549
+ },
10550
+ {
10551
+ "path": "ext.bitrate",
10552
+ "valueType": "number"
10553
+ },
10554
+ {
10555
+ "path": "ext.bitrateMode",
10556
+ "valueType": "enum",
10557
+ "enumValues": ["vbr", "cbr"]
10558
+ },
10559
+ {
10560
+ "path": "ext.encoderProfile",
10561
+ "valueType": "enum",
10562
+ "enumValues": [
10563
+ "high",
10564
+ "main",
10565
+ "baseline"
10566
+ ]
10567
+ },
10568
+ {
10569
+ "path": "ext.gop",
10570
+ "valueType": "number"
10571
+ },
10572
+ {
10573
+ "path": "ext.audio",
10574
+ "valueType": "boolean"
10575
+ }
10576
+ ],
10577
+ "switch": [{
10578
+ "path": "on",
10579
+ "valueType": "boolean"
10580
+ }],
10581
+ "tamper": [{
10582
+ "path": "tampered",
10583
+ "valueType": "boolean"
10584
+ }],
10585
+ "temperature-sensor": [
10586
+ {
10587
+ "path": "celsius",
10588
+ "valueType": "number"
10589
+ },
10590
+ {
10591
+ "path": "unit",
10592
+ "valueType": "string"
10593
+ },
10594
+ {
10595
+ "path": "precision",
10596
+ "valueType": "number"
10597
+ }
10598
+ ],
10599
+ "update": [
10600
+ {
10601
+ "path": "currentVersion",
10602
+ "valueType": "string"
10603
+ },
10604
+ {
10605
+ "path": "availableVersion",
10606
+ "valueType": "string"
10607
+ },
10608
+ {
10609
+ "path": "updatable",
10610
+ "valueType": "boolean"
10611
+ },
10612
+ {
10613
+ "path": "state",
10614
+ "valueType": "string"
10615
+ },
10616
+ {
10617
+ "path": "inProgress",
10618
+ "valueType": "boolean"
10619
+ }
10620
+ ],
10621
+ "vacuum-control": [
10622
+ {
10623
+ "path": "state",
10624
+ "valueType": "enum",
10625
+ "enumValues": [
10626
+ "idle",
10627
+ "cleaning",
10628
+ "paused",
10629
+ "returning",
10630
+ "docked",
10631
+ "drying",
10632
+ "error"
10633
+ ]
10634
+ },
10635
+ {
10636
+ "path": "batteryLevel",
10637
+ "valueType": "number"
10638
+ },
10639
+ {
10640
+ "path": "fanSpeed",
10641
+ "valueType": "string"
10642
+ },
10643
+ {
10644
+ "path": "progressPercent",
10645
+ "valueType": "number"
10646
+ },
10647
+ {
10648
+ "path": "errorCode",
10649
+ "valueType": "number"
10650
+ },
10651
+ {
10652
+ "path": "errorLabel",
10653
+ "valueType": "string"
10654
+ }
10655
+ ],
10656
+ "valve": [{
10657
+ "path": "state",
10658
+ "valueType": "enum",
10659
+ "enumValues": [
10660
+ "open",
10661
+ "opening",
10662
+ "closing",
10663
+ "closed",
10664
+ "stopped"
10665
+ ]
10666
+ }, {
10667
+ "path": "position",
10668
+ "valueType": "number"
10669
+ }],
10670
+ "vibration": [{
10671
+ "path": "detected",
10672
+ "valueType": "boolean"
10673
+ }],
10674
+ "water-heater": [
10675
+ {
10676
+ "path": "currentTemp",
10677
+ "valueType": "number"
10678
+ },
10679
+ {
10680
+ "path": "targetTemp",
10681
+ "valueType": "number"
10682
+ },
10683
+ {
10684
+ "path": "operationMode",
10685
+ "valueType": "string"
10686
+ },
10687
+ {
10688
+ "path": "away",
10689
+ "valueType": "boolean"
10690
+ },
10691
+ {
10692
+ "path": "minTemp",
10693
+ "valueType": "number"
10694
+ },
10695
+ {
10696
+ "path": "maxTemp",
10697
+ "valueType": "number"
10698
+ }
10699
+ ],
10700
+ "weather": [
10701
+ {
10702
+ "path": "condition",
10703
+ "valueType": "string"
10704
+ },
10705
+ {
10706
+ "path": "temperature",
10707
+ "valueType": "number"
10708
+ },
10709
+ {
10710
+ "path": "temperatureUnit",
10711
+ "valueType": "string"
10712
+ },
10713
+ {
10714
+ "path": "humidity",
10715
+ "valueType": "number"
10716
+ },
10717
+ {
10718
+ "path": "pressure",
10719
+ "valueType": "number"
10720
+ },
10721
+ {
10722
+ "path": "pressureUnit",
10723
+ "valueType": "string"
10724
+ },
10725
+ {
10726
+ "path": "windSpeed",
10727
+ "valueType": "number"
10728
+ },
10729
+ {
10730
+ "path": "windSpeedUnit",
10731
+ "valueType": "string"
10732
+ },
10733
+ {
10734
+ "path": "windBearing",
10735
+ "valueType": "number"
10736
+ }
10737
+ ],
10738
+ "zone-analytics": [
10739
+ {
10740
+ "path": "ts",
10741
+ "valueType": "number"
10742
+ },
10743
+ {
10744
+ "path": "frameWidth",
10745
+ "valueType": "number"
10746
+ },
10747
+ {
10748
+ "path": "frameHeight",
10749
+ "valueType": "number"
10750
+ },
10751
+ {
10752
+ "path": "frame.totalObjects",
10753
+ "valueType": "number"
10754
+ },
10755
+ {
10756
+ "path": "frame.standingObjects",
10757
+ "valueType": "number"
10758
+ },
10759
+ {
10760
+ "path": "frame.transientObjects",
10761
+ "valueType": "number"
10762
+ },
10763
+ {
10764
+ "path": "unzoned.totalObjects",
10765
+ "valueType": "number"
10766
+ },
10767
+ {
10768
+ "path": "unzoned.standingObjects",
10769
+ "valueType": "number"
10770
+ },
10771
+ {
10772
+ "path": "unzoned.transientObjects",
10773
+ "valueType": "number"
10774
+ }
10775
+ ]
10776
+ });
8803
10777
  object({
8804
10778
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8805
10779
  params: record(string(), union([string(), number()])).optional()
@@ -9148,7 +11122,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
9148
11122
  return DeviceRole;
9149
11123
  }({});
9150
11124
  //#endregion
9151
- //#region ../types/dist/composition-BJ8iAZb3.mjs
11125
+ //#region ../types/dist/composition-kEl9mevu.mjs
9152
11126
  /**
9153
11127
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9154
11128
  *
@@ -12381,7 +14355,7 @@ var LogChannelDescriptorSchema = object({
12381
14355
  * `true` is a PROMISE with two halves, and both must hold: the gate is
12382
14356
  * consulted with the numeric device id, AND every line the channel admits
12383
14357
  * carries `tags: { deviceId }` with that same numeric id. The second half is
12384
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
14358
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
12385
14359
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
12386
14360
  * the body is the only way to filter.
12387
14361
  *
@@ -12569,7 +14543,7 @@ var ModelVariantGroupSchema = object({
12569
14543
  precision: _enum(["fp32", "int8"]).optional(),
12570
14544
  /**
12571
14545
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12572
- * an alternate training of the same family (Scrypted `relu_test`); chip
14546
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
12573
14547
  * label is "Test".
12574
14548
  */
12575
14549
  optimization: _enum(["standard", "test"]).optional(),
@@ -12821,8 +14795,8 @@ var ModelCatalogEntrySchema = object({
12821
14795
  provider: ModelProviderIdSchema.optional(),
12822
14796
  /**
12823
14797
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
12824
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
12825
- * labels already ARE the CamStack macros (Scrypted identity map).
14798
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
14799
+ * labels already ARE the CamStack macros (plugin catalog identity map).
12826
14800
  */
12827
14801
  classMap: DetectionCatalogClassMapSchema.optional(),
12828
14802
  /**
@@ -15808,7 +17782,7 @@ method(object({
15808
17782
  * `1` is real time and is the ONLY value that allows the copy branch —
15809
17783
  * anything else forces `libx264` over the window. That was priced
15810
17784
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
15811
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
17785
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
15812
17786
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
15813
17787
  * once the decode is forced the width stops being free.
15814
17788
  */
@@ -16228,6 +18202,7 @@ var CompositionRunStatusSchema = _enum([
16228
18202
  "starting",
16229
18203
  "running",
16230
18204
  "degraded",
18205
+ "incomplete",
16231
18206
  "failed"
16232
18207
  ]);
16233
18208
  var CompositionFieldStateKindSchema = _enum([
@@ -16441,6 +18416,7 @@ var CoreBlockStatusSchema = _enum([
16441
18416
  "starting",
16442
18417
  "running",
16443
18418
  "degraded",
18419
+ "incomplete",
16444
18420
  "failed"
16445
18421
  ]);
16446
18422
  /** path → TypeScript source for a multi-file block. */
@@ -38364,7 +40340,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
38364
40340
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
38365
40341
  * operator's casing. The registry matches labels trimmed + case-insensitively
38366
40342
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
38367
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
40343
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
38368
40344
  * map keyed on the displayed casing would orphan its entry on exactly that
38369
40345
  * edit. Consumers join by keying their own label through `locationIconKey`.
38370
40346
  */
@@ -38389,7 +40365,7 @@ var LocationDescriptionAssignmentSchema = object({
38389
40365
  /**
38390
40366
  * A SITE ZONE — a named part of the property that several locations belong to.
38391
40367
  *
38392
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
40368
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
38393
40369
  * kitchen. A camera belongs to exactly one location, and a location to at most
38394
40370
  * one zone, so a camera's zone is derived and never stored on the device: the
38395
40371
  * whole point of this entity is that grouping rooms touches no device row.
@@ -38418,7 +40394,7 @@ var LocationDescriptionAssignmentSchema = object({
38418
40394
  * the locations inside it.
38419
40395
  *
38420
40396
  * The LABEL is carried alongside the key because the key is lossy on purpose —
38421
- * a surface must show "Zona notte", not "zona notte". Locations are carried
40397
+ * a surface must show "Night zone", not "night zone". Locations are carried
38422
40398
  * here, rather than left to a second call, because every consumer wants both
38423
40399
  * at once and a viewer that asked twice could render a zone whose membership
38424
40400
  * it has not fetched yet.
@@ -40531,8 +42507,8 @@ var LoadContributionSchema = object({
40531
42507
  "unattributable"
40532
42508
  ]),
40533
42509
  /**
40534
- * What ONE entry is, in the contributor's own words — `615/high`,
40535
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
42510
+ * What ONE entry is, in the contributor's own words — `101/high`,
42511
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
40536
42512
  * family and inventing a common one would lose the only information that
40537
42513
  * makes two entries for the same camera distinguishable.
40538
42514
  */
@@ -43492,7 +45468,7 @@ var NcConditionsSchema = object({
43492
45468
  * with the list under it is worse than no switch (D62).
43493
45469
  *
43494
45470
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
43495
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
45471
+ * renameable, and a rule authored on "Alice" went silently dark the moment
43496
45472
  * the operator fixed the spelling. The id reaches the record on
43497
45473
  * `LabelAttribution.identityId`; the name is what the editor shows and what
43498
45474
  * `{{label}}` renders.
@@ -44043,7 +46019,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
44043
46019
  * A rule scoped to one camera and one zone silently became a rule that
44044
46020
  * matches EVERY event on EVERY camera, and lost its `media` policy
44045
46021
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
44046
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
46022
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
44047
46023
  * within a minute of a two-field patch.
44048
46024
  *
44049
46025
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -45856,7 +47832,7 @@ var LabelAttributionSchema = object({
45856
47832
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
45857
47833
  *
45858
47834
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
45859
- * notification rule authored on "Gianluca" stopped matching the moment the
47835
+ * notification rule authored on "Alice" stopped matching the moment the
45860
47836
  * operator fixed the spelling in the gallery, and nothing said so. The id is
45861
47837
  * the thing that does not move, so it is what a rule matches on
45862
47838
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -48395,7 +50371,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
48395
50371
  /**
48396
50372
  * Root-supplied detections for the tree's ROOT step (D730). Set by
48397
50373
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
48398
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
50374
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
48399
50375
  * NOT inferred, these boxes are its output, and its children (the plate
48400
50376
  * reader) run on them through their own crop policy. Boxes are in the
48401
50377
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -50028,7 +52004,7 @@ var RunnerCameraConfigSchema = object({
50028
52004
  * detection session that asks for history. What shipped was a last-moment
50029
52005
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
50030
52006
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
50031
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
52007
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
50032
52008
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
50033
52009
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
50034
52010
  * was decoded, and was freed.
@@ -52058,7 +54034,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
52058
54034
  * The signals a device can emit to WAKE its own stream.
52059
54035
  *
52060
54036
  * A camera whose stream is built on demand sleeps until something asks for it,
52061
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
54037
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
52062
54038
  * puller holds a session open for ever, and treating that as demand would keep
52063
54039
  * a battery camera awake for ever, which is the whole thing the battery is for
52064
54040
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -52745,7 +54721,7 @@ var ClipSchema = object({
52745
54721
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
52746
54722
  *
52747
54723
  * Bounded because it is not a payload the surface pages through: one visit on
52748
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
54724
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
52749
54725
  * camera-day. Read {@link eventCount} for the true total.
52750
54726
  */
52751
54727
  eventIds: array(string()).optional(),
@@ -52890,7 +54866,7 @@ var ClipPlaybackSchema = object({
52890
54866
  * camera has no recordings", which is the defect this whole line of work is
52891
54867
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
52892
54868
  * reached at all (`unreachable`, also what a provider that THREW reports), a
52893
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
54869
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
52894
54870
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
52895
54871
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
52896
54872
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -53155,7 +55131,7 @@ DeviceType.Camera, method(object({
53155
55131
  *
53156
55132
  * It was optional, documented as "absent means the device's BOUND
53157
55133
  * provider, which is CamStack on every camera". No code implemented
53158
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
55134
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
53159
55135
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
53160
55136
  * answered SIX rows, three from each source, merged newest-first:
53161
55137
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -54233,7 +56209,10 @@ object({
54233
56209
  DeviceType.Sensor;
54234
56210
  object({
54235
56211
  /** Current illuminance in lux (lx). */
54236
- lux: number().min(0),
56212
+ lux: number().min(0).meta({
56213
+ unit: "lx",
56214
+ label: "Illuminance"
56215
+ }),
54237
56216
  /** Ms epoch when the slice was last updated. */
54238
56217
  lastFetchedAt: number(),
54239
56218
  /** Live display unit from the upstream source (e.g. HA
@@ -54389,7 +56368,10 @@ var BatteryStatusSchema = object({
54389
56368
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
54390
56369
  * declines to band a non-finite reading, which is the correct shape.
54391
56370
  */
54392
- percentage: number().min(0).max(100).nullable(),
56371
+ percentage: number().min(0).max(100).nullable().meta({
56372
+ unit: "%",
56373
+ label: "Charge"
56374
+ }),
54393
56375
  /**
54394
56376
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
54395
56377
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -54408,13 +56390,13 @@ var BatteryStatusSchema = object({
54408
56390
  "solar",
54409
56391
  "none",
54410
56392
  "unknown"
54411
- ]),
56393
+ ]).meta({ label: "Charging source" }),
54412
56394
  /**
54413
56395
  * True when the camera firmware has gone into low-power mode. Battery
54414
56396
  * providers MUST avoid polling during sleep — reading the battery
54415
56397
  * wakes the camera up and drains charge.
54416
56398
  */
54417
- sleeping: boolean(),
56399
+ sleeping: boolean().meta({ label: "Sleeping" }),
54418
56400
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
54419
56401
  lastUpdated: number(),
54420
56402
  /**
@@ -54454,7 +56436,7 @@ var BatteryStatusSchema = object({
54454
56436
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
54455
56437
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
54456
56438
  */
54457
- binary: boolean().optional()
56439
+ binary: boolean().optional().meta({ label: "Binary indicator" })
54458
56440
  });
54459
56441
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat;
54460
56442
  method(object({
@@ -54469,7 +56451,7 @@ method(object({
54469
56451
  status: BatteryStatusSchema
54470
56452
  });
54471
56453
  object({
54472
- on: boolean(),
56454
+ on: boolean().meta({ label: "On" }),
54473
56455
  /** Ms epoch of the last transition. 0 if never observed. */
54474
56456
  lastChangedAt: number()
54475
56457
  });
@@ -54727,7 +56709,7 @@ var GridLayoutCellSchema = object({
54727
56709
  *
54728
56710
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
54729
56711
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
54730
- * the sources, because "this grid has no low" is not a finding — "615 has no
56712
+ * the sources, because "this grid has no low" is not a finding — "101 has no
54731
56713
  * low" is, and it is the one an operator can act on.
54732
56714
  */
54733
56715
  var GridProfileOfferSchema = object({
@@ -56278,7 +58260,10 @@ DeviceType.Humidifier, method(object({
56278
58260
  });
56279
58261
  object({
56280
58262
  /** Current relative humidity, 0..100. */
56281
- percent: number().min(0).max(100),
58263
+ percent: number().min(0).max(100).meta({
58264
+ unit: "%",
58265
+ label: "Humidity"
58266
+ }),
56282
58267
  /** Ms epoch when the slice was last updated. */
56283
58268
  lastFetchedAt: number(),
56284
58269
  /** Live display unit from the upstream source (e.g. HA
@@ -59055,9 +61040,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
59055
61040
  });
59056
61041
  object({
59057
61042
  /** Instantaneous power draw in watts. */
59058
- watts: number().optional(),
61043
+ watts: number().optional().meta({
61044
+ unit: "W",
61045
+ label: "Power"
61046
+ }),
59059
61047
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
59060
- kwhTotal: number().optional(),
61048
+ kwhTotal: number().optional().meta({
61049
+ unit: "kWh",
61050
+ label: "Energy"
61051
+ }),
59061
61052
  /** Voltage in volts. */
59062
61053
  volts: number().optional(),
59063
61054
  /** Current in amperes. */
@@ -59376,9 +61367,9 @@ var PtzOptionsSchema = object({
59376
61367
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
59377
61368
  * not one of the three cameras honours its own:
59378
61369
  *
59379
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
59380
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
59381
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
61370
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
61371
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
61372
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
59382
61373
  *
59383
61374
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
59384
61375
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -59525,7 +61516,7 @@ object({
59525
61516
  running: boolean().nullable(),
59526
61517
  /** Epoch ms the current boolean began; null while `running` is null. */
59527
61518
  since: number().nullable(),
59528
- source: RunningStateSourceSchema,
61519
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
59529
61520
  phase: string().nullable(),
59530
61521
  /** null until a reading has been published (D393). */
59531
61522
  lastFetchedAt: number().nullable()
@@ -59578,7 +61569,7 @@ var RecordingAvailabilitySchema = object({
59578
61569
  * would look identical. But the answer used to say nothing about that, so a
59579
61570
  * caller asking "what can I export?" read the single preferred profile as
59580
61571
  * the only one that exists — on this deployment every camera records `high`
59581
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
61572
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
59582
61573
  * UI could not see it.
59583
61574
  *
59584
61575
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -59677,7 +61668,7 @@ var RecordingSourceOptionsSchema = object({
59677
61668
  * `sparse` = gaps are the absence of one, and must be drawn as such.
59678
61669
  *
59679
61670
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
59680
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
61671
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
59681
61672
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
59682
61673
  coverage: _enum(["continuous", "sparse"]),
59683
61674
  /** Where the playhead may be put.
@@ -59753,7 +61744,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
59753
61744
  * merely discouraged (D554 amended).
59754
61745
  *
59755
61746
  * It was learned the expensive way on `videoclips.listClips`: measured
59756
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
61747
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
59757
61748
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
59758
61749
  * three from each source, merged — `device-collection-dispatch.ts`
59759
61750
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -60354,7 +62345,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
60354
62345
  * on a 10 h window holding 29,393 s of footage every range landed late by the
60355
62346
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
60356
62347
  * the video was a uniform timelapse, and the log line reported the five ranges
60357
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
62348
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
60358
62349
  *
60359
62350
  * Relative and not absolute epoch, because an absolute epoch would make every
60360
62351
  * call site responsible for the same subtraction.
@@ -60988,7 +62979,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusS
60988
62979
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
60989
62980
  * for the thing: a scene is a standing question about the property ("is the bin
60990
62981
  * still out"), and the operator's question is "which of my scenes have tripped",
60991
- * across every camera at once — not "what does camera 617 think". Buried one
62982
+ * across every camera at once — not "what does camera 102 think". Buried one
60992
62983
  * camera deep it also could not be found. The surface is now a top-level admin
60993
62984
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
60994
62985
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -61571,7 +63562,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), StreamParamsOptionsSch
61571
63562
  auth: "admin"
61572
63563
  }), method(object({ deviceId: number() }), unknown().nullable());
61573
63564
  object({
61574
- on: boolean(),
63565
+ on: boolean().meta({ label: "On" }),
61575
63566
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
61576
63567
  lastChangedAt: number()
61577
63568
  });
@@ -62134,7 +64125,10 @@ object({
62134
64125
  DeviceType.Sensor;
62135
64126
  object({
62136
64127
  /** Current temperature in Celsius. */
62137
- celsius: number(),
64128
+ celsius: number().meta({
64129
+ unit: "°C",
64130
+ label: "Temperature"
64131
+ }),
62138
64132
  /** Ms epoch when the slice was last updated (push or poll). */
62139
64133
  lastFetchedAt: number(),
62140
64134
  /** Live display unit from the upstream source (e.g. HA
@@ -63384,6 +65378,10 @@ var trainingCapability = {
63384
65378
  }
63385
65379
  };
63386
65380
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
65381
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
65382
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
65383
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
65384
+ new Set(CAP_NAMES);
63387
65385
  Object.freeze({
63388
65386
  person: .5,
63389
65387
  vehicle: .5,
@@ -76321,7 +78319,7 @@ var SENSOR_CAP_VOCABULARY = {
76321
78319
  state: [{
76322
78320
  kind: "boolean",
76323
78321
  field: "on",
76324
- label: t("Active", "Attivo"),
78322
+ label: t("On", "Acceso"),
76325
78323
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
76326
78324
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
76327
78325
  icon: "toggle-right"
@@ -79745,7 +81743,6 @@ Object.freeze({
79745
81743
  "smtp-provider": "email"
79746
81744
  });
79747
81745
  DeviceType.Camera;
79748
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
79749
81746
  /**
79750
81747
  * A saved Customize assignment (D936). The schema is the type: callers use
79751
81748
  * `z.infer`, they do not restate the shape.
@@ -79834,7 +81831,6 @@ object({
79834
81831
  ]),
79835
81832
  reason: string().nullable()
79836
81833
  });
79837
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
79838
81834
  var G711_SCALE_CORRECTION_DB = {
79839
81835
  PCMU: 20 * Math.log10(4),
79840
81836
  PCMA: 20 * Math.log10(8)
@@ -80207,7 +82203,7 @@ var STATE_SUMMARY_SECTION_VARS = [
80207
82203
  {
80208
82204
  name: "summaryStreams",
80209
82205
  label: "Summary: streams offline",
80210
- example: "Ingresso (high) — since 06:40",
82206
+ example: "Front door (high) — since 06:40",
80211
82207
  kinds: ["stream-offline", "stream-online"]
80212
82208
  },
80213
82209
  {
@@ -80225,13 +82221,13 @@ var STATE_SUMMARY_SECTION_VARS = [
80225
82221
  {
80226
82222
  name: "summaryDetection",
80227
82223
  label: "Summary: cameras detecting nothing",
80228
- example: "Ingresso — since 05:10",
82224
+ example: "Front door — since 05:10",
80229
82225
  kinds: ["detection-blind"]
80230
82226
  },
80231
82227
  {
80232
82228
  name: "summaryNodes",
80233
82229
  label: "Summary: nodes",
80234
- example: "little-unraid — offline since 03:00",
82230
+ example: "agent-a — offline since 03:00",
80235
82231
  kinds: [
80236
82232
  "node-offline",
80237
82233
  "node-online",