@camstack/addon-provider-amcrest 0.2.158 → 0.2.159

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.
package/dist/addon.js CHANGED
@@ -35,7 +35,7 @@ let node_stream_promises = require("node:stream/promises");
35
35
  let node_child_process = require("node:child_process");
36
36
  require("node:zlib");
37
37
  let node_os = require("node:os");
38
- //#region ../types/dist/event-category-Ceif8n-v.mjs
38
+ //#region ../types/dist/event-category-DHXxB8t9.mjs
39
39
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
40
40
  EventCategory["SystemBoot"] = "system.boot";
41
41
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -331,7 +331,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
331
331
  * TRANSITION into that state (never per dispatch), and the node is dropped
332
332
  * from the placement candidate set for as long as it holds.
333
333
  *
334
- * This exists because the state was previously invisible: little-unraid
334
+ * This exists because the state was previously invisible: agent-a
335
335
  * absorbed 283k inference errors in a day while still being handed cameras,
336
336
  * and nothing in the system said so.
337
337
  *
@@ -5470,7 +5470,7 @@ var ZodIssueCode = {
5470
5470
  var ZodFirstPartyTypeKind;
5471
5471
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5472
5472
  //#endregion
5473
- //#region ../types/dist/sleep-CYfIZzGv.mjs
5473
+ //#region ../types/dist/sleep-BErAxhul.mjs
5474
5474
  /**
5475
5475
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5476
5476
  * window to float samples (D455).
@@ -8493,6 +8493,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8493
8493
  kind: "mutation",
8494
8494
  auth: "admin"
8495
8495
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8496
+ Object.freeze({ "doorbell": "lastPressedAt" });
8497
+ /** Every capability name, so addon code can check a name without the schema graph. */
8498
+ var CAP_NAMES = Object.freeze([
8499
+ "accessories",
8500
+ "addon-pages",
8501
+ "addon-pages-source",
8502
+ "addon-routes",
8503
+ "addon-settings",
8504
+ "addon-widgets",
8505
+ "addon-widgets-source",
8506
+ "addons",
8507
+ "admin-ui",
8508
+ "air-quality-sensor",
8509
+ "alarm-panel",
8510
+ "alerts",
8511
+ "ambient-light-sensor",
8512
+ "audio-analysis",
8513
+ "audio-analyzer",
8514
+ "audio-codec",
8515
+ "audio-metrics",
8516
+ "auth-provider",
8517
+ "automation-control",
8518
+ "backup",
8519
+ "battery",
8520
+ "binary",
8521
+ "brightness",
8522
+ "broker",
8523
+ "button",
8524
+ "calendar-source",
8525
+ "calendars",
8526
+ "camera-credentials",
8527
+ "camera-grid-layout",
8528
+ "camera-pipeline-config",
8529
+ "camera-streams",
8530
+ "carbon-monoxide",
8531
+ "climate-control",
8532
+ "color",
8533
+ "composer",
8534
+ "connection-test",
8535
+ "connectivity",
8536
+ "consumables",
8537
+ "contact",
8538
+ "control",
8539
+ "core-blocks",
8540
+ "cover",
8541
+ "custom-model-registry",
8542
+ "data-store-provider",
8543
+ "database-snapshot",
8544
+ "day-night",
8545
+ "decoder",
8546
+ "detection-pipeline",
8547
+ "device-admin-link",
8548
+ "device-adoption",
8549
+ "device-credentials",
8550
+ "device-discovery",
8551
+ "device-export",
8552
+ "device-extension",
8553
+ "device-history",
8554
+ "device-manager",
8555
+ "device-ops",
8556
+ "device-provider",
8557
+ "device-removal-hook",
8558
+ "device-state",
8559
+ "device-status",
8560
+ "dishwasher",
8561
+ "display-palette",
8562
+ "doorbell",
8563
+ "embedding-encoder",
8564
+ "enum-sensor",
8565
+ "event-emitter",
8566
+ "face-gallery",
8567
+ "failure-contribution",
8568
+ "fan-control",
8569
+ "feature-probe",
8570
+ "filesystem-browse",
8571
+ "flood",
8572
+ "gas",
8573
+ "heating-valve",
8574
+ "humidifier",
8575
+ "humidity-sensor",
8576
+ "image",
8577
+ "image-settings",
8578
+ "integrations",
8579
+ "intercom",
8580
+ "keychain",
8581
+ "keychain-admin",
8582
+ "lawn-mower-control",
8583
+ "llm",
8584
+ "llm-runtime",
8585
+ "load-contribution",
8586
+ "local-network",
8587
+ "lock-control",
8588
+ "log-channels",
8589
+ "log-destination",
8590
+ "login-method",
8591
+ "media-player",
8592
+ "mesh-network",
8593
+ "metrics-provider",
8594
+ "model-convert",
8595
+ "model-distributor",
8596
+ "motion",
8597
+ "motion-detection",
8598
+ "motion-trigger",
8599
+ "motion-zones",
8600
+ "mqtt-broker",
8601
+ "native-object-detection",
8602
+ "navigation",
8603
+ "network-access",
8604
+ "network-link",
8605
+ "network-quality",
8606
+ "node-certificates",
8607
+ "nodes",
8608
+ "notification-output",
8609
+ "notification-rules",
8610
+ "notifier",
8611
+ "numeric-sensor",
8612
+ "oauth-integration",
8613
+ "oidc-connections",
8614
+ "osd",
8615
+ "osd-manager",
8616
+ "pet-feeder",
8617
+ "pipeline-analytics",
8618
+ "pipeline-executor",
8619
+ "pipeline-orchestrator",
8620
+ "pipeline-runner",
8621
+ "plate-gallery",
8622
+ "platform-probe",
8623
+ "power-meter",
8624
+ "presence",
8625
+ "pressure-sensor",
8626
+ "privacy-mask",
8627
+ "ptz",
8628
+ "ptz-autotrack",
8629
+ "reboot",
8630
+ "record-entries",
8631
+ "recording",
8632
+ "recording-archive",
8633
+ "recording-export",
8634
+ "recording-onboard",
8635
+ "recording-signal",
8636
+ "records",
8637
+ "running-state",
8638
+ "scene-monitor",
8639
+ "script-runner",
8640
+ "server-management",
8641
+ "settings-store",
8642
+ "smoke",
8643
+ "smtp-provider",
8644
+ "snapshot",
8645
+ "sso-bridge",
8646
+ "storage",
8647
+ "storage-admin",
8648
+ "storage-evictable",
8649
+ "storage-migration",
8650
+ "storage-occupancy",
8651
+ "storage-provider",
8652
+ "stream-broker",
8653
+ "stream-catalog",
8654
+ "stream-params",
8655
+ "stream-signals",
8656
+ "switch",
8657
+ "system",
8658
+ "tamper",
8659
+ "temperature-sensor",
8660
+ "terminal-session",
8661
+ "toast",
8662
+ "training",
8663
+ "training-provider",
8664
+ "turn-provider",
8665
+ "update",
8666
+ "user-management",
8667
+ "user-passkeys",
8668
+ "vacuum-control",
8669
+ "valve",
8670
+ "vector-store",
8671
+ "vibration",
8672
+ "videoclips",
8673
+ "viewer-ui",
8674
+ "water-heater",
8675
+ "weather",
8676
+ "webrtc-session",
8677
+ "zone-analytics",
8678
+ "zone-rules",
8679
+ "zones"
8680
+ ]);
8681
+ Object.freeze({
8682
+ "air-quality-sensor": [
8683
+ {
8684
+ "path": "co2Ppm",
8685
+ "valueType": "number"
8686
+ },
8687
+ {
8688
+ "path": "vocPpb",
8689
+ "valueType": "number"
8690
+ },
8691
+ {
8692
+ "path": "pm25",
8693
+ "valueType": "number"
8694
+ },
8695
+ {
8696
+ "path": "pm10",
8697
+ "valueType": "number"
8698
+ },
8699
+ {
8700
+ "path": "aqi",
8701
+ "valueType": "number"
8702
+ },
8703
+ {
8704
+ "path": "unit",
8705
+ "valueType": "string"
8706
+ },
8707
+ {
8708
+ "path": "precision",
8709
+ "valueType": "number"
8710
+ }
8711
+ ],
8712
+ "alarm-panel": [
8713
+ {
8714
+ "path": "state",
8715
+ "valueType": "enum",
8716
+ "enumValues": [
8717
+ "disarmed",
8718
+ "armed_home",
8719
+ "armed_away",
8720
+ "armed_night",
8721
+ "armed_vacation",
8722
+ "armed_custom_bypass",
8723
+ "arming",
8724
+ "disarming",
8725
+ "pending",
8726
+ "triggered"
8727
+ ]
8728
+ },
8729
+ {
8730
+ "path": "targetMode",
8731
+ "valueType": "enum",
8732
+ "enumValues": [
8733
+ "home",
8734
+ "away",
8735
+ "night",
8736
+ "vacation",
8737
+ "custom_bypass"
8738
+ ]
8739
+ },
8740
+ {
8741
+ "path": "requiresCode",
8742
+ "valueType": "boolean"
8743
+ }
8744
+ ],
8745
+ "ambient-light-sensor": [
8746
+ {
8747
+ "path": "lux",
8748
+ "valueType": "number"
8749
+ },
8750
+ {
8751
+ "path": "unit",
8752
+ "valueType": "string"
8753
+ },
8754
+ {
8755
+ "path": "precision",
8756
+ "valueType": "number"
8757
+ }
8758
+ ],
8759
+ "audio-metrics": [
8760
+ {
8761
+ "path": "ts",
8762
+ "valueType": "number"
8763
+ },
8764
+ {
8765
+ "path": "windowSec",
8766
+ "valueType": "number"
8767
+ },
8768
+ {
8769
+ "path": "level.rms",
8770
+ "valueType": "number"
8771
+ },
8772
+ {
8773
+ "path": "level.dbfs",
8774
+ "valueType": "number"
8775
+ },
8776
+ {
8777
+ "path": "peakDbfs",
8778
+ "valueType": "number"
8779
+ },
8780
+ {
8781
+ "path": "avgDbfs",
8782
+ "valueType": "number"
8783
+ },
8784
+ {
8785
+ "path": "current.className",
8786
+ "valueType": "string"
8787
+ },
8788
+ {
8789
+ "path": "current.score",
8790
+ "valueType": "number"
8791
+ },
8792
+ {
8793
+ "path": "current.timestamp",
8794
+ "valueType": "number"
8795
+ }
8796
+ ],
8797
+ "automation-control": [
8798
+ {
8799
+ "path": "enabled",
8800
+ "valueType": "boolean"
8801
+ },
8802
+ {
8803
+ "path": "isRunning",
8804
+ "valueType": "boolean"
8805
+ },
8806
+ {
8807
+ "path": "lastTriggeredAt",
8808
+ "valueType": "number"
8809
+ },
8810
+ {
8811
+ "path": "lastError",
8812
+ "valueType": "string"
8813
+ }
8814
+ ],
8815
+ "battery": [
8816
+ {
8817
+ "path": "percentage",
8818
+ "valueType": "number"
8819
+ },
8820
+ {
8821
+ "path": "charging",
8822
+ "valueType": "enum",
8823
+ "enumValues": [
8824
+ "dc",
8825
+ "solar",
8826
+ "none",
8827
+ "unknown"
8828
+ ]
8829
+ },
8830
+ {
8831
+ "path": "sleeping",
8832
+ "valueType": "boolean"
8833
+ },
8834
+ {
8835
+ "path": "lastUpdated",
8836
+ "valueType": "number"
8837
+ },
8838
+ {
8839
+ "path": "lastContactAt",
8840
+ "valueType": "number"
8841
+ },
8842
+ {
8843
+ "path": "lastFullRefreshAt",
8844
+ "valueType": "number"
8845
+ },
8846
+ {
8847
+ "path": "binary",
8848
+ "valueType": "boolean"
8849
+ }
8850
+ ],
8851
+ "binary": [{
8852
+ "path": "on",
8853
+ "valueType": "boolean"
8854
+ }],
8855
+ "brightness": [{
8856
+ "path": "percentage",
8857
+ "valueType": "number"
8858
+ }],
8859
+ "broker": [{
8860
+ "path": "brokerCount",
8861
+ "valueType": "number"
8862
+ }, {
8863
+ "path": "connectedCount",
8864
+ "valueType": "number"
8865
+ }],
8866
+ "camera-credentials": [
8867
+ {
8868
+ "path": "host",
8869
+ "valueType": "string"
8870
+ },
8871
+ {
8872
+ "path": "port",
8873
+ "valueType": "number"
8874
+ },
8875
+ {
8876
+ "path": "onvifPort",
8877
+ "valueType": "number"
8878
+ },
8879
+ {
8880
+ "path": "rtspPort",
8881
+ "valueType": "number"
8882
+ },
8883
+ {
8884
+ "path": "https",
8885
+ "valueType": "boolean"
8886
+ },
8887
+ {
8888
+ "path": "hasUsername",
8889
+ "valueType": "boolean"
8890
+ },
8891
+ {
8892
+ "path": "hasPassword",
8893
+ "valueType": "boolean"
8894
+ },
8895
+ {
8896
+ "path": "onvifProfile",
8897
+ "valueType": "string"
8898
+ }
8899
+ ],
8900
+ "camera-streams": [
8901
+ {
8902
+ "path": "online",
8903
+ "valueType": "boolean"
8904
+ },
8905
+ {
8906
+ "path": "slotStatuses.high",
8907
+ "valueType": "enum",
8908
+ "enumValues": [
8909
+ "unassigned",
8910
+ "idle",
8911
+ "connecting",
8912
+ "streaming",
8913
+ "error"
8914
+ ]
8915
+ },
8916
+ {
8917
+ "path": "slotStatuses.mid",
8918
+ "valueType": "enum",
8919
+ "enumValues": [
8920
+ "unassigned",
8921
+ "idle",
8922
+ "connecting",
8923
+ "streaming",
8924
+ "error"
8925
+ ]
8926
+ },
8927
+ {
8928
+ "path": "slotStatuses.low",
8929
+ "valueType": "enum",
8930
+ "enumValues": [
8931
+ "unassigned",
8932
+ "idle",
8933
+ "connecting",
8934
+ "streaming",
8935
+ "error"
8936
+ ]
8937
+ },
8938
+ {
8939
+ "path": "slotErrors.high",
8940
+ "valueType": "string"
8941
+ },
8942
+ {
8943
+ "path": "slotErrors.mid",
8944
+ "valueType": "string"
8945
+ },
8946
+ {
8947
+ "path": "slotErrors.low",
8948
+ "valueType": "string"
8949
+ }
8950
+ ],
8951
+ "carbon-monoxide": [{
8952
+ "path": "detected",
8953
+ "valueType": "boolean"
8954
+ }],
8955
+ "climate-control": [
8956
+ {
8957
+ "path": "mode",
8958
+ "valueType": "enum",
8959
+ "enumValues": [
8960
+ "off",
8961
+ "heat",
8962
+ "cool",
8963
+ "auto",
8964
+ "heat_cool",
8965
+ "fan_only",
8966
+ "dry"
8967
+ ]
8968
+ },
8969
+ {
8970
+ "path": "fanMode",
8971
+ "valueType": "string"
8972
+ },
8973
+ {
8974
+ "path": "preset",
8975
+ "valueType": "string"
8976
+ },
8977
+ {
8978
+ "path": "target",
8979
+ "valueType": "number"
8980
+ },
8981
+ {
8982
+ "path": "targetHigh",
8983
+ "valueType": "number"
8984
+ },
8985
+ {
8986
+ "path": "targetLow",
8987
+ "valueType": "number"
8988
+ },
8989
+ {
8990
+ "path": "targetHumidity",
8991
+ "valueType": "number"
8992
+ },
8993
+ {
8994
+ "path": "currentTemp",
8995
+ "valueType": "number"
8996
+ },
8997
+ {
8998
+ "path": "currentHumidity",
8999
+ "valueType": "number"
9000
+ },
9001
+ {
9002
+ "path": "swingVertical",
9003
+ "valueType": "boolean"
9004
+ },
9005
+ {
9006
+ "path": "swingHorizontal",
9007
+ "valueType": "boolean"
9008
+ },
9009
+ {
9010
+ "path": "minTemp",
9011
+ "valueType": "number"
9012
+ },
9013
+ {
9014
+ "path": "maxTemp",
9015
+ "valueType": "number"
9016
+ },
9017
+ {
9018
+ "path": "tempStep",
9019
+ "valueType": "number"
9020
+ }
9021
+ ],
9022
+ "color": [
9023
+ {
9024
+ "path": "mode",
9025
+ "valueType": "enum",
9026
+ "enumValues": [
9027
+ "rgb",
9028
+ "hsv",
9029
+ "mired"
9030
+ ]
9031
+ },
9032
+ {
9033
+ "path": "rgb.r",
9034
+ "valueType": "number"
9035
+ },
9036
+ {
9037
+ "path": "rgb.g",
9038
+ "valueType": "number"
9039
+ },
9040
+ {
9041
+ "path": "rgb.b",
9042
+ "valueType": "number"
9043
+ },
9044
+ {
9045
+ "path": "hsv.h",
9046
+ "valueType": "number"
9047
+ },
9048
+ {
9049
+ "path": "hsv.s",
9050
+ "valueType": "number"
9051
+ },
9052
+ {
9053
+ "path": "hsv.v",
9054
+ "valueType": "number"
9055
+ },
9056
+ {
9057
+ "path": "mireds",
9058
+ "valueType": "number"
9059
+ }
9060
+ ],
9061
+ "connectivity": [{
9062
+ "path": "connected",
9063
+ "valueType": "boolean"
9064
+ }],
9065
+ "contact": [{
9066
+ "path": "entryOpen",
9067
+ "valueType": "boolean"
9068
+ }],
9069
+ "control": [
9070
+ {
9071
+ "path": "kind",
9072
+ "valueType": "enum",
9073
+ "enumValues": [
9074
+ "numeric",
9075
+ "select",
9076
+ "text",
9077
+ "datetime"
9078
+ ]
9079
+ },
9080
+ {
9081
+ "path": "unit",
9082
+ "valueType": "string"
9083
+ },
9084
+ {
9085
+ "path": "min",
9086
+ "valueType": "number"
9087
+ },
9088
+ {
9089
+ "path": "max",
9090
+ "valueType": "number"
9091
+ },
9092
+ {
9093
+ "path": "step",
9094
+ "valueType": "number"
9095
+ },
9096
+ {
9097
+ "path": "precision",
9098
+ "valueType": "number"
9099
+ },
9100
+ {
9101
+ "path": "format",
9102
+ "valueType": "enum",
9103
+ "enumValues": [
9104
+ "date",
9105
+ "time",
9106
+ "datetime"
9107
+ ]
9108
+ }
9109
+ ],
9110
+ "cover": [
9111
+ {
9112
+ "path": "state",
9113
+ "valueType": "enum",
9114
+ "enumValues": [
9115
+ "open",
9116
+ "opening",
9117
+ "closing",
9118
+ "closed",
9119
+ "stopped"
9120
+ ]
9121
+ },
9122
+ {
9123
+ "path": "position",
9124
+ "valueType": "number"
9125
+ },
9126
+ {
9127
+ "path": "tiltPosition",
9128
+ "valueType": "number"
9129
+ }
9130
+ ],
9131
+ "day-night": [
9132
+ {
9133
+ "path": "mode",
9134
+ "valueType": "enum",
9135
+ "enumValues": [
9136
+ "auto",
9137
+ "day",
9138
+ "night",
9139
+ "schedule"
9140
+ ]
9141
+ },
9142
+ {
9143
+ "path": "sensitivity",
9144
+ "valueType": "number"
9145
+ },
9146
+ {
9147
+ "path": "switchDelaySec",
9148
+ "valueType": "number"
9149
+ }
9150
+ ],
9151
+ "device-adoption": [
9152
+ {
9153
+ "path": "lastDiscoveryAt",
9154
+ "valueType": "number"
9155
+ },
9156
+ {
9157
+ "path": "candidateCount",
9158
+ "valueType": "number"
9159
+ },
9160
+ {
9161
+ "path": "adoptedCount",
9162
+ "valueType": "number"
9163
+ },
9164
+ {
9165
+ "path": "lastError",
9166
+ "valueType": "string"
9167
+ }
9168
+ ],
9169
+ "device-discovery": [{
9170
+ "path": "lastDiscoveryAt",
9171
+ "valueType": "number"
9172
+ }, {
9173
+ "path": "lastError",
9174
+ "valueType": "string"
9175
+ }],
9176
+ "device-export": [
9177
+ {
9178
+ "path": "linkState",
9179
+ "valueType": "enum",
9180
+ "enumValues": [
9181
+ "unlinked",
9182
+ "linked",
9183
+ "error"
9184
+ ]
9185
+ },
9186
+ {
9187
+ "path": "exposedDeviceCount",
9188
+ "valueType": "number"
9189
+ },
9190
+ {
9191
+ "path": "error",
9192
+ "valueType": "string"
9193
+ },
9194
+ {
9195
+ "path": "setup.qr",
9196
+ "valueType": "string"
9197
+ },
9198
+ {
9199
+ "path": "setup.note",
9200
+ "valueType": "string"
9201
+ }
9202
+ ],
9203
+ "device-status": [{
9204
+ "path": "online",
9205
+ "valueType": "boolean"
9206
+ }],
9207
+ "dishwasher": [
9208
+ {
9209
+ "path": "availability",
9210
+ "valueType": "enum",
9211
+ "enumValues": [
9212
+ "available",
9213
+ "offline",
9214
+ "description-missing"
9215
+ ]
9216
+ },
9217
+ {
9218
+ "path": "state",
9219
+ "valueType": "enum",
9220
+ "enumValues": [
9221
+ "idle",
9222
+ "running",
9223
+ "paused",
9224
+ "finished",
9225
+ "error",
9226
+ "unavailable"
9227
+ ]
9228
+ },
9229
+ {
9230
+ "path": "operationState",
9231
+ "valueType": "enum",
9232
+ "enumValues": [
9233
+ "Inactive",
9234
+ "Ready",
9235
+ "DelayedStart",
9236
+ "Run",
9237
+ "Pause",
9238
+ "ActionRequired",
9239
+ "Finished",
9240
+ "Error",
9241
+ "Aborting"
9242
+ ]
9243
+ },
9244
+ {
9245
+ "path": "program",
9246
+ "valueType": "string"
9247
+ },
9248
+ {
9249
+ "path": "selectedProgram",
9250
+ "valueType": "string"
9251
+ },
9252
+ {
9253
+ "path": "remainingSeconds",
9254
+ "valueType": "number"
9255
+ },
9256
+ {
9257
+ "path": "delayedStartSeconds",
9258
+ "valueType": "number"
9259
+ },
9260
+ {
9261
+ "path": "progressPercent",
9262
+ "valueType": "number"
9263
+ },
9264
+ {
9265
+ "path": "doorOpen",
9266
+ "valueType": "boolean"
9267
+ },
9268
+ {
9269
+ "path": "doorLocked",
9270
+ "valueType": "boolean"
9271
+ },
9272
+ {
9273
+ "path": "remoteStartAllowed",
9274
+ "valueType": "boolean"
9275
+ },
9276
+ {
9277
+ "path": "remoteControlActive",
9278
+ "valueType": "boolean"
9279
+ },
9280
+ {
9281
+ "path": "localControlActive",
9282
+ "valueType": "boolean"
9283
+ },
9284
+ {
9285
+ "path": "powerOn",
9286
+ "valueType": "boolean"
9287
+ },
9288
+ {
9289
+ "path": "powerState",
9290
+ "valueType": "string"
9291
+ },
9292
+ {
9293
+ "path": "filterCleaningDue",
9294
+ "valueType": "boolean"
9295
+ },
9296
+ {
9297
+ "path": "machineCareDue",
9298
+ "valueType": "boolean"
9299
+ },
9300
+ {
9301
+ "path": "machineCareRemainingRuns",
9302
+ "valueType": "number"
9303
+ },
9304
+ {
9305
+ "path": "halfLoad",
9306
+ "valueType": "boolean"
9307
+ },
9308
+ {
9309
+ "path": "hygienePlus",
9310
+ "valueType": "boolean"
9311
+ },
9312
+ {
9313
+ "path": "extraDry",
9314
+ "valueType": "boolean"
9315
+ },
9316
+ {
9317
+ "path": "intensiveZone",
9318
+ "valueType": "boolean"
9319
+ },
9320
+ {
9321
+ "path": "varioSpeedPlus",
9322
+ "valueType": "boolean"
9323
+ },
9324
+ {
9325
+ "path": "childLock",
9326
+ "valueType": "boolean"
9327
+ },
9328
+ {
9329
+ "path": "errorCode",
9330
+ "valueType": "number"
9331
+ },
9332
+ {
9333
+ "path": "errorLabel",
9334
+ "valueType": "string"
9335
+ }
9336
+ ],
9337
+ "doorbell": [{
9338
+ "path": "lastPressedAt",
9339
+ "valueType": "number"
9340
+ }, {
9341
+ "path": "pressCountSinceStart",
9342
+ "valueType": "number"
9343
+ }],
9344
+ "enum-sensor": [{
9345
+ "path": "value",
9346
+ "valueType": "string"
9347
+ }, {
9348
+ "path": "format",
9349
+ "valueType": "enum",
9350
+ "enumValues": [
9351
+ "date",
9352
+ "time",
9353
+ "datetime"
9354
+ ]
9355
+ }],
9356
+ "event-emitter": [
9357
+ {
9358
+ "path": "lastEvent.deviceId",
9359
+ "valueType": "number"
9360
+ },
9361
+ {
9362
+ "path": "lastEvent.eventType",
9363
+ "valueType": "string"
9364
+ },
9365
+ {
9366
+ "path": "lastEvent.timestamp",
9367
+ "valueType": "number"
9368
+ },
9369
+ {
9370
+ "path": "lastEvent.seq",
9371
+ "valueType": "number"
9372
+ },
9373
+ {
9374
+ "path": "eventCountSinceStart",
9375
+ "valueType": "number"
9376
+ }
9377
+ ],
9378
+ "fan-control": [
9379
+ {
9380
+ "path": "percentage",
9381
+ "valueType": "number"
9382
+ },
9383
+ {
9384
+ "path": "percentageStep",
9385
+ "valueType": "number"
9386
+ },
9387
+ {
9388
+ "path": "preset",
9389
+ "valueType": "string"
9390
+ },
9391
+ {
9392
+ "path": "direction",
9393
+ "valueType": "enum",
9394
+ "enumValues": ["forward", "reverse"]
9395
+ },
9396
+ {
9397
+ "path": "oscillating",
9398
+ "valueType": "boolean"
9399
+ }
9400
+ ],
9401
+ "feature-probe": [
9402
+ {
9403
+ "path": "deviceType",
9404
+ "valueType": "string"
9405
+ },
9406
+ {
9407
+ "path": "model",
9408
+ "valueType": "string"
9409
+ },
9410
+ {
9411
+ "path": "channelCount",
9412
+ "valueType": "number"
9413
+ },
9414
+ {
9415
+ "path": "lastProbedAt",
9416
+ "valueType": "number"
9417
+ }
9418
+ ],
9419
+ "flood": [{
9420
+ "path": "flooded",
9421
+ "valueType": "boolean"
9422
+ }],
9423
+ "gas": [{
9424
+ "path": "detected",
9425
+ "valueType": "boolean"
9426
+ }],
9427
+ "heating-valve": [{
9428
+ "path": "position",
9429
+ "valueType": "number"
9430
+ }],
9431
+ "humidifier": [
9432
+ {
9433
+ "path": "on",
9434
+ "valueType": "boolean"
9435
+ },
9436
+ {
9437
+ "path": "currentHumidity",
9438
+ "valueType": "number"
9439
+ },
9440
+ {
9441
+ "path": "targetHumidity",
9442
+ "valueType": "number"
9443
+ },
9444
+ {
9445
+ "path": "mode",
9446
+ "valueType": "string"
9447
+ },
9448
+ {
9449
+ "path": "action",
9450
+ "valueType": "string"
9451
+ },
9452
+ {
9453
+ "path": "minHumidity",
9454
+ "valueType": "number"
9455
+ },
9456
+ {
9457
+ "path": "maxHumidity",
9458
+ "valueType": "number"
9459
+ }
9460
+ ],
9461
+ "humidity-sensor": [
9462
+ {
9463
+ "path": "percent",
9464
+ "valueType": "number"
9465
+ },
9466
+ {
9467
+ "path": "unit",
9468
+ "valueType": "string"
9469
+ },
9470
+ {
9471
+ "path": "precision",
9472
+ "valueType": "number"
9473
+ }
9474
+ ],
9475
+ "image": [{
9476
+ "path": "url",
9477
+ "valueType": "string"
9478
+ }, {
9479
+ "path": "lastUpdated",
9480
+ "valueType": "number"
9481
+ }],
9482
+ "image-settings": [
9483
+ {
9484
+ "path": "brightness",
9485
+ "valueType": "number"
9486
+ },
9487
+ {
9488
+ "path": "contrast",
9489
+ "valueType": "number"
9490
+ },
9491
+ {
9492
+ "path": "saturation",
9493
+ "valueType": "number"
9494
+ },
9495
+ {
9496
+ "path": "sharpness",
9497
+ "valueType": "number"
9498
+ },
9499
+ {
9500
+ "path": "mirror",
9501
+ "valueType": "boolean"
9502
+ },
9503
+ {
9504
+ "path": "flip",
9505
+ "valueType": "boolean"
9506
+ },
9507
+ {
9508
+ "path": "rotate",
9509
+ "valueType": "enum",
9510
+ "enumValues": [
9511
+ "0",
9512
+ "90",
9513
+ "180",
9514
+ "270"
9515
+ ]
9516
+ },
9517
+ {
9518
+ "path": "whiteBalance",
9519
+ "valueType": "enum",
9520
+ "enumValues": ["auto", "manual"]
9521
+ },
9522
+ {
9523
+ "path": "warmth",
9524
+ "valueType": "number"
9525
+ },
9526
+ {
9527
+ "path": "exposureMode",
9528
+ "valueType": "enum",
9529
+ "enumValues": ["auto", "manual"]
9530
+ },
9531
+ {
9532
+ "path": "backlightMode",
9533
+ "valueType": "enum",
9534
+ "enumValues": [
9535
+ "off",
9536
+ "blc",
9537
+ "wdr",
9538
+ "hlc"
9539
+ ]
9540
+ }
9541
+ ],
9542
+ "intercom": [
9543
+ {
9544
+ "path": "talking",
9545
+ "valueType": "boolean"
9546
+ },
9547
+ {
9548
+ "path": "lastSessionAt",
9549
+ "valueType": "number"
9550
+ },
9551
+ {
9552
+ "path": "ability.sampleRate",
9553
+ "valueType": "number"
9554
+ },
9555
+ {
9556
+ "path": "ability.duplex",
9557
+ "valueType": "enum",
9558
+ "enumValues": ["half", "full"]
9559
+ },
9560
+ {
9561
+ "path": "ability.maxBacklogMs",
9562
+ "valueType": "number"
9563
+ }
9564
+ ],
9565
+ "lawn-mower-control": [
9566
+ {
9567
+ "path": "activity",
9568
+ "valueType": "enum",
9569
+ "enumValues": [
9570
+ "idle",
9571
+ "mowing",
9572
+ "paused",
9573
+ "docked",
9574
+ "error"
9575
+ ]
9576
+ },
9577
+ {
9578
+ "path": "batteryLevel",
9579
+ "valueType": "number"
9580
+ },
9581
+ {
9582
+ "path": "progressPercent",
9583
+ "valueType": "number"
9584
+ },
9585
+ {
9586
+ "path": "currentCode",
9587
+ "valueType": "number"
9588
+ },
9589
+ {
9590
+ "path": "currentCodeLabel",
9591
+ "valueType": "string"
9592
+ },
9593
+ {
9594
+ "path": "severity",
9595
+ "valueType": "enum",
9596
+ "enumValues": [
9597
+ "info",
9598
+ "warning",
9599
+ "error"
9600
+ ]
9601
+ }
9602
+ ],
9603
+ "lock-control": [{
9604
+ "path": "state",
9605
+ "valueType": "enum",
9606
+ "enumValues": [
9607
+ "locked",
9608
+ "unlocked",
9609
+ "locking",
9610
+ "unlocking",
9611
+ "jammed"
9612
+ ]
9613
+ }],
9614
+ "media-player": [
9615
+ {
9616
+ "path": "state",
9617
+ "valueType": "enum",
9618
+ "enumValues": [
9619
+ "off",
9620
+ "on",
9621
+ "idle",
9622
+ "playing",
9623
+ "paused",
9624
+ "buffering",
9625
+ "standby"
9626
+ ]
9627
+ },
9628
+ {
9629
+ "path": "volumeLevel",
9630
+ "valueType": "number"
9631
+ },
9632
+ {
9633
+ "path": "isMuted",
9634
+ "valueType": "boolean"
9635
+ },
9636
+ {
9637
+ "path": "source",
9638
+ "valueType": "string"
9639
+ },
9640
+ {
9641
+ "path": "currentMedia.type",
9642
+ "valueType": "string"
9643
+ },
9644
+ {
9645
+ "path": "currentMedia.title",
9646
+ "valueType": "string"
9647
+ },
9648
+ {
9649
+ "path": "currentMedia.artist",
9650
+ "valueType": "string"
9651
+ },
9652
+ {
9653
+ "path": "currentMedia.album",
9654
+ "valueType": "string"
9655
+ },
9656
+ {
9657
+ "path": "currentMedia.imageUrl",
9658
+ "valueType": "string"
9659
+ },
9660
+ {
9661
+ "path": "positionMs",
9662
+ "valueType": "number"
9663
+ },
9664
+ {
9665
+ "path": "durationMs",
9666
+ "valueType": "number"
9667
+ },
9668
+ {
9669
+ "path": "shuffle",
9670
+ "valueType": "boolean"
9671
+ },
9672
+ {
9673
+ "path": "repeat",
9674
+ "valueType": "enum",
9675
+ "enumValues": [
9676
+ "off",
9677
+ "all",
9678
+ "one"
9679
+ ]
9680
+ }
9681
+ ],
9682
+ "motion": [
9683
+ {
9684
+ "path": "detected",
9685
+ "valueType": "boolean"
9686
+ },
9687
+ {
9688
+ "path": "lastDetectedAt",
9689
+ "valueType": "number"
9690
+ },
9691
+ {
9692
+ "path": "autoClearAfterMs",
9693
+ "valueType": "number"
9694
+ }
9695
+ ],
9696
+ "motion-trigger": [{
9697
+ "path": "enabled",
9698
+ "valueType": "boolean"
9699
+ }],
9700
+ "motion-zones": [{
9701
+ "path": "enabled",
9702
+ "valueType": "boolean"
9703
+ }, {
9704
+ "path": "sensitivity",
9705
+ "valueType": "number"
9706
+ }],
9707
+ "mqtt-broker": [{
9708
+ "path": "brokerCount",
9709
+ "valueType": "number"
9710
+ }, {
9711
+ "path": "embeddedRunning",
9712
+ "valueType": "boolean"
9713
+ }],
9714
+ "native-object-detection": [{
9715
+ "path": "enabled",
9716
+ "valueType": "boolean"
9717
+ }],
9718
+ "navigation": [
9719
+ {
9720
+ "path": "mode",
9721
+ "valueType": "enum",
9722
+ "enumValues": [
9723
+ "idle",
9724
+ "cleaning",
9725
+ "spot",
9726
+ "following",
9727
+ "goto",
9728
+ "returning",
9729
+ "paused",
9730
+ "unknown"
9731
+ ]
9732
+ },
9733
+ {
9734
+ "path": "following",
9735
+ "valueType": "boolean"
9736
+ },
9737
+ {
9738
+ "path": "flash",
9739
+ "valueType": "boolean"
9740
+ },
9741
+ {
9742
+ "path": "lightMode",
9743
+ "valueType": "enum",
9744
+ "enumValues": ["auto", "manual"]
9745
+ },
9746
+ {
9747
+ "path": "lightLevel",
9748
+ "valueType": "number"
9749
+ }
9750
+ ],
9751
+ "network-link": [
9752
+ {
9753
+ "path": "type",
9754
+ "valueType": "enum",
9755
+ "enumValues": [
9756
+ "wifi",
9757
+ "ethernet",
9758
+ "cellular",
9759
+ "unknown"
9760
+ ]
9761
+ },
9762
+ {
9763
+ "path": "signalPercent",
9764
+ "valueType": "number"
9765
+ },
9766
+ {
9767
+ "path": "rssiDbm",
9768
+ "valueType": "number"
9769
+ },
9770
+ {
9771
+ "path": "ssid",
9772
+ "valueType": "string"
9773
+ },
9774
+ {
9775
+ "path": "lastUpdated",
9776
+ "valueType": "number"
9777
+ }
9778
+ ],
9779
+ "notifier": [
9780
+ {
9781
+ "path": "lastSentAt",
9782
+ "valueType": "number"
9783
+ },
9784
+ {
9785
+ "path": "lastError",
9786
+ "valueType": "string"
9787
+ },
9788
+ {
9789
+ "path": "queueDepth",
9790
+ "valueType": "number"
9791
+ },
9792
+ {
9793
+ "path": "supports.image",
9794
+ "valueType": "boolean"
9795
+ },
9796
+ {
9797
+ "path": "supports.priority",
9798
+ "valueType": "boolean"
9799
+ },
9800
+ {
9801
+ "path": "supports.data",
9802
+ "valueType": "boolean"
9803
+ },
9804
+ {
9805
+ "path": "supports.actions",
9806
+ "valueType": "boolean"
9807
+ },
9808
+ {
9809
+ "path": "supports.recipients",
9810
+ "valueType": "boolean"
9811
+ }
9812
+ ],
9813
+ "numeric-sensor": [
9814
+ {
9815
+ "path": "value",
9816
+ "valueType": "number"
9817
+ },
9818
+ {
9819
+ "path": "unit",
9820
+ "valueType": "string"
9821
+ },
9822
+ {
9823
+ "path": "precision",
9824
+ "valueType": "number"
9825
+ }
9826
+ ],
9827
+ "pet-feeder": [
9828
+ {
9829
+ "path": "foodLevel",
9830
+ "valueType": "number"
9831
+ },
9832
+ {
9833
+ "path": "food1",
9834
+ "valueType": "number"
9835
+ },
9836
+ {
9837
+ "path": "food2",
9838
+ "valueType": "number"
9839
+ },
9840
+ {
9841
+ "path": "lowFood",
9842
+ "valueType": "boolean"
9843
+ },
9844
+ {
9845
+ "path": "batteryPower",
9846
+ "valueType": "number"
9847
+ },
9848
+ {
9849
+ "path": "desiccantLeftDays",
9850
+ "valueType": "number"
9851
+ },
9852
+ {
9853
+ "path": "feeding",
9854
+ "valueType": "boolean"
9855
+ },
9856
+ {
9857
+ "path": "status",
9858
+ "valueType": "enum",
9859
+ "enumValues": [
9860
+ "normal",
9861
+ "offline",
9862
+ "on_batteries"
9863
+ ]
9864
+ },
9865
+ {
9866
+ "path": "error",
9867
+ "valueType": "string"
9868
+ },
9869
+ {
9870
+ "path": "errorCode",
9871
+ "valueType": "number"
9872
+ },
9873
+ {
9874
+ "path": "isDualHopper",
9875
+ "valueType": "boolean"
9876
+ },
9877
+ {
9878
+ "path": "childLock",
9879
+ "valueType": "boolean"
9880
+ },
9881
+ {
9882
+ "path": "indicatorLight",
9883
+ "valueType": "boolean"
9884
+ },
9885
+ {
9886
+ "path": "feedSound",
9887
+ "valueType": "boolean"
9888
+ },
9889
+ {
9890
+ "path": "volume",
9891
+ "valueType": "number"
9892
+ }
9893
+ ],
9894
+ "power-meter": [
9895
+ {
9896
+ "path": "watts",
9897
+ "valueType": "number"
9898
+ },
9899
+ {
9900
+ "path": "kwhTotal",
9901
+ "valueType": "number"
9902
+ },
9903
+ {
9904
+ "path": "volts",
9905
+ "valueType": "number"
9906
+ },
9907
+ {
9908
+ "path": "amps",
9909
+ "valueType": "number"
9910
+ },
9911
+ {
9912
+ "path": "va",
9913
+ "valueType": "number"
9914
+ },
9915
+ {
9916
+ "path": "powerFactor",
9917
+ "valueType": "number"
9918
+ },
9919
+ {
9920
+ "path": "unit",
9921
+ "valueType": "string"
9922
+ },
9923
+ {
9924
+ "path": "precision",
9925
+ "valueType": "number"
9926
+ }
9927
+ ],
9928
+ "presence": [
9929
+ {
9930
+ "path": "state",
9931
+ "valueType": "string"
9932
+ },
9933
+ {
9934
+ "path": "location",
9935
+ "valueType": "string"
9936
+ },
9937
+ {
9938
+ "path": "gps.latitude",
9939
+ "valueType": "number"
9940
+ },
9941
+ {
9942
+ "path": "gps.longitude",
9943
+ "valueType": "number"
9944
+ },
9945
+ {
9946
+ "path": "gps.accuracyMeters",
9947
+ "valueType": "number"
9948
+ },
9949
+ {
9950
+ "path": "batteryPercent",
9951
+ "valueType": "number"
9952
+ }
9953
+ ],
9954
+ "pressure-sensor": [
9955
+ {
9956
+ "path": "hpa",
9957
+ "valueType": "number"
9958
+ },
9959
+ {
9960
+ "path": "unit",
9961
+ "valueType": "string"
9962
+ },
9963
+ {
9964
+ "path": "precision",
9965
+ "valueType": "number"
9966
+ }
9967
+ ],
9968
+ "privacy-mask": [{
9969
+ "path": "enabled",
9970
+ "valueType": "boolean"
9971
+ }, {
9972
+ "path": "audioEnabled",
9973
+ "valueType": "boolean"
9974
+ }],
9975
+ "ptz": [
9976
+ {
9977
+ "path": "pan",
9978
+ "valueType": "number"
9979
+ },
9980
+ {
9981
+ "path": "tilt",
9982
+ "valueType": "number"
9983
+ },
9984
+ {
9985
+ "path": "zoom",
9986
+ "valueType": "number"
9987
+ },
9988
+ {
9989
+ "path": "autofocus",
9990
+ "valueType": "boolean"
9991
+ }
9992
+ ],
9993
+ "ptz-autotrack": [
9994
+ {
9995
+ "path": "enabled",
9996
+ "valueType": "boolean"
9997
+ },
9998
+ {
9999
+ "path": "currentSettings.targetType",
10000
+ "valueType": "string"
10001
+ },
10002
+ {
10003
+ "path": "currentSettings.stopDelaySeconds",
10004
+ "valueType": "number"
10005
+ },
10006
+ {
10007
+ "path": "currentSettings.disappearDelaySeconds",
10008
+ "valueType": "number"
10009
+ }
10010
+ ],
10011
+ "recording-archive": [
10012
+ {
10013
+ "path": "deviceId",
10014
+ "valueType": "number"
10015
+ },
10016
+ {
10017
+ "path": "enabled",
10018
+ "valueType": "boolean"
10019
+ },
10020
+ {
10021
+ "path": "activeMode",
10022
+ "valueType": "enum",
10023
+ "enumValues": [
10024
+ "off",
10025
+ "events",
10026
+ "continuous",
10027
+ "on-device-decision"
10028
+ ]
10029
+ },
10030
+ {
10031
+ "path": "nodeId",
10032
+ "valueType": "string"
10033
+ },
10034
+ {
10035
+ "path": "storageBytes",
10036
+ "valueType": "number"
10037
+ }
10038
+ ],
10039
+ "recording-onboard": [
10040
+ {
10041
+ "path": "primaryTrackId",
10042
+ "valueType": "string"
10043
+ },
10044
+ {
10045
+ "path": "enabled",
10046
+ "valueType": "boolean"
10047
+ },
10048
+ {
10049
+ "path": "overwriteWhenFull",
10050
+ "valueType": "boolean"
10051
+ },
10052
+ {
10053
+ "path": "preRecordSec",
10054
+ "valueType": "number"
10055
+ },
10056
+ {
10057
+ "path": "postRecordSec",
10058
+ "valueType": "number"
10059
+ },
10060
+ {
10061
+ "path": "segmentMinutes",
10062
+ "valueType": "number"
10063
+ },
10064
+ {
10065
+ "path": "unreadableWindows",
10066
+ "valueType": "number"
10067
+ },
10068
+ {
10069
+ "path": "recordingToNowhere",
10070
+ "valueType": "boolean"
10071
+ }
10072
+ ],
10073
+ "recording-signal": [{
10074
+ "path": "active",
10075
+ "valueType": "boolean"
10076
+ }, {
10077
+ "path": "reason",
10078
+ "valueType": "string"
10079
+ }],
10080
+ "running-state": [
10081
+ {
10082
+ "path": "running",
10083
+ "valueType": "boolean"
10084
+ },
10085
+ {
10086
+ "path": "since",
10087
+ "valueType": "number"
10088
+ },
10089
+ {
10090
+ "path": "source",
10091
+ "valueType": "enum",
10092
+ "enumValues": ["native", "assigned"]
10093
+ },
10094
+ {
10095
+ "path": "phase",
10096
+ "valueType": "string"
10097
+ }
10098
+ ],
10099
+ "script-runner": [
10100
+ {
10101
+ "path": "isRunning",
10102
+ "valueType": "boolean"
10103
+ },
10104
+ {
10105
+ "path": "lastRunAt",
10106
+ "valueType": "number"
10107
+ },
10108
+ {
10109
+ "path": "lastRunSuccess",
10110
+ "valueType": "boolean"
10111
+ },
10112
+ {
10113
+ "path": "lastError",
10114
+ "valueType": "string"
10115
+ }
10116
+ ],
10117
+ "smoke": [{
10118
+ "path": "detected",
10119
+ "valueType": "boolean"
10120
+ }],
10121
+ "snapshot": [
10122
+ {
10123
+ "path": "lastCapturedAt",
10124
+ "valueType": "number"
10125
+ },
10126
+ {
10127
+ "path": "cacheAgeMs",
10128
+ "valueType": "number"
10129
+ },
10130
+ {
10131
+ "path": "lastBytes",
10132
+ "valueType": "number"
10133
+ },
10134
+ {
10135
+ "path": "lastStreamId",
10136
+ "valueType": "string"
10137
+ }
10138
+ ],
10139
+ "stream-params": [
10140
+ {
10141
+ "path": "main.width",
10142
+ "valueType": "number"
10143
+ },
10144
+ {
10145
+ "path": "main.height",
10146
+ "valueType": "number"
10147
+ },
10148
+ {
10149
+ "path": "main.codec",
10150
+ "valueType": "enum",
10151
+ "enumValues": ["h264", "h265"]
10152
+ },
10153
+ {
10154
+ "path": "main.framerate",
10155
+ "valueType": "number"
10156
+ },
10157
+ {
10158
+ "path": "main.bitrate",
10159
+ "valueType": "number"
10160
+ },
10161
+ {
10162
+ "path": "main.bitrateMode",
10163
+ "valueType": "enum",
10164
+ "enumValues": ["vbr", "cbr"]
10165
+ },
10166
+ {
10167
+ "path": "main.encoderProfile",
10168
+ "valueType": "enum",
10169
+ "enumValues": [
10170
+ "high",
10171
+ "main",
10172
+ "baseline"
10173
+ ]
10174
+ },
10175
+ {
10176
+ "path": "main.gop",
10177
+ "valueType": "number"
10178
+ },
10179
+ {
10180
+ "path": "main.audio",
10181
+ "valueType": "boolean"
10182
+ },
10183
+ {
10184
+ "path": "sub.width",
10185
+ "valueType": "number"
10186
+ },
10187
+ {
10188
+ "path": "sub.height",
10189
+ "valueType": "number"
10190
+ },
10191
+ {
10192
+ "path": "sub.codec",
10193
+ "valueType": "enum",
10194
+ "enumValues": ["h264", "h265"]
10195
+ },
10196
+ {
10197
+ "path": "sub.framerate",
10198
+ "valueType": "number"
10199
+ },
10200
+ {
10201
+ "path": "sub.bitrate",
10202
+ "valueType": "number"
10203
+ },
10204
+ {
10205
+ "path": "sub.bitrateMode",
10206
+ "valueType": "enum",
10207
+ "enumValues": ["vbr", "cbr"]
10208
+ },
10209
+ {
10210
+ "path": "sub.encoderProfile",
10211
+ "valueType": "enum",
10212
+ "enumValues": [
10213
+ "high",
10214
+ "main",
10215
+ "baseline"
10216
+ ]
10217
+ },
10218
+ {
10219
+ "path": "sub.gop",
10220
+ "valueType": "number"
10221
+ },
10222
+ {
10223
+ "path": "sub.audio",
10224
+ "valueType": "boolean"
10225
+ },
10226
+ {
10227
+ "path": "ext.width",
10228
+ "valueType": "number"
10229
+ },
10230
+ {
10231
+ "path": "ext.height",
10232
+ "valueType": "number"
10233
+ },
10234
+ {
10235
+ "path": "ext.codec",
10236
+ "valueType": "enum",
10237
+ "enumValues": ["h264", "h265"]
10238
+ },
10239
+ {
10240
+ "path": "ext.framerate",
10241
+ "valueType": "number"
10242
+ },
10243
+ {
10244
+ "path": "ext.bitrate",
10245
+ "valueType": "number"
10246
+ },
10247
+ {
10248
+ "path": "ext.bitrateMode",
10249
+ "valueType": "enum",
10250
+ "enumValues": ["vbr", "cbr"]
10251
+ },
10252
+ {
10253
+ "path": "ext.encoderProfile",
10254
+ "valueType": "enum",
10255
+ "enumValues": [
10256
+ "high",
10257
+ "main",
10258
+ "baseline"
10259
+ ]
10260
+ },
10261
+ {
10262
+ "path": "ext.gop",
10263
+ "valueType": "number"
10264
+ },
10265
+ {
10266
+ "path": "ext.audio",
10267
+ "valueType": "boolean"
10268
+ }
10269
+ ],
10270
+ "switch": [{
10271
+ "path": "on",
10272
+ "valueType": "boolean"
10273
+ }],
10274
+ "tamper": [{
10275
+ "path": "tampered",
10276
+ "valueType": "boolean"
10277
+ }],
10278
+ "temperature-sensor": [
10279
+ {
10280
+ "path": "celsius",
10281
+ "valueType": "number"
10282
+ },
10283
+ {
10284
+ "path": "unit",
10285
+ "valueType": "string"
10286
+ },
10287
+ {
10288
+ "path": "precision",
10289
+ "valueType": "number"
10290
+ }
10291
+ ],
10292
+ "update": [
10293
+ {
10294
+ "path": "currentVersion",
10295
+ "valueType": "string"
10296
+ },
10297
+ {
10298
+ "path": "availableVersion",
10299
+ "valueType": "string"
10300
+ },
10301
+ {
10302
+ "path": "updatable",
10303
+ "valueType": "boolean"
10304
+ },
10305
+ {
10306
+ "path": "state",
10307
+ "valueType": "string"
10308
+ },
10309
+ {
10310
+ "path": "inProgress",
10311
+ "valueType": "boolean"
10312
+ }
10313
+ ],
10314
+ "vacuum-control": [
10315
+ {
10316
+ "path": "state",
10317
+ "valueType": "enum",
10318
+ "enumValues": [
10319
+ "idle",
10320
+ "cleaning",
10321
+ "paused",
10322
+ "returning",
10323
+ "docked",
10324
+ "drying",
10325
+ "error"
10326
+ ]
10327
+ },
10328
+ {
10329
+ "path": "batteryLevel",
10330
+ "valueType": "number"
10331
+ },
10332
+ {
10333
+ "path": "fanSpeed",
10334
+ "valueType": "string"
10335
+ },
10336
+ {
10337
+ "path": "progressPercent",
10338
+ "valueType": "number"
10339
+ },
10340
+ {
10341
+ "path": "errorCode",
10342
+ "valueType": "number"
10343
+ },
10344
+ {
10345
+ "path": "errorLabel",
10346
+ "valueType": "string"
10347
+ }
10348
+ ],
10349
+ "valve": [{
10350
+ "path": "state",
10351
+ "valueType": "enum",
10352
+ "enumValues": [
10353
+ "open",
10354
+ "opening",
10355
+ "closing",
10356
+ "closed",
10357
+ "stopped"
10358
+ ]
10359
+ }, {
10360
+ "path": "position",
10361
+ "valueType": "number"
10362
+ }],
10363
+ "vibration": [{
10364
+ "path": "detected",
10365
+ "valueType": "boolean"
10366
+ }],
10367
+ "water-heater": [
10368
+ {
10369
+ "path": "currentTemp",
10370
+ "valueType": "number"
10371
+ },
10372
+ {
10373
+ "path": "targetTemp",
10374
+ "valueType": "number"
10375
+ },
10376
+ {
10377
+ "path": "operationMode",
10378
+ "valueType": "string"
10379
+ },
10380
+ {
10381
+ "path": "away",
10382
+ "valueType": "boolean"
10383
+ },
10384
+ {
10385
+ "path": "minTemp",
10386
+ "valueType": "number"
10387
+ },
10388
+ {
10389
+ "path": "maxTemp",
10390
+ "valueType": "number"
10391
+ }
10392
+ ],
10393
+ "weather": [
10394
+ {
10395
+ "path": "condition",
10396
+ "valueType": "string"
10397
+ },
10398
+ {
10399
+ "path": "temperature",
10400
+ "valueType": "number"
10401
+ },
10402
+ {
10403
+ "path": "temperatureUnit",
10404
+ "valueType": "string"
10405
+ },
10406
+ {
10407
+ "path": "humidity",
10408
+ "valueType": "number"
10409
+ },
10410
+ {
10411
+ "path": "pressure",
10412
+ "valueType": "number"
10413
+ },
10414
+ {
10415
+ "path": "pressureUnit",
10416
+ "valueType": "string"
10417
+ },
10418
+ {
10419
+ "path": "windSpeed",
10420
+ "valueType": "number"
10421
+ },
10422
+ {
10423
+ "path": "windSpeedUnit",
10424
+ "valueType": "string"
10425
+ },
10426
+ {
10427
+ "path": "windBearing",
10428
+ "valueType": "number"
10429
+ }
10430
+ ],
10431
+ "zone-analytics": [
10432
+ {
10433
+ "path": "ts",
10434
+ "valueType": "number"
10435
+ },
10436
+ {
10437
+ "path": "frameWidth",
10438
+ "valueType": "number"
10439
+ },
10440
+ {
10441
+ "path": "frameHeight",
10442
+ "valueType": "number"
10443
+ },
10444
+ {
10445
+ "path": "frame.totalObjects",
10446
+ "valueType": "number"
10447
+ },
10448
+ {
10449
+ "path": "frame.standingObjects",
10450
+ "valueType": "number"
10451
+ },
10452
+ {
10453
+ "path": "frame.transientObjects",
10454
+ "valueType": "number"
10455
+ },
10456
+ {
10457
+ "path": "unzoned.totalObjects",
10458
+ "valueType": "number"
10459
+ },
10460
+ {
10461
+ "path": "unzoned.standingObjects",
10462
+ "valueType": "number"
10463
+ },
10464
+ {
10465
+ "path": "unzoned.transientObjects",
10466
+ "valueType": "number"
10467
+ }
10468
+ ]
10469
+ });
8496
10470
  object({
8497
10471
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8498
10472
  params: record(string(), union([string(), number()])).optional()
@@ -8855,7 +10829,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8855
10829
  return DeviceRole;
8856
10830
  }({});
8857
10831
  //#endregion
8858
- //#region ../types/dist/composition-BJ8iAZb3.mjs
10832
+ //#region ../types/dist/composition-kEl9mevu.mjs
8859
10833
  /**
8860
10834
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8861
10835
  *
@@ -12108,7 +14082,7 @@ var LogChannelDescriptorSchema = object({
12108
14082
  * `true` is a PROMISE with two halves, and both must hold: the gate is
12109
14083
  * consulted with the numeric device id, AND every line the channel admits
12110
14084
  * carries `tags: { deviceId }` with that same numeric id. The second half is
12111
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
14085
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
12112
14086
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
12113
14087
  * the body is the only way to filter.
12114
14088
  *
@@ -12296,7 +14270,7 @@ var ModelVariantGroupSchema = object({
12296
14270
  precision: _enum(["fp32", "int8"]).optional(),
12297
14271
  /**
12298
14272
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12299
- * an alternate training of the same family (Scrypted `relu_test`); chip
14273
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
12300
14274
  * label is "Test".
12301
14275
  */
12302
14276
  optimization: _enum(["standard", "test"]).optional(),
@@ -12548,8 +14522,8 @@ var ModelCatalogEntrySchema = object({
12548
14522
  provider: ModelProviderIdSchema.optional(),
12549
14523
  /**
12550
14524
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
12551
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
12552
- * labels already ARE the CamStack macros (Scrypted identity map).
14525
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
14526
+ * labels already ARE the CamStack macros (plugin catalog identity map).
12553
14527
  */
12554
14528
  classMap: DetectionCatalogClassMapSchema.optional(),
12555
14529
  /**
@@ -15518,7 +17492,7 @@ method(object({
15518
17492
  * `1` is real time and is the ONLY value that allows the copy branch —
15519
17493
  * anything else forces `libx264` over the window. That was priced
15520
17494
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
15521
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
17495
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
15522
17496
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
15523
17497
  * once the decode is forced the width stops being free.
15524
17498
  */
@@ -16044,6 +18018,7 @@ var CompositionRunStatusSchema = _enum([
16044
18018
  "starting",
16045
18019
  "running",
16046
18020
  "degraded",
18021
+ "incomplete",
16047
18022
  "failed"
16048
18023
  ]);
16049
18024
  var CompositionFieldStateKindSchema = _enum([
@@ -16257,6 +18232,7 @@ var CoreBlockStatusSchema = _enum([
16257
18232
  "starting",
16258
18233
  "running",
16259
18234
  "degraded",
18235
+ "incomplete",
16260
18236
  "failed"
16261
18237
  ]);
16262
18238
  /** path → TypeScript source for a multi-file block. */
@@ -38404,7 +40380,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
38404
40380
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
38405
40381
  * operator's casing. The registry matches labels trimmed + case-insensitively
38406
40382
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
38407
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
40383
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
38408
40384
  * map keyed on the displayed casing would orphan its entry on exactly that
38409
40385
  * edit. Consumers join by keying their own label through `locationIconKey`.
38410
40386
  */
@@ -38429,7 +40405,7 @@ var LocationDescriptionAssignmentSchema = object({
38429
40405
  /**
38430
40406
  * A SITE ZONE — a named part of the property that several locations belong to.
38431
40407
  *
38432
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
40408
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
38433
40409
  * kitchen. A camera belongs to exactly one location, and a location to at most
38434
40410
  * one zone, so a camera's zone is derived and never stored on the device: the
38435
40411
  * whole point of this entity is that grouping rooms touches no device row.
@@ -38458,7 +40434,7 @@ var LocationDescriptionAssignmentSchema = object({
38458
40434
  * the locations inside it.
38459
40435
  *
38460
40436
  * The LABEL is carried alongside the key because the key is lossy on purpose —
38461
- * a surface must show "Zona notte", not "zona notte". Locations are carried
40437
+ * a surface must show "Night zone", not "night zone". Locations are carried
38462
40438
  * here, rather than left to a second call, because every consumer wants both
38463
40439
  * at once and a viewer that asked twice could render a zone whose membership
38464
40440
  * it has not fetched yet.
@@ -40652,8 +42628,8 @@ var LoadContributionSchema = object({
40652
42628
  "unattributable"
40653
42629
  ]),
40654
42630
  /**
40655
- * What ONE entry is, in the contributor's own words — `615/high`,
40656
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
42631
+ * What ONE entry is, in the contributor's own words — `101/high`,
42632
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
40657
42633
  * family and inventing a common one would lose the only information that
40658
42634
  * makes two entries for the same camera distinguishable.
40659
42635
  */
@@ -43657,7 +45633,7 @@ var NcConditionsSchema = object({
43657
45633
  * with the list under it is worse than no switch (D62).
43658
45634
  *
43659
45635
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
43660
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
45636
+ * renameable, and a rule authored on "Alice" went silently dark the moment
43661
45637
  * the operator fixed the spelling. The id reaches the record on
43662
45638
  * `LabelAttribution.identityId`; the name is what the editor shows and what
43663
45639
  * `{{label}}` renders.
@@ -44208,7 +46184,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
44208
46184
  * A rule scoped to one camera and one zone silently became a rule that
44209
46185
  * matches EVERY event on EVERY camera, and lost its `media` policy
44210
46186
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
44211
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
46187
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
44212
46188
  * within a minute of a two-field patch.
44213
46189
  *
44214
46190
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -46021,7 +47997,7 @@ var LabelAttributionSchema = object({
46021
47997
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
46022
47998
  *
46023
47999
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
46024
- * notification rule authored on "Gianluca" stopped matching the moment the
48000
+ * notification rule authored on "Alice" stopped matching the moment the
46025
48001
  * operator fixed the spelling in the gallery, and nothing said so. The id is
46026
48002
  * the thing that does not move, so it is what a rule matches on
46027
48003
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -48560,7 +50536,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
48560
50536
  /**
48561
50537
  * Root-supplied detections for the tree's ROOT step (D730). Set by
48562
50538
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
48563
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
50539
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
48564
50540
  * NOT inferred, these boxes are its output, and its children (the plate
48565
50541
  * reader) run on them through their own crop policy. Boxes are in the
48566
50542
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -50237,7 +52213,7 @@ var RunnerCameraConfigSchema = object({
50237
52213
  * detection session that asks for history. What shipped was a last-moment
50238
52214
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
50239
52215
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
50240
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
52216
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
50241
52217
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
50242
52218
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
50243
52219
  * was decoded, and was freed.
@@ -52371,7 +54347,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
52371
54347
  * The signals a device can emit to WAKE its own stream.
52372
54348
  *
52373
54349
  * A camera whose stream is built on demand sleeps until something asks for it,
52374
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
54350
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
52375
54351
  * puller holds a session open for ever, and treating that as demand would keep
52376
54352
  * a battery camera awake for ever, which is the whole thing the battery is for
52377
54353
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -53130,7 +55106,7 @@ var ClipSchema = object({
53130
55106
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
53131
55107
  *
53132
55108
  * Bounded because it is not a payload the surface pages through: one visit on
53133
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
55109
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
53134
55110
  * camera-day. Read {@link eventCount} for the true total.
53135
55111
  */
53136
55112
  eventIds: array(string()).optional(),
@@ -53275,7 +55251,7 @@ var ClipPlaybackSchema = object({
53275
55251
  * camera has no recordings", which is the defect this whole line of work is
53276
55252
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
53277
55253
  * reached at all (`unreachable`, also what a provider that THREW reports), a
53278
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
55254
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
53279
55255
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
53280
55256
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
53281
55257
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -53736,7 +55712,7 @@ var videoclipsCapability = {
53736
55712
  *
53737
55713
  * It was optional, documented as "absent means the device's BOUND
53738
55714
  * provider, which is CamStack on every camera". No code implemented
53739
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
55715
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
53740
55716
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
53741
55717
  * answered SIX rows, three from each source, merged newest-first:
53742
55718
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -55053,7 +57029,10 @@ var airQualitySensorCapability = {
55053
57029
  */
55054
57030
  var AmbientLightSensorStatusSchema = object({
55055
57031
  /** Current illuminance in lux (lx). */
55056
- lux: number().min(0),
57032
+ lux: number().min(0).meta({
57033
+ unit: "lx",
57034
+ label: "Illuminance"
57035
+ }),
55057
57036
  /** Ms epoch when the slice was last updated. */
55058
57037
  lastFetchedAt: number(),
55059
57038
  /** Live display unit from the upstream source (e.g. HA
@@ -55096,7 +57075,12 @@ var ambientLightSensorCapability = {
55096
57075
  } } },
55097
57076
  /** Clock fields: written, but excluded from the compare that decides
55098
57077
  * whether persisting is worth a SQLite commit. */
55099
- volatileStateFields: ["lastFetchedAt"]
57078
+ volatileStateFields: ["lastFetchedAt"],
57079
+ customize: {
57080
+ version: 1,
57081
+ advanced: "derive",
57082
+ targets: []
57083
+ }
55100
57084
  };
55101
57085
  /**
55102
57086
  * Per-class audio metrics aggregated over a sliding window.
@@ -55323,7 +57307,10 @@ var BatteryStatusSchema = object({
55323
57307
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
55324
57308
  * declines to band a non-finite reading, which is the correct shape.
55325
57309
  */
55326
- percentage: number().min(0).max(100).nullable(),
57310
+ percentage: number().min(0).max(100).nullable().meta({
57311
+ unit: "%",
57312
+ label: "Charge"
57313
+ }),
55327
57314
  /**
55328
57315
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
55329
57316
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -55342,13 +57329,13 @@ var BatteryStatusSchema = object({
55342
57329
  "solar",
55343
57330
  "none",
55344
57331
  "unknown"
55345
- ]),
57332
+ ]).meta({ label: "Charging source" }),
55346
57333
  /**
55347
57334
  * True when the camera firmware has gone into low-power mode. Battery
55348
57335
  * providers MUST avoid polling during sleep — reading the battery
55349
57336
  * wakes the camera up and drains charge.
55350
57337
  */
55351
- sleeping: boolean(),
57338
+ sleeping: boolean().meta({ label: "Sleeping" }),
55352
57339
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
55353
57340
  lastUpdated: number(),
55354
57341
  /**
@@ -55388,7 +57375,7 @@ var BatteryStatusSchema = object({
55388
57375
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
55389
57376
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
55390
57377
  */
55391
- binary: boolean().optional()
57378
+ binary: boolean().optional().meta({ label: "Binary indicator" })
55392
57379
  });
55393
57380
  var BATTERY_DEVICE_TYPES = [
55394
57381
  DeviceType.Camera,
@@ -55402,6 +57389,7 @@ var BATTERY_DEVICE_TYPES = [
55402
57389
  /** Generic Customize target for the percentage reading (D936). */
55403
57390
  var batteryCustomize = {
55404
57391
  version: 1,
57392
+ advanced: "derive",
55405
57393
  targets: [{
55406
57394
  id: "percentage",
55407
57395
  cardinality: "scalar",
@@ -55552,7 +57540,7 @@ onStatusChanged: { data: object({
55552
57540
  * with the right HomeKit / Alexa display category.
55553
57541
  */
55554
57542
  var BinaryStatusSchema = object({
55555
- on: boolean(),
57543
+ on: boolean().meta({ label: "On" }),
55556
57544
  /** Ms epoch of the last transition. 0 if never observed. */
55557
57545
  lastChangedAt: number()
55558
57546
  });
@@ -55581,7 +57569,12 @@ var binaryCapability = {
55581
57569
  history: { fields: { on: { kind: "boolean" } } },
55582
57570
  /** Clock fields: written, but excluded from the compare that decides
55583
57571
  * whether persisting is worth a SQLite commit. */
55584
- volatileStateFields: ["lastChangedAt"]
57572
+ volatileStateFields: ["lastChangedAt"],
57573
+ customize: {
57574
+ version: 1,
57575
+ advanced: "derive",
57576
+ targets: []
57577
+ }
55585
57578
  };
55586
57579
  /**
55587
57580
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -55887,7 +57880,7 @@ var GridLayoutCellSchema = object({
55887
57880
  *
55888
57881
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
55889
57882
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
55890
- * the sources, because "this grid has no low" is not a finding — "615 has no
57883
+ * the sources, because "this grid has no low" is not a finding — "101 has no
55891
57884
  * low" is, and it is the one an operator can act on.
55892
57885
  */
55893
57886
  var GridProfileOfferSchema = object({
@@ -58405,7 +60398,10 @@ var humidifierCapability = {
58405
60398
  */
58406
60399
  var HumiditySensorStatusSchema = object({
58407
60400
  /** Current relative humidity, 0..100. */
58408
- percent: number().min(0).max(100),
60401
+ percent: number().min(0).max(100).meta({
60402
+ unit: "%",
60403
+ label: "Humidity"
60404
+ }),
58409
60405
  /** Ms epoch when the slice was last updated. */
58410
60406
  lastFetchedAt: number(),
58411
60407
  /** Live display unit from the upstream source (e.g. HA
@@ -58447,7 +60443,12 @@ var humiditySensorCapability = {
58447
60443
  } } },
58448
60444
  /** Clock fields: written, but excluded from the compare that decides
58449
60445
  * whether persisting is worth a SQLite commit. */
58450
- volatileStateFields: ["lastFetchedAt"]
60446
+ volatileStateFields: ["lastFetchedAt"],
60447
+ customize: {
60448
+ version: 1,
60449
+ advanced: "derive",
60450
+ targets: []
60451
+ }
58451
60452
  };
58452
60453
  /**
58453
60454
  * Image display cap. Models a single still image exposed by an integration —
@@ -62126,9 +64127,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
62126
64127
  */
62127
64128
  var PowerMeterStatusSchema = object({
62128
64129
  /** Instantaneous power draw in watts. */
62129
- watts: number().optional(),
64130
+ watts: number().optional().meta({
64131
+ unit: "W",
64132
+ label: "Power"
64133
+ }),
62130
64134
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
62131
- kwhTotal: number().optional(),
64135
+ kwhTotal: number().optional().meta({
64136
+ unit: "kWh",
64137
+ label: "Energy"
64138
+ }),
62132
64139
  /** Voltage in volts. */
62133
64140
  volts: number().optional(),
62134
64141
  /** Current in amperes. */
@@ -62213,7 +64220,12 @@ var powerMeterCapability = {
62213
64220
  } },
62214
64221
  /** Clock fields: written, but excluded from the compare that decides
62215
64222
  * whether persisting is worth a SQLite commit. */
62216
- volatileStateFields: ["lastFetchedAt"]
64223
+ volatileStateFields: ["lastFetchedAt"],
64224
+ customize: {
64225
+ version: 1,
64226
+ advanced: "derive",
64227
+ targets: []
64228
+ }
62217
64229
  };
62218
64230
  /**
62219
64231
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -62658,9 +64670,9 @@ var PtzOptionsSchema = object({
62658
64670
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
62659
64671
  * not one of the three cameras honours its own:
62660
64672
  *
62661
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
62662
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
62663
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
64673
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
64674
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
64675
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
62664
64676
  *
62665
64677
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
62666
64678
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -62993,7 +65005,7 @@ var RunningStateStatusSchema = object({
62993
65005
  running: boolean().nullable(),
62994
65006
  /** Epoch ms the current boolean began; null while `running` is null. */
62995
65007
  since: number().nullable(),
62996
- source: RunningStateSourceSchema,
65008
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
62997
65009
  phase: string().nullable(),
62998
65010
  /** null until a reading has been published (D393). */
62999
65011
  lastFetchedAt: number().nullable()
@@ -63007,6 +65019,7 @@ var RUNNING_DEVICE_TYPES = Object.values(DeviceType);
63007
65019
  /** Generic Customize target for the running boolean (D936). */
63008
65020
  var runningCustomize = {
63009
65021
  version: 1,
65022
+ advanced: "derive",
63010
65023
  targets: [{
63011
65024
  id: "running",
63012
65025
  cardinality: "scalar",
@@ -63145,7 +65158,7 @@ var RecordingAvailabilitySchema = object({
63145
65158
  * would look identical. But the answer used to say nothing about that, so a
63146
65159
  * caller asking "what can I export?" read the single preferred profile as
63147
65160
  * the only one that exists — on this deployment every camera records `high`
63148
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
65161
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
63149
65162
  * UI could not see it.
63150
65163
  *
63151
65164
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -63244,7 +65257,7 @@ var RecordingSourceOptionsSchema = object({
63244
65257
  * `sparse` = gaps are the absence of one, and must be drawn as such.
63245
65258
  *
63246
65259
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
63247
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
65260
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
63248
65261
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
63249
65262
  coverage: _enum(["continuous", "sparse"]),
63250
65263
  /** Where the playhead may be put.
@@ -63320,7 +65333,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
63320
65333
  * merely discouraged (D554 amended).
63321
65334
  *
63322
65335
  * It was learned the expensive way on `videoclips.listClips`: measured
63323
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
65336
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
63324
65337
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
63325
65338
  * three from each source, merged — `device-collection-dispatch.ts`
63326
65339
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -63921,7 +65934,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
63921
65934
  * on a 10 h window holding 29,393 s of footage every range landed late by the
63922
65935
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
63923
65936
  * the video was a uniform timelapse, and the log line reported the five ranges
63924
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
65937
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
63925
65938
  *
63926
65939
  * Relative and not absolute epoch, because an absolute epoch would make every
63927
65940
  * call site responsible for the same subtraction.
@@ -64738,7 +66751,7 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
64738
66751
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
64739
66752
  * for the thing: a scene is a standing question about the property ("is the bin
64740
66753
  * still out"), and the operator's question is "which of my scenes have tripped",
64741
- * across every camera at once — not "what does camera 617 think". Buried one
66754
+ * across every camera at once — not "what does camera 102 think". Buried one
64742
66755
  * camera deep it also could not be found. The surface is now a top-level admin
64743
66756
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
64744
66757
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -65795,7 +67808,7 @@ function buildStreamParamsConfigSchema(options, status) {
65795
67808
  * `getSettingsUISchema()` surface.
65796
67809
  */
65797
67810
  var SwitchStatusSchema = object({
65798
- on: boolean(),
67811
+ on: boolean().meta({ label: "On" }),
65799
67812
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
65800
67813
  lastChangedAt: number()
65801
67814
  });
@@ -65854,7 +67867,12 @@ var switchCapability = {
65854
67867
  label: "On",
65855
67868
  kind: "boolean"
65856
67869
  }
65857
- }] }
67870
+ }] },
67871
+ customize: {
67872
+ version: 1,
67873
+ advanced: "derive",
67874
+ targets: []
67875
+ }
65858
67876
  };
65859
67877
  /** C0 controls, DEL and the C1 range: none of them belongs in a name. */
65860
67878
  function hasControlCharacter(value) {
@@ -66450,7 +68468,10 @@ var tamperCapability = {
66450
68468
  */
66451
68469
  var TemperatureSensorStatusSchema = object({
66452
68470
  /** Current temperature in Celsius. */
66453
- celsius: number(),
68471
+ celsius: number().meta({
68472
+ unit: "°C",
68473
+ label: "Temperature"
68474
+ }),
66454
68475
  /** Ms epoch when the slice was last updated (push or poll). */
66455
68476
  lastFetchedAt: number(),
66456
68477
  /** Live display unit from the upstream source (e.g. HA
@@ -66493,7 +68514,12 @@ var temperatureSensorCapability = {
66493
68514
  } } },
66494
68515
  /** Clock fields: written, but excluded from the compare that decides
66495
68516
  * whether persisting is worth a SQLite commit. */
66496
- volatileStateFields: ["lastFetchedAt"]
68517
+ volatileStateFields: ["lastFetchedAt"],
68518
+ customize: {
68519
+ version: 1,
68520
+ advanced: "derive",
68521
+ targets: []
68522
+ }
66497
68523
  };
66498
68524
  /**
66499
68525
  * toast — system-scoped singleton capability that streams toast
@@ -68172,6 +70198,10 @@ function withClipEventLabels(provider, deps) {
68172
70198
  };
68173
70199
  }
68174
70200
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
70201
+ 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;
70202
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
70203
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
70204
+ new Set(CAP_NAMES);
68175
70205
  Object.freeze({
68176
70206
  person: .5,
68177
70207
  vehicle: .5,
@@ -69405,7 +71435,7 @@ var BaseDeviceProvider = class extends BaseAddon {
69405
71435
  * A top-level persisted row with NO configuration is a leftover, not a
69406
71436
  * device — quarantine it instead of dialling it.
69407
71437
  *
69408
- * Device 614 was deleted, resurrected as a config-less shell by a write
71438
+ * Device 105 was deleted, resurrected as a config-less shell by a write
69409
71439
  * already in flight (D376), and then dialled at every single boot: eight
69410
71440
  * `Failed to restore device — bounded retry scheduled` lines in one day,
69411
71441
  * each one the same Zod refusal on `host` and `password`. The bound was
@@ -82657,7 +84687,7 @@ var SENSOR_CAP_VOCABULARY = {
82657
84687
  state: [{
82658
84688
  kind: "boolean",
82659
84689
  field: "on",
82660
- label: t("Active", "Attivo"),
84690
+ label: t("On", "Acceso"),
82661
84691
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
82662
84692
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
82663
84693
  icon: "toggle-right"
@@ -86287,7 +88317,6 @@ Object.freeze({
86287
88317
  "smtp-provider": "email"
86288
88318
  });
86289
88319
  DeviceType.Camera;
86290
- 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;
86291
88320
  /**
86292
88321
  * A saved Customize assignment (D936). The schema is the type: callers use
86293
88322
  * `z.infer`, they do not restate the shape.
@@ -86376,7 +88405,6 @@ object({
86376
88405
  ]),
86377
88406
  reason: string().nullable()
86378
88407
  });
86379
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
86380
88408
  var G711_SCALE_CORRECTION_DB = {
86381
88409
  PCMU: 20 * Math.log10(4),
86382
88410
  PCMA: 20 * Math.log10(8)
@@ -86749,7 +88777,7 @@ var STATE_SUMMARY_SECTION_VARS = [
86749
88777
  {
86750
88778
  name: "summaryStreams",
86751
88779
  label: "Summary: streams offline",
86752
- example: "Ingresso (high) — since 06:40",
88780
+ example: "Front door (high) — since 06:40",
86753
88781
  kinds: ["stream-offline", "stream-online"]
86754
88782
  },
86755
88783
  {
@@ -86767,13 +88795,13 @@ var STATE_SUMMARY_SECTION_VARS = [
86767
88795
  {
86768
88796
  name: "summaryDetection",
86769
88797
  label: "Summary: cameras detecting nothing",
86770
- example: "Ingresso — since 05:10",
88798
+ example: "Front door — since 05:10",
86771
88799
  kinds: ["detection-blind"]
86772
88800
  },
86773
88801
  {
86774
88802
  name: "summaryNodes",
86775
88803
  label: "Summary: nodes",
86776
- example: "little-unraid — offline since 03:00",
88804
+ example: "agent-a — offline since 03:00",
86777
88805
  kinds: [
86778
88806
  "node-offline",
86779
88807
  "node-online",
@@ -89578,7 +91606,7 @@ var amcrestCameraSchema = object({
89578
91606
  *
89579
91607
  * Empty = nothing configured, and `goHome` then REFUSES. It used to go to a
89580
91608
  * hardcoded slot on a vendor "convention" this fleet contradicts: reolink
89581
- * went to preset 0, which on device 592 holds "stanza"; amcrest went to
91609
+ * went to preset 0, which on device 107 holds "stanza"; amcrest went to
89582
91610
  * preset 1, which on device 3836 holds "Preset1". Both swallowed the failure
89583
91611
  * in a bare catch, so a head that never moved was indistinguishable from a
89584
91612
  * head that went home.