@camstack/addon-provider-amcrest 0.2.158 → 0.2.160

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.mjs CHANGED
@@ -14,7 +14,7 @@ import { networkInterfaces } from "node:os";
14
14
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
15
15
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
16
16
  //#endregion
17
- //#region ../types/dist/event-category-Ceif8n-v.mjs
17
+ //#region ../types/dist/event-category-DHXxB8t9.mjs
18
18
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
19
19
  EventCategory["SystemBoot"] = "system.boot";
20
20
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -310,7 +310,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
310
310
  * TRANSITION into that state (never per dispatch), and the node is dropped
311
311
  * from the placement candidate set for as long as it holds.
312
312
  *
313
- * This exists because the state was previously invisible: little-unraid
313
+ * This exists because the state was previously invisible: agent-a
314
314
  * absorbed 283k inference errors in a day while still being handed cameras,
315
315
  * and nothing in the system said so.
316
316
  *
@@ -5449,7 +5449,7 @@ var ZodIssueCode = {
5449
5449
  var ZodFirstPartyTypeKind;
5450
5450
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5451
5451
  //#endregion
5452
- //#region ../types/dist/sleep-CYfIZzGv.mjs
5452
+ //#region ../types/dist/sleep-BErAxhul.mjs
5453
5453
  /**
5454
5454
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5455
5455
  * window to float samples (D455).
@@ -8472,6 +8472,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8472
8472
  kind: "mutation",
8473
8473
  auth: "admin"
8474
8474
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8475
+ Object.freeze({ "doorbell": "lastPressedAt" });
8476
+ /** Every capability name, so addon code can check a name without the schema graph. */
8477
+ var CAP_NAMES = Object.freeze([
8478
+ "accessories",
8479
+ "addon-pages",
8480
+ "addon-pages-source",
8481
+ "addon-routes",
8482
+ "addon-settings",
8483
+ "addon-widgets",
8484
+ "addon-widgets-source",
8485
+ "addons",
8486
+ "admin-ui",
8487
+ "air-quality-sensor",
8488
+ "alarm-panel",
8489
+ "alerts",
8490
+ "ambient-light-sensor",
8491
+ "audio-analysis",
8492
+ "audio-analyzer",
8493
+ "audio-codec",
8494
+ "audio-metrics",
8495
+ "auth-provider",
8496
+ "automation-control",
8497
+ "backup",
8498
+ "battery",
8499
+ "binary",
8500
+ "brightness",
8501
+ "broker",
8502
+ "button",
8503
+ "calendar-source",
8504
+ "calendars",
8505
+ "camera-credentials",
8506
+ "camera-grid-layout",
8507
+ "camera-pipeline-config",
8508
+ "camera-streams",
8509
+ "carbon-monoxide",
8510
+ "climate-control",
8511
+ "color",
8512
+ "composer",
8513
+ "connection-test",
8514
+ "connectivity",
8515
+ "consumables",
8516
+ "contact",
8517
+ "control",
8518
+ "core-blocks",
8519
+ "cover",
8520
+ "custom-model-registry",
8521
+ "data-store-provider",
8522
+ "database-snapshot",
8523
+ "day-night",
8524
+ "decoder",
8525
+ "detection-pipeline",
8526
+ "device-admin-link",
8527
+ "device-adoption",
8528
+ "device-credentials",
8529
+ "device-discovery",
8530
+ "device-export",
8531
+ "device-extension",
8532
+ "device-history",
8533
+ "device-manager",
8534
+ "device-ops",
8535
+ "device-provider",
8536
+ "device-removal-hook",
8537
+ "device-state",
8538
+ "device-status",
8539
+ "dishwasher",
8540
+ "display-palette",
8541
+ "doorbell",
8542
+ "embedding-encoder",
8543
+ "enum-sensor",
8544
+ "event-emitter",
8545
+ "face-gallery",
8546
+ "failure-contribution",
8547
+ "fan-control",
8548
+ "feature-probe",
8549
+ "filesystem-browse",
8550
+ "flood",
8551
+ "gas",
8552
+ "heating-valve",
8553
+ "humidifier",
8554
+ "humidity-sensor",
8555
+ "image",
8556
+ "image-settings",
8557
+ "integrations",
8558
+ "intercom",
8559
+ "keychain",
8560
+ "keychain-admin",
8561
+ "lawn-mower-control",
8562
+ "llm",
8563
+ "llm-runtime",
8564
+ "load-contribution",
8565
+ "local-network",
8566
+ "lock-control",
8567
+ "log-channels",
8568
+ "log-destination",
8569
+ "login-method",
8570
+ "media-player",
8571
+ "mesh-network",
8572
+ "metrics-provider",
8573
+ "model-convert",
8574
+ "model-distributor",
8575
+ "motion",
8576
+ "motion-detection",
8577
+ "motion-trigger",
8578
+ "motion-zones",
8579
+ "mqtt-broker",
8580
+ "native-object-detection",
8581
+ "navigation",
8582
+ "network-access",
8583
+ "network-link",
8584
+ "network-quality",
8585
+ "node-certificates",
8586
+ "nodes",
8587
+ "notification-output",
8588
+ "notification-rules",
8589
+ "notifier",
8590
+ "numeric-sensor",
8591
+ "oauth-integration",
8592
+ "oidc-connections",
8593
+ "osd",
8594
+ "osd-manager",
8595
+ "pet-feeder",
8596
+ "pipeline-analytics",
8597
+ "pipeline-executor",
8598
+ "pipeline-orchestrator",
8599
+ "pipeline-runner",
8600
+ "plate-gallery",
8601
+ "platform-probe",
8602
+ "power-meter",
8603
+ "presence",
8604
+ "pressure-sensor",
8605
+ "privacy-mask",
8606
+ "ptz",
8607
+ "ptz-autotrack",
8608
+ "reboot",
8609
+ "record-entries",
8610
+ "recording",
8611
+ "recording-archive",
8612
+ "recording-export",
8613
+ "recording-onboard",
8614
+ "recording-signal",
8615
+ "records",
8616
+ "running-state",
8617
+ "scene-monitor",
8618
+ "script-runner",
8619
+ "server-management",
8620
+ "settings-store",
8621
+ "smoke",
8622
+ "smtp-provider",
8623
+ "snapshot",
8624
+ "sso-bridge",
8625
+ "storage",
8626
+ "storage-admin",
8627
+ "storage-evictable",
8628
+ "storage-migration",
8629
+ "storage-occupancy",
8630
+ "storage-provider",
8631
+ "stream-broker",
8632
+ "stream-catalog",
8633
+ "stream-params",
8634
+ "stream-signals",
8635
+ "switch",
8636
+ "system",
8637
+ "tamper",
8638
+ "temperature-sensor",
8639
+ "terminal-session",
8640
+ "toast",
8641
+ "training",
8642
+ "training-provider",
8643
+ "turn-provider",
8644
+ "update",
8645
+ "user-management",
8646
+ "user-passkeys",
8647
+ "vacuum-control",
8648
+ "valve",
8649
+ "vector-store",
8650
+ "vibration",
8651
+ "videoclips",
8652
+ "viewer-ui",
8653
+ "water-heater",
8654
+ "weather",
8655
+ "webrtc-session",
8656
+ "zone-analytics",
8657
+ "zone-rules",
8658
+ "zones"
8659
+ ]);
8660
+ Object.freeze({
8661
+ "air-quality-sensor": [
8662
+ {
8663
+ "path": "co2Ppm",
8664
+ "valueType": "number"
8665
+ },
8666
+ {
8667
+ "path": "vocPpb",
8668
+ "valueType": "number"
8669
+ },
8670
+ {
8671
+ "path": "pm25",
8672
+ "valueType": "number"
8673
+ },
8674
+ {
8675
+ "path": "pm10",
8676
+ "valueType": "number"
8677
+ },
8678
+ {
8679
+ "path": "aqi",
8680
+ "valueType": "number"
8681
+ },
8682
+ {
8683
+ "path": "unit",
8684
+ "valueType": "string"
8685
+ },
8686
+ {
8687
+ "path": "precision",
8688
+ "valueType": "number"
8689
+ }
8690
+ ],
8691
+ "alarm-panel": [
8692
+ {
8693
+ "path": "state",
8694
+ "valueType": "enum",
8695
+ "enumValues": [
8696
+ "disarmed",
8697
+ "armed_home",
8698
+ "armed_away",
8699
+ "armed_night",
8700
+ "armed_vacation",
8701
+ "armed_custom_bypass",
8702
+ "arming",
8703
+ "disarming",
8704
+ "pending",
8705
+ "triggered"
8706
+ ]
8707
+ },
8708
+ {
8709
+ "path": "targetMode",
8710
+ "valueType": "enum",
8711
+ "enumValues": [
8712
+ "home",
8713
+ "away",
8714
+ "night",
8715
+ "vacation",
8716
+ "custom_bypass"
8717
+ ]
8718
+ },
8719
+ {
8720
+ "path": "requiresCode",
8721
+ "valueType": "boolean"
8722
+ }
8723
+ ],
8724
+ "ambient-light-sensor": [
8725
+ {
8726
+ "path": "lux",
8727
+ "valueType": "number"
8728
+ },
8729
+ {
8730
+ "path": "unit",
8731
+ "valueType": "string"
8732
+ },
8733
+ {
8734
+ "path": "precision",
8735
+ "valueType": "number"
8736
+ }
8737
+ ],
8738
+ "audio-metrics": [
8739
+ {
8740
+ "path": "ts",
8741
+ "valueType": "number"
8742
+ },
8743
+ {
8744
+ "path": "windowSec",
8745
+ "valueType": "number"
8746
+ },
8747
+ {
8748
+ "path": "level.rms",
8749
+ "valueType": "number"
8750
+ },
8751
+ {
8752
+ "path": "level.dbfs",
8753
+ "valueType": "number"
8754
+ },
8755
+ {
8756
+ "path": "peakDbfs",
8757
+ "valueType": "number"
8758
+ },
8759
+ {
8760
+ "path": "avgDbfs",
8761
+ "valueType": "number"
8762
+ },
8763
+ {
8764
+ "path": "current.className",
8765
+ "valueType": "string"
8766
+ },
8767
+ {
8768
+ "path": "current.score",
8769
+ "valueType": "number"
8770
+ },
8771
+ {
8772
+ "path": "current.timestamp",
8773
+ "valueType": "number"
8774
+ }
8775
+ ],
8776
+ "automation-control": [
8777
+ {
8778
+ "path": "enabled",
8779
+ "valueType": "boolean"
8780
+ },
8781
+ {
8782
+ "path": "isRunning",
8783
+ "valueType": "boolean"
8784
+ },
8785
+ {
8786
+ "path": "lastTriggeredAt",
8787
+ "valueType": "number"
8788
+ },
8789
+ {
8790
+ "path": "lastError",
8791
+ "valueType": "string"
8792
+ }
8793
+ ],
8794
+ "battery": [
8795
+ {
8796
+ "path": "percentage",
8797
+ "valueType": "number"
8798
+ },
8799
+ {
8800
+ "path": "charging",
8801
+ "valueType": "enum",
8802
+ "enumValues": [
8803
+ "dc",
8804
+ "solar",
8805
+ "none",
8806
+ "unknown"
8807
+ ]
8808
+ },
8809
+ {
8810
+ "path": "sleeping",
8811
+ "valueType": "boolean"
8812
+ },
8813
+ {
8814
+ "path": "lastUpdated",
8815
+ "valueType": "number"
8816
+ },
8817
+ {
8818
+ "path": "lastContactAt",
8819
+ "valueType": "number"
8820
+ },
8821
+ {
8822
+ "path": "lastFullRefreshAt",
8823
+ "valueType": "number"
8824
+ },
8825
+ {
8826
+ "path": "binary",
8827
+ "valueType": "boolean"
8828
+ }
8829
+ ],
8830
+ "binary": [{
8831
+ "path": "on",
8832
+ "valueType": "boolean"
8833
+ }],
8834
+ "brightness": [{
8835
+ "path": "percentage",
8836
+ "valueType": "number"
8837
+ }],
8838
+ "broker": [{
8839
+ "path": "brokerCount",
8840
+ "valueType": "number"
8841
+ }, {
8842
+ "path": "connectedCount",
8843
+ "valueType": "number"
8844
+ }],
8845
+ "camera-credentials": [
8846
+ {
8847
+ "path": "host",
8848
+ "valueType": "string"
8849
+ },
8850
+ {
8851
+ "path": "port",
8852
+ "valueType": "number"
8853
+ },
8854
+ {
8855
+ "path": "onvifPort",
8856
+ "valueType": "number"
8857
+ },
8858
+ {
8859
+ "path": "rtspPort",
8860
+ "valueType": "number"
8861
+ },
8862
+ {
8863
+ "path": "https",
8864
+ "valueType": "boolean"
8865
+ },
8866
+ {
8867
+ "path": "hasUsername",
8868
+ "valueType": "boolean"
8869
+ },
8870
+ {
8871
+ "path": "hasPassword",
8872
+ "valueType": "boolean"
8873
+ },
8874
+ {
8875
+ "path": "onvifProfile",
8876
+ "valueType": "string"
8877
+ }
8878
+ ],
8879
+ "camera-streams": [
8880
+ {
8881
+ "path": "online",
8882
+ "valueType": "boolean"
8883
+ },
8884
+ {
8885
+ "path": "slotStatuses.high",
8886
+ "valueType": "enum",
8887
+ "enumValues": [
8888
+ "unassigned",
8889
+ "idle",
8890
+ "connecting",
8891
+ "streaming",
8892
+ "error"
8893
+ ]
8894
+ },
8895
+ {
8896
+ "path": "slotStatuses.mid",
8897
+ "valueType": "enum",
8898
+ "enumValues": [
8899
+ "unassigned",
8900
+ "idle",
8901
+ "connecting",
8902
+ "streaming",
8903
+ "error"
8904
+ ]
8905
+ },
8906
+ {
8907
+ "path": "slotStatuses.low",
8908
+ "valueType": "enum",
8909
+ "enumValues": [
8910
+ "unassigned",
8911
+ "idle",
8912
+ "connecting",
8913
+ "streaming",
8914
+ "error"
8915
+ ]
8916
+ },
8917
+ {
8918
+ "path": "slotErrors.high",
8919
+ "valueType": "string"
8920
+ },
8921
+ {
8922
+ "path": "slotErrors.mid",
8923
+ "valueType": "string"
8924
+ },
8925
+ {
8926
+ "path": "slotErrors.low",
8927
+ "valueType": "string"
8928
+ }
8929
+ ],
8930
+ "carbon-monoxide": [{
8931
+ "path": "detected",
8932
+ "valueType": "boolean"
8933
+ }],
8934
+ "climate-control": [
8935
+ {
8936
+ "path": "mode",
8937
+ "valueType": "enum",
8938
+ "enumValues": [
8939
+ "off",
8940
+ "heat",
8941
+ "cool",
8942
+ "auto",
8943
+ "heat_cool",
8944
+ "fan_only",
8945
+ "dry"
8946
+ ]
8947
+ },
8948
+ {
8949
+ "path": "fanMode",
8950
+ "valueType": "string"
8951
+ },
8952
+ {
8953
+ "path": "preset",
8954
+ "valueType": "string"
8955
+ },
8956
+ {
8957
+ "path": "target",
8958
+ "valueType": "number"
8959
+ },
8960
+ {
8961
+ "path": "targetHigh",
8962
+ "valueType": "number"
8963
+ },
8964
+ {
8965
+ "path": "targetLow",
8966
+ "valueType": "number"
8967
+ },
8968
+ {
8969
+ "path": "targetHumidity",
8970
+ "valueType": "number"
8971
+ },
8972
+ {
8973
+ "path": "currentTemp",
8974
+ "valueType": "number"
8975
+ },
8976
+ {
8977
+ "path": "currentHumidity",
8978
+ "valueType": "number"
8979
+ },
8980
+ {
8981
+ "path": "swingVertical",
8982
+ "valueType": "boolean"
8983
+ },
8984
+ {
8985
+ "path": "swingHorizontal",
8986
+ "valueType": "boolean"
8987
+ },
8988
+ {
8989
+ "path": "minTemp",
8990
+ "valueType": "number"
8991
+ },
8992
+ {
8993
+ "path": "maxTemp",
8994
+ "valueType": "number"
8995
+ },
8996
+ {
8997
+ "path": "tempStep",
8998
+ "valueType": "number"
8999
+ }
9000
+ ],
9001
+ "color": [
9002
+ {
9003
+ "path": "mode",
9004
+ "valueType": "enum",
9005
+ "enumValues": [
9006
+ "rgb",
9007
+ "hsv",
9008
+ "mired"
9009
+ ]
9010
+ },
9011
+ {
9012
+ "path": "rgb.r",
9013
+ "valueType": "number"
9014
+ },
9015
+ {
9016
+ "path": "rgb.g",
9017
+ "valueType": "number"
9018
+ },
9019
+ {
9020
+ "path": "rgb.b",
9021
+ "valueType": "number"
9022
+ },
9023
+ {
9024
+ "path": "hsv.h",
9025
+ "valueType": "number"
9026
+ },
9027
+ {
9028
+ "path": "hsv.s",
9029
+ "valueType": "number"
9030
+ },
9031
+ {
9032
+ "path": "hsv.v",
9033
+ "valueType": "number"
9034
+ },
9035
+ {
9036
+ "path": "mireds",
9037
+ "valueType": "number"
9038
+ }
9039
+ ],
9040
+ "connectivity": [{
9041
+ "path": "connected",
9042
+ "valueType": "boolean"
9043
+ }],
9044
+ "contact": [{
9045
+ "path": "entryOpen",
9046
+ "valueType": "boolean"
9047
+ }],
9048
+ "control": [
9049
+ {
9050
+ "path": "kind",
9051
+ "valueType": "enum",
9052
+ "enumValues": [
9053
+ "numeric",
9054
+ "select",
9055
+ "text",
9056
+ "datetime"
9057
+ ]
9058
+ },
9059
+ {
9060
+ "path": "unit",
9061
+ "valueType": "string"
9062
+ },
9063
+ {
9064
+ "path": "min",
9065
+ "valueType": "number"
9066
+ },
9067
+ {
9068
+ "path": "max",
9069
+ "valueType": "number"
9070
+ },
9071
+ {
9072
+ "path": "step",
9073
+ "valueType": "number"
9074
+ },
9075
+ {
9076
+ "path": "precision",
9077
+ "valueType": "number"
9078
+ },
9079
+ {
9080
+ "path": "format",
9081
+ "valueType": "enum",
9082
+ "enumValues": [
9083
+ "date",
9084
+ "time",
9085
+ "datetime"
9086
+ ]
9087
+ }
9088
+ ],
9089
+ "cover": [
9090
+ {
9091
+ "path": "state",
9092
+ "valueType": "enum",
9093
+ "enumValues": [
9094
+ "open",
9095
+ "opening",
9096
+ "closing",
9097
+ "closed",
9098
+ "stopped"
9099
+ ]
9100
+ },
9101
+ {
9102
+ "path": "position",
9103
+ "valueType": "number"
9104
+ },
9105
+ {
9106
+ "path": "tiltPosition",
9107
+ "valueType": "number"
9108
+ }
9109
+ ],
9110
+ "day-night": [
9111
+ {
9112
+ "path": "mode",
9113
+ "valueType": "enum",
9114
+ "enumValues": [
9115
+ "auto",
9116
+ "day",
9117
+ "night",
9118
+ "schedule"
9119
+ ]
9120
+ },
9121
+ {
9122
+ "path": "sensitivity",
9123
+ "valueType": "number"
9124
+ },
9125
+ {
9126
+ "path": "switchDelaySec",
9127
+ "valueType": "number"
9128
+ }
9129
+ ],
9130
+ "device-adoption": [
9131
+ {
9132
+ "path": "lastDiscoveryAt",
9133
+ "valueType": "number"
9134
+ },
9135
+ {
9136
+ "path": "candidateCount",
9137
+ "valueType": "number"
9138
+ },
9139
+ {
9140
+ "path": "adoptedCount",
9141
+ "valueType": "number"
9142
+ },
9143
+ {
9144
+ "path": "lastError",
9145
+ "valueType": "string"
9146
+ }
9147
+ ],
9148
+ "device-discovery": [{
9149
+ "path": "lastDiscoveryAt",
9150
+ "valueType": "number"
9151
+ }, {
9152
+ "path": "lastError",
9153
+ "valueType": "string"
9154
+ }],
9155
+ "device-export": [
9156
+ {
9157
+ "path": "linkState",
9158
+ "valueType": "enum",
9159
+ "enumValues": [
9160
+ "unlinked",
9161
+ "linked",
9162
+ "error"
9163
+ ]
9164
+ },
9165
+ {
9166
+ "path": "exposedDeviceCount",
9167
+ "valueType": "number"
9168
+ },
9169
+ {
9170
+ "path": "error",
9171
+ "valueType": "string"
9172
+ },
9173
+ {
9174
+ "path": "setup.qr",
9175
+ "valueType": "string"
9176
+ },
9177
+ {
9178
+ "path": "setup.note",
9179
+ "valueType": "string"
9180
+ }
9181
+ ],
9182
+ "device-status": [{
9183
+ "path": "online",
9184
+ "valueType": "boolean"
9185
+ }],
9186
+ "dishwasher": [
9187
+ {
9188
+ "path": "availability",
9189
+ "valueType": "enum",
9190
+ "enumValues": [
9191
+ "available",
9192
+ "offline",
9193
+ "description-missing"
9194
+ ]
9195
+ },
9196
+ {
9197
+ "path": "state",
9198
+ "valueType": "enum",
9199
+ "enumValues": [
9200
+ "idle",
9201
+ "running",
9202
+ "paused",
9203
+ "finished",
9204
+ "error",
9205
+ "unavailable"
9206
+ ]
9207
+ },
9208
+ {
9209
+ "path": "operationState",
9210
+ "valueType": "enum",
9211
+ "enumValues": [
9212
+ "Inactive",
9213
+ "Ready",
9214
+ "DelayedStart",
9215
+ "Run",
9216
+ "Pause",
9217
+ "ActionRequired",
9218
+ "Finished",
9219
+ "Error",
9220
+ "Aborting"
9221
+ ]
9222
+ },
9223
+ {
9224
+ "path": "program",
9225
+ "valueType": "string"
9226
+ },
9227
+ {
9228
+ "path": "selectedProgram",
9229
+ "valueType": "string"
9230
+ },
9231
+ {
9232
+ "path": "remainingSeconds",
9233
+ "valueType": "number"
9234
+ },
9235
+ {
9236
+ "path": "delayedStartSeconds",
9237
+ "valueType": "number"
9238
+ },
9239
+ {
9240
+ "path": "progressPercent",
9241
+ "valueType": "number"
9242
+ },
9243
+ {
9244
+ "path": "doorOpen",
9245
+ "valueType": "boolean"
9246
+ },
9247
+ {
9248
+ "path": "doorLocked",
9249
+ "valueType": "boolean"
9250
+ },
9251
+ {
9252
+ "path": "remoteStartAllowed",
9253
+ "valueType": "boolean"
9254
+ },
9255
+ {
9256
+ "path": "remoteControlActive",
9257
+ "valueType": "boolean"
9258
+ },
9259
+ {
9260
+ "path": "localControlActive",
9261
+ "valueType": "boolean"
9262
+ },
9263
+ {
9264
+ "path": "powerOn",
9265
+ "valueType": "boolean"
9266
+ },
9267
+ {
9268
+ "path": "powerState",
9269
+ "valueType": "string"
9270
+ },
9271
+ {
9272
+ "path": "filterCleaningDue",
9273
+ "valueType": "boolean"
9274
+ },
9275
+ {
9276
+ "path": "machineCareDue",
9277
+ "valueType": "boolean"
9278
+ },
9279
+ {
9280
+ "path": "machineCareRemainingRuns",
9281
+ "valueType": "number"
9282
+ },
9283
+ {
9284
+ "path": "halfLoad",
9285
+ "valueType": "boolean"
9286
+ },
9287
+ {
9288
+ "path": "hygienePlus",
9289
+ "valueType": "boolean"
9290
+ },
9291
+ {
9292
+ "path": "extraDry",
9293
+ "valueType": "boolean"
9294
+ },
9295
+ {
9296
+ "path": "intensiveZone",
9297
+ "valueType": "boolean"
9298
+ },
9299
+ {
9300
+ "path": "varioSpeedPlus",
9301
+ "valueType": "boolean"
9302
+ },
9303
+ {
9304
+ "path": "childLock",
9305
+ "valueType": "boolean"
9306
+ },
9307
+ {
9308
+ "path": "errorCode",
9309
+ "valueType": "number"
9310
+ },
9311
+ {
9312
+ "path": "errorLabel",
9313
+ "valueType": "string"
9314
+ }
9315
+ ],
9316
+ "doorbell": [{
9317
+ "path": "lastPressedAt",
9318
+ "valueType": "number"
9319
+ }, {
9320
+ "path": "pressCountSinceStart",
9321
+ "valueType": "number"
9322
+ }],
9323
+ "enum-sensor": [{
9324
+ "path": "value",
9325
+ "valueType": "string"
9326
+ }, {
9327
+ "path": "format",
9328
+ "valueType": "enum",
9329
+ "enumValues": [
9330
+ "date",
9331
+ "time",
9332
+ "datetime"
9333
+ ]
9334
+ }],
9335
+ "event-emitter": [
9336
+ {
9337
+ "path": "lastEvent.deviceId",
9338
+ "valueType": "number"
9339
+ },
9340
+ {
9341
+ "path": "lastEvent.eventType",
9342
+ "valueType": "string"
9343
+ },
9344
+ {
9345
+ "path": "lastEvent.timestamp",
9346
+ "valueType": "number"
9347
+ },
9348
+ {
9349
+ "path": "lastEvent.seq",
9350
+ "valueType": "number"
9351
+ },
9352
+ {
9353
+ "path": "eventCountSinceStart",
9354
+ "valueType": "number"
9355
+ }
9356
+ ],
9357
+ "fan-control": [
9358
+ {
9359
+ "path": "percentage",
9360
+ "valueType": "number"
9361
+ },
9362
+ {
9363
+ "path": "percentageStep",
9364
+ "valueType": "number"
9365
+ },
9366
+ {
9367
+ "path": "preset",
9368
+ "valueType": "string"
9369
+ },
9370
+ {
9371
+ "path": "direction",
9372
+ "valueType": "enum",
9373
+ "enumValues": ["forward", "reverse"]
9374
+ },
9375
+ {
9376
+ "path": "oscillating",
9377
+ "valueType": "boolean"
9378
+ }
9379
+ ],
9380
+ "feature-probe": [
9381
+ {
9382
+ "path": "deviceType",
9383
+ "valueType": "string"
9384
+ },
9385
+ {
9386
+ "path": "model",
9387
+ "valueType": "string"
9388
+ },
9389
+ {
9390
+ "path": "channelCount",
9391
+ "valueType": "number"
9392
+ },
9393
+ {
9394
+ "path": "lastProbedAt",
9395
+ "valueType": "number"
9396
+ }
9397
+ ],
9398
+ "flood": [{
9399
+ "path": "flooded",
9400
+ "valueType": "boolean"
9401
+ }],
9402
+ "gas": [{
9403
+ "path": "detected",
9404
+ "valueType": "boolean"
9405
+ }],
9406
+ "heating-valve": [{
9407
+ "path": "position",
9408
+ "valueType": "number"
9409
+ }],
9410
+ "humidifier": [
9411
+ {
9412
+ "path": "on",
9413
+ "valueType": "boolean"
9414
+ },
9415
+ {
9416
+ "path": "currentHumidity",
9417
+ "valueType": "number"
9418
+ },
9419
+ {
9420
+ "path": "targetHumidity",
9421
+ "valueType": "number"
9422
+ },
9423
+ {
9424
+ "path": "mode",
9425
+ "valueType": "string"
9426
+ },
9427
+ {
9428
+ "path": "action",
9429
+ "valueType": "string"
9430
+ },
9431
+ {
9432
+ "path": "minHumidity",
9433
+ "valueType": "number"
9434
+ },
9435
+ {
9436
+ "path": "maxHumidity",
9437
+ "valueType": "number"
9438
+ }
9439
+ ],
9440
+ "humidity-sensor": [
9441
+ {
9442
+ "path": "percent",
9443
+ "valueType": "number"
9444
+ },
9445
+ {
9446
+ "path": "unit",
9447
+ "valueType": "string"
9448
+ },
9449
+ {
9450
+ "path": "precision",
9451
+ "valueType": "number"
9452
+ }
9453
+ ],
9454
+ "image": [{
9455
+ "path": "url",
9456
+ "valueType": "string"
9457
+ }, {
9458
+ "path": "lastUpdated",
9459
+ "valueType": "number"
9460
+ }],
9461
+ "image-settings": [
9462
+ {
9463
+ "path": "brightness",
9464
+ "valueType": "number"
9465
+ },
9466
+ {
9467
+ "path": "contrast",
9468
+ "valueType": "number"
9469
+ },
9470
+ {
9471
+ "path": "saturation",
9472
+ "valueType": "number"
9473
+ },
9474
+ {
9475
+ "path": "sharpness",
9476
+ "valueType": "number"
9477
+ },
9478
+ {
9479
+ "path": "mirror",
9480
+ "valueType": "boolean"
9481
+ },
9482
+ {
9483
+ "path": "flip",
9484
+ "valueType": "boolean"
9485
+ },
9486
+ {
9487
+ "path": "rotate",
9488
+ "valueType": "enum",
9489
+ "enumValues": [
9490
+ "0",
9491
+ "90",
9492
+ "180",
9493
+ "270"
9494
+ ]
9495
+ },
9496
+ {
9497
+ "path": "whiteBalance",
9498
+ "valueType": "enum",
9499
+ "enumValues": ["auto", "manual"]
9500
+ },
9501
+ {
9502
+ "path": "warmth",
9503
+ "valueType": "number"
9504
+ },
9505
+ {
9506
+ "path": "exposureMode",
9507
+ "valueType": "enum",
9508
+ "enumValues": ["auto", "manual"]
9509
+ },
9510
+ {
9511
+ "path": "backlightMode",
9512
+ "valueType": "enum",
9513
+ "enumValues": [
9514
+ "off",
9515
+ "blc",
9516
+ "wdr",
9517
+ "hlc"
9518
+ ]
9519
+ }
9520
+ ],
9521
+ "intercom": [
9522
+ {
9523
+ "path": "talking",
9524
+ "valueType": "boolean"
9525
+ },
9526
+ {
9527
+ "path": "lastSessionAt",
9528
+ "valueType": "number"
9529
+ },
9530
+ {
9531
+ "path": "ability.sampleRate",
9532
+ "valueType": "number"
9533
+ },
9534
+ {
9535
+ "path": "ability.duplex",
9536
+ "valueType": "enum",
9537
+ "enumValues": ["half", "full"]
9538
+ },
9539
+ {
9540
+ "path": "ability.maxBacklogMs",
9541
+ "valueType": "number"
9542
+ }
9543
+ ],
9544
+ "lawn-mower-control": [
9545
+ {
9546
+ "path": "activity",
9547
+ "valueType": "enum",
9548
+ "enumValues": [
9549
+ "idle",
9550
+ "mowing",
9551
+ "paused",
9552
+ "docked",
9553
+ "error"
9554
+ ]
9555
+ },
9556
+ {
9557
+ "path": "batteryLevel",
9558
+ "valueType": "number"
9559
+ },
9560
+ {
9561
+ "path": "progressPercent",
9562
+ "valueType": "number"
9563
+ },
9564
+ {
9565
+ "path": "currentCode",
9566
+ "valueType": "number"
9567
+ },
9568
+ {
9569
+ "path": "currentCodeLabel",
9570
+ "valueType": "string"
9571
+ },
9572
+ {
9573
+ "path": "severity",
9574
+ "valueType": "enum",
9575
+ "enumValues": [
9576
+ "info",
9577
+ "warning",
9578
+ "error"
9579
+ ]
9580
+ }
9581
+ ],
9582
+ "lock-control": [{
9583
+ "path": "state",
9584
+ "valueType": "enum",
9585
+ "enumValues": [
9586
+ "locked",
9587
+ "unlocked",
9588
+ "locking",
9589
+ "unlocking",
9590
+ "jammed"
9591
+ ]
9592
+ }],
9593
+ "media-player": [
9594
+ {
9595
+ "path": "state",
9596
+ "valueType": "enum",
9597
+ "enumValues": [
9598
+ "off",
9599
+ "on",
9600
+ "idle",
9601
+ "playing",
9602
+ "paused",
9603
+ "buffering",
9604
+ "standby"
9605
+ ]
9606
+ },
9607
+ {
9608
+ "path": "volumeLevel",
9609
+ "valueType": "number"
9610
+ },
9611
+ {
9612
+ "path": "isMuted",
9613
+ "valueType": "boolean"
9614
+ },
9615
+ {
9616
+ "path": "source",
9617
+ "valueType": "string"
9618
+ },
9619
+ {
9620
+ "path": "currentMedia.type",
9621
+ "valueType": "string"
9622
+ },
9623
+ {
9624
+ "path": "currentMedia.title",
9625
+ "valueType": "string"
9626
+ },
9627
+ {
9628
+ "path": "currentMedia.artist",
9629
+ "valueType": "string"
9630
+ },
9631
+ {
9632
+ "path": "currentMedia.album",
9633
+ "valueType": "string"
9634
+ },
9635
+ {
9636
+ "path": "currentMedia.imageUrl",
9637
+ "valueType": "string"
9638
+ },
9639
+ {
9640
+ "path": "positionMs",
9641
+ "valueType": "number"
9642
+ },
9643
+ {
9644
+ "path": "durationMs",
9645
+ "valueType": "number"
9646
+ },
9647
+ {
9648
+ "path": "shuffle",
9649
+ "valueType": "boolean"
9650
+ },
9651
+ {
9652
+ "path": "repeat",
9653
+ "valueType": "enum",
9654
+ "enumValues": [
9655
+ "off",
9656
+ "all",
9657
+ "one"
9658
+ ]
9659
+ }
9660
+ ],
9661
+ "motion": [
9662
+ {
9663
+ "path": "detected",
9664
+ "valueType": "boolean"
9665
+ },
9666
+ {
9667
+ "path": "lastDetectedAt",
9668
+ "valueType": "number"
9669
+ },
9670
+ {
9671
+ "path": "autoClearAfterMs",
9672
+ "valueType": "number"
9673
+ }
9674
+ ],
9675
+ "motion-trigger": [{
9676
+ "path": "enabled",
9677
+ "valueType": "boolean"
9678
+ }],
9679
+ "motion-zones": [{
9680
+ "path": "enabled",
9681
+ "valueType": "boolean"
9682
+ }, {
9683
+ "path": "sensitivity",
9684
+ "valueType": "number"
9685
+ }],
9686
+ "mqtt-broker": [{
9687
+ "path": "brokerCount",
9688
+ "valueType": "number"
9689
+ }, {
9690
+ "path": "embeddedRunning",
9691
+ "valueType": "boolean"
9692
+ }],
9693
+ "native-object-detection": [{
9694
+ "path": "enabled",
9695
+ "valueType": "boolean"
9696
+ }],
9697
+ "navigation": [
9698
+ {
9699
+ "path": "mode",
9700
+ "valueType": "enum",
9701
+ "enumValues": [
9702
+ "idle",
9703
+ "cleaning",
9704
+ "spot",
9705
+ "following",
9706
+ "goto",
9707
+ "returning",
9708
+ "paused",
9709
+ "unknown"
9710
+ ]
9711
+ },
9712
+ {
9713
+ "path": "following",
9714
+ "valueType": "boolean"
9715
+ },
9716
+ {
9717
+ "path": "flash",
9718
+ "valueType": "boolean"
9719
+ },
9720
+ {
9721
+ "path": "lightMode",
9722
+ "valueType": "enum",
9723
+ "enumValues": ["auto", "manual"]
9724
+ },
9725
+ {
9726
+ "path": "lightLevel",
9727
+ "valueType": "number"
9728
+ }
9729
+ ],
9730
+ "network-link": [
9731
+ {
9732
+ "path": "type",
9733
+ "valueType": "enum",
9734
+ "enumValues": [
9735
+ "wifi",
9736
+ "ethernet",
9737
+ "cellular",
9738
+ "unknown"
9739
+ ]
9740
+ },
9741
+ {
9742
+ "path": "signalPercent",
9743
+ "valueType": "number"
9744
+ },
9745
+ {
9746
+ "path": "rssiDbm",
9747
+ "valueType": "number"
9748
+ },
9749
+ {
9750
+ "path": "ssid",
9751
+ "valueType": "string"
9752
+ },
9753
+ {
9754
+ "path": "lastUpdated",
9755
+ "valueType": "number"
9756
+ }
9757
+ ],
9758
+ "notifier": [
9759
+ {
9760
+ "path": "lastSentAt",
9761
+ "valueType": "number"
9762
+ },
9763
+ {
9764
+ "path": "lastError",
9765
+ "valueType": "string"
9766
+ },
9767
+ {
9768
+ "path": "queueDepth",
9769
+ "valueType": "number"
9770
+ },
9771
+ {
9772
+ "path": "supports.image",
9773
+ "valueType": "boolean"
9774
+ },
9775
+ {
9776
+ "path": "supports.priority",
9777
+ "valueType": "boolean"
9778
+ },
9779
+ {
9780
+ "path": "supports.data",
9781
+ "valueType": "boolean"
9782
+ },
9783
+ {
9784
+ "path": "supports.actions",
9785
+ "valueType": "boolean"
9786
+ },
9787
+ {
9788
+ "path": "supports.recipients",
9789
+ "valueType": "boolean"
9790
+ }
9791
+ ],
9792
+ "numeric-sensor": [
9793
+ {
9794
+ "path": "value",
9795
+ "valueType": "number"
9796
+ },
9797
+ {
9798
+ "path": "unit",
9799
+ "valueType": "string"
9800
+ },
9801
+ {
9802
+ "path": "precision",
9803
+ "valueType": "number"
9804
+ }
9805
+ ],
9806
+ "pet-feeder": [
9807
+ {
9808
+ "path": "foodLevel",
9809
+ "valueType": "number"
9810
+ },
9811
+ {
9812
+ "path": "food1",
9813
+ "valueType": "number"
9814
+ },
9815
+ {
9816
+ "path": "food2",
9817
+ "valueType": "number"
9818
+ },
9819
+ {
9820
+ "path": "lowFood",
9821
+ "valueType": "boolean"
9822
+ },
9823
+ {
9824
+ "path": "batteryPower",
9825
+ "valueType": "number"
9826
+ },
9827
+ {
9828
+ "path": "desiccantLeftDays",
9829
+ "valueType": "number"
9830
+ },
9831
+ {
9832
+ "path": "feeding",
9833
+ "valueType": "boolean"
9834
+ },
9835
+ {
9836
+ "path": "status",
9837
+ "valueType": "enum",
9838
+ "enumValues": [
9839
+ "normal",
9840
+ "offline",
9841
+ "on_batteries"
9842
+ ]
9843
+ },
9844
+ {
9845
+ "path": "error",
9846
+ "valueType": "string"
9847
+ },
9848
+ {
9849
+ "path": "errorCode",
9850
+ "valueType": "number"
9851
+ },
9852
+ {
9853
+ "path": "isDualHopper",
9854
+ "valueType": "boolean"
9855
+ },
9856
+ {
9857
+ "path": "childLock",
9858
+ "valueType": "boolean"
9859
+ },
9860
+ {
9861
+ "path": "indicatorLight",
9862
+ "valueType": "boolean"
9863
+ },
9864
+ {
9865
+ "path": "feedSound",
9866
+ "valueType": "boolean"
9867
+ },
9868
+ {
9869
+ "path": "volume",
9870
+ "valueType": "number"
9871
+ }
9872
+ ],
9873
+ "power-meter": [
9874
+ {
9875
+ "path": "watts",
9876
+ "valueType": "number"
9877
+ },
9878
+ {
9879
+ "path": "kwhTotal",
9880
+ "valueType": "number"
9881
+ },
9882
+ {
9883
+ "path": "volts",
9884
+ "valueType": "number"
9885
+ },
9886
+ {
9887
+ "path": "amps",
9888
+ "valueType": "number"
9889
+ },
9890
+ {
9891
+ "path": "va",
9892
+ "valueType": "number"
9893
+ },
9894
+ {
9895
+ "path": "powerFactor",
9896
+ "valueType": "number"
9897
+ },
9898
+ {
9899
+ "path": "unit",
9900
+ "valueType": "string"
9901
+ },
9902
+ {
9903
+ "path": "precision",
9904
+ "valueType": "number"
9905
+ }
9906
+ ],
9907
+ "presence": [
9908
+ {
9909
+ "path": "state",
9910
+ "valueType": "string"
9911
+ },
9912
+ {
9913
+ "path": "location",
9914
+ "valueType": "string"
9915
+ },
9916
+ {
9917
+ "path": "gps.latitude",
9918
+ "valueType": "number"
9919
+ },
9920
+ {
9921
+ "path": "gps.longitude",
9922
+ "valueType": "number"
9923
+ },
9924
+ {
9925
+ "path": "gps.accuracyMeters",
9926
+ "valueType": "number"
9927
+ },
9928
+ {
9929
+ "path": "batteryPercent",
9930
+ "valueType": "number"
9931
+ }
9932
+ ],
9933
+ "pressure-sensor": [
9934
+ {
9935
+ "path": "hpa",
9936
+ "valueType": "number"
9937
+ },
9938
+ {
9939
+ "path": "unit",
9940
+ "valueType": "string"
9941
+ },
9942
+ {
9943
+ "path": "precision",
9944
+ "valueType": "number"
9945
+ }
9946
+ ],
9947
+ "privacy-mask": [{
9948
+ "path": "enabled",
9949
+ "valueType": "boolean"
9950
+ }, {
9951
+ "path": "audioEnabled",
9952
+ "valueType": "boolean"
9953
+ }],
9954
+ "ptz": [
9955
+ {
9956
+ "path": "pan",
9957
+ "valueType": "number"
9958
+ },
9959
+ {
9960
+ "path": "tilt",
9961
+ "valueType": "number"
9962
+ },
9963
+ {
9964
+ "path": "zoom",
9965
+ "valueType": "number"
9966
+ },
9967
+ {
9968
+ "path": "autofocus",
9969
+ "valueType": "boolean"
9970
+ }
9971
+ ],
9972
+ "ptz-autotrack": [
9973
+ {
9974
+ "path": "enabled",
9975
+ "valueType": "boolean"
9976
+ },
9977
+ {
9978
+ "path": "currentSettings.targetType",
9979
+ "valueType": "string"
9980
+ },
9981
+ {
9982
+ "path": "currentSettings.stopDelaySeconds",
9983
+ "valueType": "number"
9984
+ },
9985
+ {
9986
+ "path": "currentSettings.disappearDelaySeconds",
9987
+ "valueType": "number"
9988
+ }
9989
+ ],
9990
+ "recording-archive": [
9991
+ {
9992
+ "path": "deviceId",
9993
+ "valueType": "number"
9994
+ },
9995
+ {
9996
+ "path": "enabled",
9997
+ "valueType": "boolean"
9998
+ },
9999
+ {
10000
+ "path": "activeMode",
10001
+ "valueType": "enum",
10002
+ "enumValues": [
10003
+ "off",
10004
+ "events",
10005
+ "continuous",
10006
+ "on-device-decision"
10007
+ ]
10008
+ },
10009
+ {
10010
+ "path": "nodeId",
10011
+ "valueType": "string"
10012
+ },
10013
+ {
10014
+ "path": "storageBytes",
10015
+ "valueType": "number"
10016
+ }
10017
+ ],
10018
+ "recording-onboard": [
10019
+ {
10020
+ "path": "primaryTrackId",
10021
+ "valueType": "string"
10022
+ },
10023
+ {
10024
+ "path": "enabled",
10025
+ "valueType": "boolean"
10026
+ },
10027
+ {
10028
+ "path": "overwriteWhenFull",
10029
+ "valueType": "boolean"
10030
+ },
10031
+ {
10032
+ "path": "preRecordSec",
10033
+ "valueType": "number"
10034
+ },
10035
+ {
10036
+ "path": "postRecordSec",
10037
+ "valueType": "number"
10038
+ },
10039
+ {
10040
+ "path": "segmentMinutes",
10041
+ "valueType": "number"
10042
+ },
10043
+ {
10044
+ "path": "unreadableWindows",
10045
+ "valueType": "number"
10046
+ },
10047
+ {
10048
+ "path": "recordingToNowhere",
10049
+ "valueType": "boolean"
10050
+ }
10051
+ ],
10052
+ "recording-signal": [{
10053
+ "path": "active",
10054
+ "valueType": "boolean"
10055
+ }, {
10056
+ "path": "reason",
10057
+ "valueType": "string"
10058
+ }],
10059
+ "running-state": [
10060
+ {
10061
+ "path": "running",
10062
+ "valueType": "boolean"
10063
+ },
10064
+ {
10065
+ "path": "since",
10066
+ "valueType": "number"
10067
+ },
10068
+ {
10069
+ "path": "source",
10070
+ "valueType": "enum",
10071
+ "enumValues": ["native", "assigned"]
10072
+ },
10073
+ {
10074
+ "path": "phase",
10075
+ "valueType": "string"
10076
+ }
10077
+ ],
10078
+ "script-runner": [
10079
+ {
10080
+ "path": "isRunning",
10081
+ "valueType": "boolean"
10082
+ },
10083
+ {
10084
+ "path": "lastRunAt",
10085
+ "valueType": "number"
10086
+ },
10087
+ {
10088
+ "path": "lastRunSuccess",
10089
+ "valueType": "boolean"
10090
+ },
10091
+ {
10092
+ "path": "lastError",
10093
+ "valueType": "string"
10094
+ }
10095
+ ],
10096
+ "smoke": [{
10097
+ "path": "detected",
10098
+ "valueType": "boolean"
10099
+ }],
10100
+ "snapshot": [
10101
+ {
10102
+ "path": "lastCapturedAt",
10103
+ "valueType": "number"
10104
+ },
10105
+ {
10106
+ "path": "cacheAgeMs",
10107
+ "valueType": "number"
10108
+ },
10109
+ {
10110
+ "path": "lastBytes",
10111
+ "valueType": "number"
10112
+ },
10113
+ {
10114
+ "path": "lastStreamId",
10115
+ "valueType": "string"
10116
+ }
10117
+ ],
10118
+ "stream-params": [
10119
+ {
10120
+ "path": "main.width",
10121
+ "valueType": "number"
10122
+ },
10123
+ {
10124
+ "path": "main.height",
10125
+ "valueType": "number"
10126
+ },
10127
+ {
10128
+ "path": "main.codec",
10129
+ "valueType": "enum",
10130
+ "enumValues": ["h264", "h265"]
10131
+ },
10132
+ {
10133
+ "path": "main.framerate",
10134
+ "valueType": "number"
10135
+ },
10136
+ {
10137
+ "path": "main.bitrate",
10138
+ "valueType": "number"
10139
+ },
10140
+ {
10141
+ "path": "main.bitrateMode",
10142
+ "valueType": "enum",
10143
+ "enumValues": ["vbr", "cbr"]
10144
+ },
10145
+ {
10146
+ "path": "main.encoderProfile",
10147
+ "valueType": "enum",
10148
+ "enumValues": [
10149
+ "high",
10150
+ "main",
10151
+ "baseline"
10152
+ ]
10153
+ },
10154
+ {
10155
+ "path": "main.gop",
10156
+ "valueType": "number"
10157
+ },
10158
+ {
10159
+ "path": "main.audio",
10160
+ "valueType": "boolean"
10161
+ },
10162
+ {
10163
+ "path": "sub.width",
10164
+ "valueType": "number"
10165
+ },
10166
+ {
10167
+ "path": "sub.height",
10168
+ "valueType": "number"
10169
+ },
10170
+ {
10171
+ "path": "sub.codec",
10172
+ "valueType": "enum",
10173
+ "enumValues": ["h264", "h265"]
10174
+ },
10175
+ {
10176
+ "path": "sub.framerate",
10177
+ "valueType": "number"
10178
+ },
10179
+ {
10180
+ "path": "sub.bitrate",
10181
+ "valueType": "number"
10182
+ },
10183
+ {
10184
+ "path": "sub.bitrateMode",
10185
+ "valueType": "enum",
10186
+ "enumValues": ["vbr", "cbr"]
10187
+ },
10188
+ {
10189
+ "path": "sub.encoderProfile",
10190
+ "valueType": "enum",
10191
+ "enumValues": [
10192
+ "high",
10193
+ "main",
10194
+ "baseline"
10195
+ ]
10196
+ },
10197
+ {
10198
+ "path": "sub.gop",
10199
+ "valueType": "number"
10200
+ },
10201
+ {
10202
+ "path": "sub.audio",
10203
+ "valueType": "boolean"
10204
+ },
10205
+ {
10206
+ "path": "ext.width",
10207
+ "valueType": "number"
10208
+ },
10209
+ {
10210
+ "path": "ext.height",
10211
+ "valueType": "number"
10212
+ },
10213
+ {
10214
+ "path": "ext.codec",
10215
+ "valueType": "enum",
10216
+ "enumValues": ["h264", "h265"]
10217
+ },
10218
+ {
10219
+ "path": "ext.framerate",
10220
+ "valueType": "number"
10221
+ },
10222
+ {
10223
+ "path": "ext.bitrate",
10224
+ "valueType": "number"
10225
+ },
10226
+ {
10227
+ "path": "ext.bitrateMode",
10228
+ "valueType": "enum",
10229
+ "enumValues": ["vbr", "cbr"]
10230
+ },
10231
+ {
10232
+ "path": "ext.encoderProfile",
10233
+ "valueType": "enum",
10234
+ "enumValues": [
10235
+ "high",
10236
+ "main",
10237
+ "baseline"
10238
+ ]
10239
+ },
10240
+ {
10241
+ "path": "ext.gop",
10242
+ "valueType": "number"
10243
+ },
10244
+ {
10245
+ "path": "ext.audio",
10246
+ "valueType": "boolean"
10247
+ }
10248
+ ],
10249
+ "switch": [{
10250
+ "path": "on",
10251
+ "valueType": "boolean"
10252
+ }],
10253
+ "tamper": [{
10254
+ "path": "tampered",
10255
+ "valueType": "boolean"
10256
+ }],
10257
+ "temperature-sensor": [
10258
+ {
10259
+ "path": "celsius",
10260
+ "valueType": "number"
10261
+ },
10262
+ {
10263
+ "path": "unit",
10264
+ "valueType": "string"
10265
+ },
10266
+ {
10267
+ "path": "precision",
10268
+ "valueType": "number"
10269
+ }
10270
+ ],
10271
+ "update": [
10272
+ {
10273
+ "path": "currentVersion",
10274
+ "valueType": "string"
10275
+ },
10276
+ {
10277
+ "path": "availableVersion",
10278
+ "valueType": "string"
10279
+ },
10280
+ {
10281
+ "path": "updatable",
10282
+ "valueType": "boolean"
10283
+ },
10284
+ {
10285
+ "path": "state",
10286
+ "valueType": "string"
10287
+ },
10288
+ {
10289
+ "path": "inProgress",
10290
+ "valueType": "boolean"
10291
+ }
10292
+ ],
10293
+ "vacuum-control": [
10294
+ {
10295
+ "path": "state",
10296
+ "valueType": "enum",
10297
+ "enumValues": [
10298
+ "idle",
10299
+ "cleaning",
10300
+ "paused",
10301
+ "returning",
10302
+ "docked",
10303
+ "drying",
10304
+ "error"
10305
+ ]
10306
+ },
10307
+ {
10308
+ "path": "batteryLevel",
10309
+ "valueType": "number"
10310
+ },
10311
+ {
10312
+ "path": "fanSpeed",
10313
+ "valueType": "string"
10314
+ },
10315
+ {
10316
+ "path": "progressPercent",
10317
+ "valueType": "number"
10318
+ },
10319
+ {
10320
+ "path": "errorCode",
10321
+ "valueType": "number"
10322
+ },
10323
+ {
10324
+ "path": "errorLabel",
10325
+ "valueType": "string"
10326
+ }
10327
+ ],
10328
+ "valve": [{
10329
+ "path": "state",
10330
+ "valueType": "enum",
10331
+ "enumValues": [
10332
+ "open",
10333
+ "opening",
10334
+ "closing",
10335
+ "closed",
10336
+ "stopped"
10337
+ ]
10338
+ }, {
10339
+ "path": "position",
10340
+ "valueType": "number"
10341
+ }],
10342
+ "vibration": [{
10343
+ "path": "detected",
10344
+ "valueType": "boolean"
10345
+ }],
10346
+ "water-heater": [
10347
+ {
10348
+ "path": "currentTemp",
10349
+ "valueType": "number"
10350
+ },
10351
+ {
10352
+ "path": "targetTemp",
10353
+ "valueType": "number"
10354
+ },
10355
+ {
10356
+ "path": "operationMode",
10357
+ "valueType": "string"
10358
+ },
10359
+ {
10360
+ "path": "away",
10361
+ "valueType": "boolean"
10362
+ },
10363
+ {
10364
+ "path": "minTemp",
10365
+ "valueType": "number"
10366
+ },
10367
+ {
10368
+ "path": "maxTemp",
10369
+ "valueType": "number"
10370
+ }
10371
+ ],
10372
+ "weather": [
10373
+ {
10374
+ "path": "condition",
10375
+ "valueType": "string"
10376
+ },
10377
+ {
10378
+ "path": "temperature",
10379
+ "valueType": "number"
10380
+ },
10381
+ {
10382
+ "path": "temperatureUnit",
10383
+ "valueType": "string"
10384
+ },
10385
+ {
10386
+ "path": "humidity",
10387
+ "valueType": "number"
10388
+ },
10389
+ {
10390
+ "path": "pressure",
10391
+ "valueType": "number"
10392
+ },
10393
+ {
10394
+ "path": "pressureUnit",
10395
+ "valueType": "string"
10396
+ },
10397
+ {
10398
+ "path": "windSpeed",
10399
+ "valueType": "number"
10400
+ },
10401
+ {
10402
+ "path": "windSpeedUnit",
10403
+ "valueType": "string"
10404
+ },
10405
+ {
10406
+ "path": "windBearing",
10407
+ "valueType": "number"
10408
+ }
10409
+ ],
10410
+ "zone-analytics": [
10411
+ {
10412
+ "path": "ts",
10413
+ "valueType": "number"
10414
+ },
10415
+ {
10416
+ "path": "frameWidth",
10417
+ "valueType": "number"
10418
+ },
10419
+ {
10420
+ "path": "frameHeight",
10421
+ "valueType": "number"
10422
+ },
10423
+ {
10424
+ "path": "frame.totalObjects",
10425
+ "valueType": "number"
10426
+ },
10427
+ {
10428
+ "path": "frame.standingObjects",
10429
+ "valueType": "number"
10430
+ },
10431
+ {
10432
+ "path": "frame.transientObjects",
10433
+ "valueType": "number"
10434
+ },
10435
+ {
10436
+ "path": "unzoned.totalObjects",
10437
+ "valueType": "number"
10438
+ },
10439
+ {
10440
+ "path": "unzoned.standingObjects",
10441
+ "valueType": "number"
10442
+ },
10443
+ {
10444
+ "path": "unzoned.transientObjects",
10445
+ "valueType": "number"
10446
+ }
10447
+ ]
10448
+ });
8475
10449
  object({
8476
10450
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8477
10451
  params: record(string(), union([string(), number()])).optional()
@@ -8834,7 +10808,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8834
10808
  return DeviceRole;
8835
10809
  }({});
8836
10810
  //#endregion
8837
- //#region ../types/dist/composition-BJ8iAZb3.mjs
10811
+ //#region ../types/dist/composition-kEl9mevu.mjs
8838
10812
  /**
8839
10813
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8840
10814
  *
@@ -12087,7 +14061,7 @@ var LogChannelDescriptorSchema = object({
12087
14061
  * `true` is a PROMISE with two halves, and both must hold: the gate is
12088
14062
  * consulted with the numeric device id, AND every line the channel admits
12089
14063
  * carries `tags: { deviceId }` with that same numeric id. The second half is
12090
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
14064
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
12091
14065
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
12092
14066
  * the body is the only way to filter.
12093
14067
  *
@@ -12275,7 +14249,7 @@ var ModelVariantGroupSchema = object({
12275
14249
  precision: _enum(["fp32", "int8"]).optional(),
12276
14250
  /**
12277
14251
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12278
- * an alternate training of the same family (Scrypted `relu_test`); chip
14252
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
12279
14253
  * label is "Test".
12280
14254
  */
12281
14255
  optimization: _enum(["standard", "test"]).optional(),
@@ -12527,8 +14501,8 @@ var ModelCatalogEntrySchema = object({
12527
14501
  provider: ModelProviderIdSchema.optional(),
12528
14502
  /**
12529
14503
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
12530
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
12531
- * labels already ARE the CamStack macros (Scrypted identity map).
14504
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
14505
+ * labels already ARE the CamStack macros (plugin catalog identity map).
12532
14506
  */
12533
14507
  classMap: DetectionCatalogClassMapSchema.optional(),
12534
14508
  /**
@@ -15497,7 +17471,7 @@ method(object({
15497
17471
  * `1` is real time and is the ONLY value that allows the copy branch —
15498
17472
  * anything else forces `libx264` over the window. That was priced
15499
17473
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
15500
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
17474
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
15501
17475
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
15502
17476
  * once the decode is forced the width stops being free.
15503
17477
  */
@@ -16023,6 +17997,7 @@ var CompositionRunStatusSchema = _enum([
16023
17997
  "starting",
16024
17998
  "running",
16025
17999
  "degraded",
18000
+ "incomplete",
16026
18001
  "failed"
16027
18002
  ]);
16028
18003
  var CompositionFieldStateKindSchema = _enum([
@@ -16236,6 +18211,7 @@ var CoreBlockStatusSchema = _enum([
16236
18211
  "starting",
16237
18212
  "running",
16238
18213
  "degraded",
18214
+ "incomplete",
16239
18215
  "failed"
16240
18216
  ]);
16241
18217
  /** path → TypeScript source for a multi-file block. */
@@ -38383,7 +40359,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
38383
40359
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
38384
40360
  * operator's casing. The registry matches labels trimmed + case-insensitively
38385
40361
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
38386
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
40362
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
38387
40363
  * map keyed on the displayed casing would orphan its entry on exactly that
38388
40364
  * edit. Consumers join by keying their own label through `locationIconKey`.
38389
40365
  */
@@ -38408,7 +40384,7 @@ var LocationDescriptionAssignmentSchema = object({
38408
40384
  /**
38409
40385
  * A SITE ZONE — a named part of the property that several locations belong to.
38410
40386
  *
38411
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
40387
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
38412
40388
  * kitchen. A camera belongs to exactly one location, and a location to at most
38413
40389
  * one zone, so a camera's zone is derived and never stored on the device: the
38414
40390
  * whole point of this entity is that grouping rooms touches no device row.
@@ -38437,7 +40413,7 @@ var LocationDescriptionAssignmentSchema = object({
38437
40413
  * the locations inside it.
38438
40414
  *
38439
40415
  * The LABEL is carried alongside the key because the key is lossy on purpose —
38440
- * a surface must show "Zona notte", not "zona notte". Locations are carried
40416
+ * a surface must show "Night zone", not "night zone". Locations are carried
38441
40417
  * here, rather than left to a second call, because every consumer wants both
38442
40418
  * at once and a viewer that asked twice could render a zone whose membership
38443
40419
  * it has not fetched yet.
@@ -40631,8 +42607,8 @@ var LoadContributionSchema = object({
40631
42607
  "unattributable"
40632
42608
  ]),
40633
42609
  /**
40634
- * What ONE entry is, in the contributor's own words — `615/high`,
40635
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
42610
+ * What ONE entry is, in the contributor's own words — `101/high`,
42611
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
40636
42612
  * family and inventing a common one would lose the only information that
40637
42613
  * makes two entries for the same camera distinguishable.
40638
42614
  */
@@ -43636,7 +45612,7 @@ var NcConditionsSchema = object({
43636
45612
  * with the list under it is worse than no switch (D62).
43637
45613
  *
43638
45614
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
43639
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
45615
+ * renameable, and a rule authored on "Alice" went silently dark the moment
43640
45616
  * the operator fixed the spelling. The id reaches the record on
43641
45617
  * `LabelAttribution.identityId`; the name is what the editor shows and what
43642
45618
  * `{{label}}` renders.
@@ -44187,7 +46163,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
44187
46163
  * A rule scoped to one camera and one zone silently became a rule that
44188
46164
  * matches EVERY event on EVERY camera, and lost its `media` policy
44189
46165
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
44190
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
46166
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
44191
46167
  * within a minute of a two-field patch.
44192
46168
  *
44193
46169
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -46000,7 +47976,7 @@ var LabelAttributionSchema = object({
46000
47976
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
46001
47977
  *
46002
47978
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
46003
- * notification rule authored on "Gianluca" stopped matching the moment the
47979
+ * notification rule authored on "Alice" stopped matching the moment the
46004
47980
  * operator fixed the spelling in the gallery, and nothing said so. The id is
46005
47981
  * the thing that does not move, so it is what a rule matches on
46006
47982
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -48539,7 +50515,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
48539
50515
  /**
48540
50516
  * Root-supplied detections for the tree's ROOT step (D730). Set by
48541
50517
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
48542
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
50518
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
48543
50519
  * NOT inferred, these boxes are its output, and its children (the plate
48544
50520
  * reader) run on them through their own crop policy. Boxes are in the
48545
50521
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -50216,7 +52192,7 @@ var RunnerCameraConfigSchema = object({
50216
52192
  * detection session that asks for history. What shipped was a last-moment
50217
52193
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
50218
52194
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
50219
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
52195
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
50220
52196
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
50221
52197
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
50222
52198
  * was decoded, and was freed.
@@ -52350,7 +54326,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
52350
54326
  * The signals a device can emit to WAKE its own stream.
52351
54327
  *
52352
54328
  * A camera whose stream is built on demand sleeps until something asks for it,
52353
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
54329
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
52354
54330
  * puller holds a session open for ever, and treating that as demand would keep
52355
54331
  * a battery camera awake for ever, which is the whole thing the battery is for
52356
54332
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -53109,7 +55085,7 @@ var ClipSchema = object({
53109
55085
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
53110
55086
  *
53111
55087
  * Bounded because it is not a payload the surface pages through: one visit on
53112
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
55088
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
53113
55089
  * camera-day. Read {@link eventCount} for the true total.
53114
55090
  */
53115
55091
  eventIds: array(string()).optional(),
@@ -53254,7 +55230,7 @@ var ClipPlaybackSchema = object({
53254
55230
  * camera has no recordings", which is the defect this whole line of work is
53255
55231
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
53256
55232
  * reached at all (`unreachable`, also what a provider that THREW reports), a
53257
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
55233
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
53258
55234
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
53259
55235
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
53260
55236
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -53715,7 +55691,7 @@ var videoclipsCapability = {
53715
55691
  *
53716
55692
  * It was optional, documented as "absent means the device's BOUND
53717
55693
  * provider, which is CamStack on every camera". No code implemented
53718
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
55694
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
53719
55695
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
53720
55696
  * answered SIX rows, three from each source, merged newest-first:
53721
55697
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -55032,7 +57008,10 @@ var airQualitySensorCapability = {
55032
57008
  */
55033
57009
  var AmbientLightSensorStatusSchema = object({
55034
57010
  /** Current illuminance in lux (lx). */
55035
- lux: number().min(0),
57011
+ lux: number().min(0).meta({
57012
+ unit: "lx",
57013
+ label: "Illuminance"
57014
+ }),
55036
57015
  /** Ms epoch when the slice was last updated. */
55037
57016
  lastFetchedAt: number(),
55038
57017
  /** Live display unit from the upstream source (e.g. HA
@@ -55075,7 +57054,12 @@ var ambientLightSensorCapability = {
55075
57054
  } } },
55076
57055
  /** Clock fields: written, but excluded from the compare that decides
55077
57056
  * whether persisting is worth a SQLite commit. */
55078
- volatileStateFields: ["lastFetchedAt"]
57057
+ volatileStateFields: ["lastFetchedAt"],
57058
+ customize: {
57059
+ version: 1,
57060
+ advanced: "derive",
57061
+ targets: []
57062
+ }
55079
57063
  };
55080
57064
  /**
55081
57065
  * Per-class audio metrics aggregated over a sliding window.
@@ -55302,7 +57286,10 @@ var BatteryStatusSchema = object({
55302
57286
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
55303
57287
  * declines to band a non-finite reading, which is the correct shape.
55304
57288
  */
55305
- percentage: number().min(0).max(100).nullable(),
57289
+ percentage: number().min(0).max(100).nullable().meta({
57290
+ unit: "%",
57291
+ label: "Charge"
57292
+ }),
55306
57293
  /**
55307
57294
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
55308
57295
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -55321,13 +57308,13 @@ var BatteryStatusSchema = object({
55321
57308
  "solar",
55322
57309
  "none",
55323
57310
  "unknown"
55324
- ]),
57311
+ ]).meta({ label: "Charging source" }),
55325
57312
  /**
55326
57313
  * True when the camera firmware has gone into low-power mode. Battery
55327
57314
  * providers MUST avoid polling during sleep — reading the battery
55328
57315
  * wakes the camera up and drains charge.
55329
57316
  */
55330
- sleeping: boolean(),
57317
+ sleeping: boolean().meta({ label: "Sleeping" }),
55331
57318
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
55332
57319
  lastUpdated: number(),
55333
57320
  /**
@@ -55367,7 +57354,7 @@ var BatteryStatusSchema = object({
55367
57354
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
55368
57355
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
55369
57356
  */
55370
- binary: boolean().optional()
57357
+ binary: boolean().optional().meta({ label: "Binary indicator" })
55371
57358
  });
55372
57359
  var BATTERY_DEVICE_TYPES = [
55373
57360
  DeviceType.Camera,
@@ -55381,6 +57368,7 @@ var BATTERY_DEVICE_TYPES = [
55381
57368
  /** Generic Customize target for the percentage reading (D936). */
55382
57369
  var batteryCustomize = {
55383
57370
  version: 1,
57371
+ advanced: "derive",
55384
57372
  targets: [{
55385
57373
  id: "percentage",
55386
57374
  cardinality: "scalar",
@@ -55531,7 +57519,7 @@ onStatusChanged: { data: object({
55531
57519
  * with the right HomeKit / Alexa display category.
55532
57520
  */
55533
57521
  var BinaryStatusSchema = object({
55534
- on: boolean(),
57522
+ on: boolean().meta({ label: "On" }),
55535
57523
  /** Ms epoch of the last transition. 0 if never observed. */
55536
57524
  lastChangedAt: number()
55537
57525
  });
@@ -55560,7 +57548,12 @@ var binaryCapability = {
55560
57548
  history: { fields: { on: { kind: "boolean" } } },
55561
57549
  /** Clock fields: written, but excluded from the compare that decides
55562
57550
  * whether persisting is worth a SQLite commit. */
55563
- volatileStateFields: ["lastChangedAt"]
57551
+ volatileStateFields: ["lastChangedAt"],
57552
+ customize: {
57553
+ version: 1,
57554
+ advanced: "derive",
57555
+ targets: []
57556
+ }
55564
57557
  };
55565
57558
  /**
55566
57559
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -55866,7 +57859,7 @@ var GridLayoutCellSchema = object({
55866
57859
  *
55867
57860
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
55868
57861
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
55869
- * the sources, because "this grid has no low" is not a finding — "615 has no
57862
+ * the sources, because "this grid has no low" is not a finding — "101 has no
55870
57863
  * low" is, and it is the one an operator can act on.
55871
57864
  */
55872
57865
  var GridProfileOfferSchema = object({
@@ -57431,6 +59424,7 @@ var doorbellCustomize = {
57431
59424
  applyAuthority: { kind: "composition-claim" },
57432
59425
  eventName: "onPressed",
57433
59426
  edges: ["rising"],
59427
+ defaultEdge: "rising",
57434
59428
  timestampPath: "lastPressedAt",
57435
59429
  counterPath: "pressCountSinceStart",
57436
59430
  highWater: "composer-advance",
@@ -58384,7 +60378,10 @@ var humidifierCapability = {
58384
60378
  */
58385
60379
  var HumiditySensorStatusSchema = object({
58386
60380
  /** Current relative humidity, 0..100. */
58387
- percent: number().min(0).max(100),
60381
+ percent: number().min(0).max(100).meta({
60382
+ unit: "%",
60383
+ label: "Humidity"
60384
+ }),
58388
60385
  /** Ms epoch when the slice was last updated. */
58389
60386
  lastFetchedAt: number(),
58390
60387
  /** Live display unit from the upstream source (e.g. HA
@@ -58426,7 +60423,12 @@ var humiditySensorCapability = {
58426
60423
  } } },
58427
60424
  /** Clock fields: written, but excluded from the compare that decides
58428
60425
  * whether persisting is worth a SQLite commit. */
58429
- volatileStateFields: ["lastFetchedAt"]
60426
+ volatileStateFields: ["lastFetchedAt"],
60427
+ customize: {
60428
+ version: 1,
60429
+ advanced: "derive",
60430
+ targets: []
60431
+ }
58430
60432
  };
58431
60433
  /**
58432
60434
  * Image display cap. Models a single still image exposed by an integration —
@@ -62105,9 +64107,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
62105
64107
  */
62106
64108
  var PowerMeterStatusSchema = object({
62107
64109
  /** Instantaneous power draw in watts. */
62108
- watts: number().optional(),
64110
+ watts: number().optional().meta({
64111
+ unit: "W",
64112
+ label: "Power"
64113
+ }),
62109
64114
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
62110
- kwhTotal: number().optional(),
64115
+ kwhTotal: number().optional().meta({
64116
+ unit: "kWh",
64117
+ label: "Energy"
64118
+ }),
62111
64119
  /** Voltage in volts. */
62112
64120
  volts: number().optional(),
62113
64121
  /** Current in amperes. */
@@ -62192,7 +64200,12 @@ var powerMeterCapability = {
62192
64200
  } },
62193
64201
  /** Clock fields: written, but excluded from the compare that decides
62194
64202
  * whether persisting is worth a SQLite commit. */
62195
- volatileStateFields: ["lastFetchedAt"]
64203
+ volatileStateFields: ["lastFetchedAt"],
64204
+ customize: {
64205
+ version: 1,
64206
+ advanced: "derive",
64207
+ targets: []
64208
+ }
62196
64209
  };
62197
64210
  /**
62198
64211
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -62637,9 +64650,9 @@ var PtzOptionsSchema = object({
62637
64650
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
62638
64651
  * not one of the three cameras honours its own:
62639
64652
  *
62640
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
62641
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
62642
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
64653
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
64654
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
64655
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
62643
64656
  *
62644
64657
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
62645
64658
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -62972,7 +64985,7 @@ var RunningStateStatusSchema = object({
62972
64985
  running: boolean().nullable(),
62973
64986
  /** Epoch ms the current boolean began; null while `running` is null. */
62974
64987
  since: number().nullable(),
62975
- source: RunningStateSourceSchema,
64988
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
62976
64989
  phase: string().nullable(),
62977
64990
  /** null until a reading has been published (D393). */
62978
64991
  lastFetchedAt: number().nullable()
@@ -62986,6 +64999,7 @@ var RUNNING_DEVICE_TYPES = Object.values(DeviceType);
62986
64999
  /** Generic Customize target for the running boolean (D936). */
62987
65000
  var runningCustomize = {
62988
65001
  version: 1,
65002
+ advanced: "derive",
62989
65003
  targets: [{
62990
65004
  id: "running",
62991
65005
  cardinality: "scalar",
@@ -63021,6 +65035,7 @@ var runningCustomize = {
63021
65035
  requiredUnit: "W",
63022
65036
  transforms: [{
63023
65037
  kind: "threshold",
65038
+ comparisons: ["gte", "lte"],
63024
65039
  comparison: "gte",
63025
65040
  defaultThreshold: 5,
63026
65041
  defaultStartDwellMs: RUNNING_POWER_START_DELAY_MS,
@@ -63124,7 +65139,7 @@ var RecordingAvailabilitySchema = object({
63124
65139
  * would look identical. But the answer used to say nothing about that, so a
63125
65140
  * caller asking "what can I export?" read the single preferred profile as
63126
65141
  * the only one that exists — on this deployment every camera records `high`
63127
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
65142
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
63128
65143
  * UI could not see it.
63129
65144
  *
63130
65145
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -63223,7 +65238,7 @@ var RecordingSourceOptionsSchema = object({
63223
65238
  * `sparse` = gaps are the absence of one, and must be drawn as such.
63224
65239
  *
63225
65240
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
63226
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
65241
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
63227
65242
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
63228
65243
  coverage: _enum(["continuous", "sparse"]),
63229
65244
  /** Where the playhead may be put.
@@ -63299,7 +65314,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
63299
65314
  * merely discouraged (D554 amended).
63300
65315
  *
63301
65316
  * It was learned the expensive way on `videoclips.listClips`: measured
63302
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
65317
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
63303
65318
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
63304
65319
  * three from each source, merged — `device-collection-dispatch.ts`
63305
65320
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -63900,7 +65915,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
63900
65915
  * on a 10 h window holding 29,393 s of footage every range landed late by the
63901
65916
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
63902
65917
  * the video was a uniform timelapse, and the log line reported the five ranges
63903
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
65918
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
63904
65919
  *
63905
65920
  * Relative and not absolute epoch, because an absolute epoch would make every
63906
65921
  * call site responsible for the same subtraction.
@@ -64717,7 +66732,7 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
64717
66732
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
64718
66733
  * for the thing: a scene is a standing question about the property ("is the bin
64719
66734
  * still out"), and the operator's question is "which of my scenes have tripped",
64720
- * across every camera at once — not "what does camera 617 think". Buried one
66735
+ * across every camera at once — not "what does camera 102 think". Buried one
64721
66736
  * camera deep it also could not be found. The surface is now a top-level admin
64722
66737
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
64723
66738
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -65774,7 +67789,7 @@ function buildStreamParamsConfigSchema(options, status) {
65774
67789
  * `getSettingsUISchema()` surface.
65775
67790
  */
65776
67791
  var SwitchStatusSchema = object({
65777
- on: boolean(),
67792
+ on: boolean().meta({ label: "On" }),
65778
67793
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
65779
67794
  lastChangedAt: number()
65780
67795
  });
@@ -65833,7 +67848,12 @@ var switchCapability = {
65833
67848
  label: "On",
65834
67849
  kind: "boolean"
65835
67850
  }
65836
- }] }
67851
+ }] },
67852
+ customize: {
67853
+ version: 1,
67854
+ advanced: "derive",
67855
+ targets: []
67856
+ }
65837
67857
  };
65838
67858
  /** C0 controls, DEL and the C1 range: none of them belongs in a name. */
65839
67859
  function hasControlCharacter(value) {
@@ -66429,7 +68449,10 @@ var tamperCapability = {
66429
68449
  */
66430
68450
  var TemperatureSensorStatusSchema = object({
66431
68451
  /** Current temperature in Celsius. */
66432
- celsius: number(),
68452
+ celsius: number().meta({
68453
+ unit: "°C",
68454
+ label: "Temperature"
68455
+ }),
66433
68456
  /** Ms epoch when the slice was last updated (push or poll). */
66434
68457
  lastFetchedAt: number(),
66435
68458
  /** Live display unit from the upstream source (e.g. HA
@@ -66472,7 +68495,12 @@ var temperatureSensorCapability = {
66472
68495
  } } },
66473
68496
  /** Clock fields: written, but excluded from the compare that decides
66474
68497
  * whether persisting is worth a SQLite commit. */
66475
- volatileStateFields: ["lastFetchedAt"]
68498
+ volatileStateFields: ["lastFetchedAt"],
68499
+ customize: {
68500
+ version: 1,
68501
+ advanced: "derive",
68502
+ targets: []
68503
+ }
66476
68504
  };
66477
68505
  /**
66478
68506
  * toast — system-scoped singleton capability that streams toast
@@ -68151,6 +70179,10 @@ function withClipEventLabels(provider, deps) {
68151
70179
  };
68152
70180
  }
68153
70181
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
70182
+ 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;
70183
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
70184
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
70185
+ new Set(CAP_NAMES);
68154
70186
  Object.freeze({
68155
70187
  person: .5,
68156
70188
  vehicle: .5,
@@ -69384,7 +71416,7 @@ var BaseDeviceProvider = class extends BaseAddon {
69384
71416
  * A top-level persisted row with NO configuration is a leftover, not a
69385
71417
  * device — quarantine it instead of dialling it.
69386
71418
  *
69387
- * Device 614 was deleted, resurrected as a config-less shell by a write
71419
+ * Device 105 was deleted, resurrected as a config-less shell by a write
69388
71420
  * already in flight (D376), and then dialled at every single boot: eight
69389
71421
  * `Failed to restore device — bounded retry scheduled` lines in one day,
69390
71422
  * each one the same Zod refusal on `host` and `password`. The bound was
@@ -82636,7 +84668,7 @@ var SENSOR_CAP_VOCABULARY = {
82636
84668
  state: [{
82637
84669
  kind: "boolean",
82638
84670
  field: "on",
82639
- label: t("Active", "Attivo"),
84671
+ label: t("On", "Acceso"),
82640
84672
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
82641
84673
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
82642
84674
  icon: "toggle-right"
@@ -86266,7 +88298,6 @@ Object.freeze({
86266
88298
  "smtp-provider": "email"
86267
88299
  });
86268
88300
  DeviceType.Camera;
86269
- 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;
86270
88301
  /**
86271
88302
  * A saved Customize assignment (D936). The schema is the type: callers use
86272
88303
  * `z.infer`, they do not restate the shape.
@@ -86323,6 +88354,11 @@ var PulseOverrideDraftSchema = object({
86323
88354
  targetId: string().min(1),
86324
88355
  enabled: boolean(),
86325
88356
  debounceMs: number().nonnegative(),
88357
+ edges: array(_enum([
88358
+ "rising",
88359
+ "button",
88360
+ "native-event"
88361
+ ])).min(1).optional(),
86326
88362
  sources: array(OverrideSourceSchema).min(1)
86327
88363
  });
86328
88364
  var SpanSourceDraftSchema = OverrideSourceSchema.extend({ mode: _enum([
@@ -86355,7 +88391,6 @@ object({
86355
88391
  ]),
86356
88392
  reason: string().nullable()
86357
88393
  });
86358
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
86359
88394
  var G711_SCALE_CORRECTION_DB = {
86360
88395
  PCMU: 20 * Math.log10(4),
86361
88396
  PCMA: 20 * Math.log10(8)
@@ -86728,7 +88763,7 @@ var STATE_SUMMARY_SECTION_VARS = [
86728
88763
  {
86729
88764
  name: "summaryStreams",
86730
88765
  label: "Summary: streams offline",
86731
- example: "Ingresso (high) — since 06:40",
88766
+ example: "Front door (high) — since 06:40",
86732
88767
  kinds: ["stream-offline", "stream-online"]
86733
88768
  },
86734
88769
  {
@@ -86746,13 +88781,13 @@ var STATE_SUMMARY_SECTION_VARS = [
86746
88781
  {
86747
88782
  name: "summaryDetection",
86748
88783
  label: "Summary: cameras detecting nothing",
86749
- example: "Ingresso — since 05:10",
88784
+ example: "Front door — since 05:10",
86750
88785
  kinds: ["detection-blind"]
86751
88786
  },
86752
88787
  {
86753
88788
  name: "summaryNodes",
86754
88789
  label: "Summary: nodes",
86755
- example: "little-unraid — offline since 03:00",
88790
+ example: "agent-a — offline since 03:00",
86756
88791
  kinds: [
86757
88792
  "node-offline",
86758
88793
  "node-online",
@@ -89557,7 +91592,7 @@ var amcrestCameraSchema = object({
89557
91592
  *
89558
91593
  * Empty = nothing configured, and `goHome` then REFUSES. It used to go to a
89559
91594
  * hardcoded slot on a vendor "convention" this fleet contradicts: reolink
89560
- * went to preset 0, which on device 592 holds "stanza"; amcrest went to
91595
+ * went to preset 0, which on device 107 holds "stanza"; amcrest went to
89561
91596
  * preset 1, which on device 3836 holds "Preset1". Both swallowed the failure
89562
91597
  * in a bare catch, so a head that never moved was indistinguishable from a
89563
91598
  * head that went home.