@camstack/addon-provider-bosch 0.1.21 → 0.1.23
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/{account-integration-offline-CEg0JOfN.js → account-integration-offline-BaRX_382.js} +1 -1
- package/dist/{account-integration-offline-Ciq9CZa-.mjs → account-integration-offline-D_Vc_igI.mjs} +1 -1
- package/dist/{dist-CFPbdUpa.js → dist-BMDfX7xM.js} +3013 -156
- package/dist/{dist-D9i3id5N.mjs → dist-D4l9YngQ.mjs} +3008 -157
- package/dist/home-connect/addon.js +8 -17
- package/dist/home-connect/addon.mjs +8 -17
- package/dist/homecom/addon.js +2 -2
- package/dist/homecom/addon.mjs +2 -2
- package/dist/shc/addon.js +2 -2
- package/dist/shc/addon.mjs +2 -2
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("node:crypto");
|
|
2
|
-
//#region ../types/dist/event-category-
|
|
2
|
+
//#region ../types/dist/event-category-DHXxB8t9.mjs
|
|
3
3
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4
4
|
EventCategory["SystemBoot"] = "system.boot";
|
|
5
5
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -295,7 +295,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
295
295
|
* TRANSITION into that state (never per dispatch), and the node is dropped
|
|
296
296
|
* from the placement candidate set for as long as it holds.
|
|
297
297
|
*
|
|
298
|
-
* This exists because the state was previously invisible:
|
|
298
|
+
* This exists because the state was previously invisible: agent-a
|
|
299
299
|
* absorbed 283k inference errors in a day while still being handed cameras,
|
|
300
300
|
* and nothing in the system said so.
|
|
301
301
|
*
|
|
@@ -5434,7 +5434,7 @@ var ZodIssueCode = {
|
|
|
5434
5434
|
var ZodFirstPartyTypeKind;
|
|
5435
5435
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5436
5436
|
//#endregion
|
|
5437
|
-
//#region ../types/dist/sleep-
|
|
5437
|
+
//#region ../types/dist/sleep-BErAxhul.mjs
|
|
5438
5438
|
/**
|
|
5439
5439
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5440
5440
|
* window to float samples (D455).
|
|
@@ -8483,6 +8483,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
|
|
|
8483
8483
|
kind: "mutation",
|
|
8484
8484
|
auth: "admin"
|
|
8485
8485
|
}), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
|
|
8486
|
+
Object.freeze({ "doorbell": "lastPressedAt" });
|
|
8487
|
+
/** Every capability name, so addon code can check a name without the schema graph. */
|
|
8488
|
+
var CAP_NAMES = Object.freeze([
|
|
8489
|
+
"accessories",
|
|
8490
|
+
"addon-pages",
|
|
8491
|
+
"addon-pages-source",
|
|
8492
|
+
"addon-routes",
|
|
8493
|
+
"addon-settings",
|
|
8494
|
+
"addon-widgets",
|
|
8495
|
+
"addon-widgets-source",
|
|
8496
|
+
"addons",
|
|
8497
|
+
"admin-ui",
|
|
8498
|
+
"air-quality-sensor",
|
|
8499
|
+
"alarm-panel",
|
|
8500
|
+
"alerts",
|
|
8501
|
+
"ambient-light-sensor",
|
|
8502
|
+
"audio-analysis",
|
|
8503
|
+
"audio-analyzer",
|
|
8504
|
+
"audio-codec",
|
|
8505
|
+
"audio-metrics",
|
|
8506
|
+
"auth-provider",
|
|
8507
|
+
"automation-control",
|
|
8508
|
+
"backup",
|
|
8509
|
+
"battery",
|
|
8510
|
+
"binary",
|
|
8511
|
+
"brightness",
|
|
8512
|
+
"broker",
|
|
8513
|
+
"button",
|
|
8514
|
+
"calendar-source",
|
|
8515
|
+
"calendars",
|
|
8516
|
+
"camera-credentials",
|
|
8517
|
+
"camera-grid-layout",
|
|
8518
|
+
"camera-pipeline-config",
|
|
8519
|
+
"camera-streams",
|
|
8520
|
+
"carbon-monoxide",
|
|
8521
|
+
"climate-control",
|
|
8522
|
+
"color",
|
|
8523
|
+
"composer",
|
|
8524
|
+
"connection-test",
|
|
8525
|
+
"connectivity",
|
|
8526
|
+
"consumables",
|
|
8527
|
+
"contact",
|
|
8528
|
+
"control",
|
|
8529
|
+
"core-blocks",
|
|
8530
|
+
"cover",
|
|
8531
|
+
"custom-model-registry",
|
|
8532
|
+
"data-store-provider",
|
|
8533
|
+
"database-snapshot",
|
|
8534
|
+
"day-night",
|
|
8535
|
+
"decoder",
|
|
8536
|
+
"detection-pipeline",
|
|
8537
|
+
"device-admin-link",
|
|
8538
|
+
"device-adoption",
|
|
8539
|
+
"device-credentials",
|
|
8540
|
+
"device-discovery",
|
|
8541
|
+
"device-export",
|
|
8542
|
+
"device-extension",
|
|
8543
|
+
"device-history",
|
|
8544
|
+
"device-manager",
|
|
8545
|
+
"device-ops",
|
|
8546
|
+
"device-provider",
|
|
8547
|
+
"device-removal-hook",
|
|
8548
|
+
"device-state",
|
|
8549
|
+
"device-status",
|
|
8550
|
+
"dishwasher",
|
|
8551
|
+
"display-palette",
|
|
8552
|
+
"doorbell",
|
|
8553
|
+
"embedding-encoder",
|
|
8554
|
+
"enum-sensor",
|
|
8555
|
+
"event-emitter",
|
|
8556
|
+
"face-gallery",
|
|
8557
|
+
"failure-contribution",
|
|
8558
|
+
"fan-control",
|
|
8559
|
+
"feature-probe",
|
|
8560
|
+
"filesystem-browse",
|
|
8561
|
+
"flood",
|
|
8562
|
+
"gas",
|
|
8563
|
+
"heating-valve",
|
|
8564
|
+
"humidifier",
|
|
8565
|
+
"humidity-sensor",
|
|
8566
|
+
"image",
|
|
8567
|
+
"image-settings",
|
|
8568
|
+
"integrations",
|
|
8569
|
+
"intercom",
|
|
8570
|
+
"keychain",
|
|
8571
|
+
"keychain-admin",
|
|
8572
|
+
"lawn-mower-control",
|
|
8573
|
+
"llm",
|
|
8574
|
+
"llm-runtime",
|
|
8575
|
+
"load-contribution",
|
|
8576
|
+
"local-network",
|
|
8577
|
+
"lock-control",
|
|
8578
|
+
"log-channels",
|
|
8579
|
+
"log-destination",
|
|
8580
|
+
"login-method",
|
|
8581
|
+
"media-player",
|
|
8582
|
+
"mesh-network",
|
|
8583
|
+
"metrics-provider",
|
|
8584
|
+
"model-convert",
|
|
8585
|
+
"model-distributor",
|
|
8586
|
+
"motion",
|
|
8587
|
+
"motion-detection",
|
|
8588
|
+
"motion-trigger",
|
|
8589
|
+
"motion-zones",
|
|
8590
|
+
"mqtt-broker",
|
|
8591
|
+
"native-object-detection",
|
|
8592
|
+
"navigation",
|
|
8593
|
+
"network-access",
|
|
8594
|
+
"network-link",
|
|
8595
|
+
"network-quality",
|
|
8596
|
+
"node-certificates",
|
|
8597
|
+
"nodes",
|
|
8598
|
+
"notification-output",
|
|
8599
|
+
"notification-rules",
|
|
8600
|
+
"notifier",
|
|
8601
|
+
"numeric-sensor",
|
|
8602
|
+
"oauth-integration",
|
|
8603
|
+
"oidc-connections",
|
|
8604
|
+
"osd",
|
|
8605
|
+
"osd-manager",
|
|
8606
|
+
"pet-feeder",
|
|
8607
|
+
"pipeline-analytics",
|
|
8608
|
+
"pipeline-executor",
|
|
8609
|
+
"pipeline-orchestrator",
|
|
8610
|
+
"pipeline-runner",
|
|
8611
|
+
"plate-gallery",
|
|
8612
|
+
"platform-probe",
|
|
8613
|
+
"power-meter",
|
|
8614
|
+
"presence",
|
|
8615
|
+
"pressure-sensor",
|
|
8616
|
+
"privacy-mask",
|
|
8617
|
+
"ptz",
|
|
8618
|
+
"ptz-autotrack",
|
|
8619
|
+
"reboot",
|
|
8620
|
+
"record-entries",
|
|
8621
|
+
"recording",
|
|
8622
|
+
"recording-archive",
|
|
8623
|
+
"recording-export",
|
|
8624
|
+
"recording-onboard",
|
|
8625
|
+
"recording-signal",
|
|
8626
|
+
"records",
|
|
8627
|
+
"running-state",
|
|
8628
|
+
"scene-monitor",
|
|
8629
|
+
"script-runner",
|
|
8630
|
+
"server-management",
|
|
8631
|
+
"settings-store",
|
|
8632
|
+
"smoke",
|
|
8633
|
+
"smtp-provider",
|
|
8634
|
+
"snapshot",
|
|
8635
|
+
"sso-bridge",
|
|
8636
|
+
"storage",
|
|
8637
|
+
"storage-admin",
|
|
8638
|
+
"storage-evictable",
|
|
8639
|
+
"storage-migration",
|
|
8640
|
+
"storage-occupancy",
|
|
8641
|
+
"storage-provider",
|
|
8642
|
+
"stream-broker",
|
|
8643
|
+
"stream-catalog",
|
|
8644
|
+
"stream-params",
|
|
8645
|
+
"stream-signals",
|
|
8646
|
+
"switch",
|
|
8647
|
+
"system",
|
|
8648
|
+
"tamper",
|
|
8649
|
+
"temperature-sensor",
|
|
8650
|
+
"terminal-session",
|
|
8651
|
+
"toast",
|
|
8652
|
+
"training",
|
|
8653
|
+
"training-provider",
|
|
8654
|
+
"turn-provider",
|
|
8655
|
+
"update",
|
|
8656
|
+
"user-management",
|
|
8657
|
+
"user-passkeys",
|
|
8658
|
+
"vacuum-control",
|
|
8659
|
+
"valve",
|
|
8660
|
+
"vector-store",
|
|
8661
|
+
"vibration",
|
|
8662
|
+
"videoclips",
|
|
8663
|
+
"viewer-ui",
|
|
8664
|
+
"water-heater",
|
|
8665
|
+
"weather",
|
|
8666
|
+
"webrtc-session",
|
|
8667
|
+
"zone-analytics",
|
|
8668
|
+
"zone-rules",
|
|
8669
|
+
"zones"
|
|
8670
|
+
]);
|
|
8671
|
+
Object.freeze({
|
|
8672
|
+
"air-quality-sensor": [
|
|
8673
|
+
{
|
|
8674
|
+
"path": "co2Ppm",
|
|
8675
|
+
"valueType": "number"
|
|
8676
|
+
},
|
|
8677
|
+
{
|
|
8678
|
+
"path": "vocPpb",
|
|
8679
|
+
"valueType": "number"
|
|
8680
|
+
},
|
|
8681
|
+
{
|
|
8682
|
+
"path": "pm25",
|
|
8683
|
+
"valueType": "number"
|
|
8684
|
+
},
|
|
8685
|
+
{
|
|
8686
|
+
"path": "pm10",
|
|
8687
|
+
"valueType": "number"
|
|
8688
|
+
},
|
|
8689
|
+
{
|
|
8690
|
+
"path": "aqi",
|
|
8691
|
+
"valueType": "number"
|
|
8692
|
+
},
|
|
8693
|
+
{
|
|
8694
|
+
"path": "unit",
|
|
8695
|
+
"valueType": "string"
|
|
8696
|
+
},
|
|
8697
|
+
{
|
|
8698
|
+
"path": "precision",
|
|
8699
|
+
"valueType": "number"
|
|
8700
|
+
}
|
|
8701
|
+
],
|
|
8702
|
+
"alarm-panel": [
|
|
8703
|
+
{
|
|
8704
|
+
"path": "state",
|
|
8705
|
+
"valueType": "enum",
|
|
8706
|
+
"enumValues": [
|
|
8707
|
+
"disarmed",
|
|
8708
|
+
"armed_home",
|
|
8709
|
+
"armed_away",
|
|
8710
|
+
"armed_night",
|
|
8711
|
+
"armed_vacation",
|
|
8712
|
+
"armed_custom_bypass",
|
|
8713
|
+
"arming",
|
|
8714
|
+
"disarming",
|
|
8715
|
+
"pending",
|
|
8716
|
+
"triggered"
|
|
8717
|
+
]
|
|
8718
|
+
},
|
|
8719
|
+
{
|
|
8720
|
+
"path": "targetMode",
|
|
8721
|
+
"valueType": "enum",
|
|
8722
|
+
"enumValues": [
|
|
8723
|
+
"home",
|
|
8724
|
+
"away",
|
|
8725
|
+
"night",
|
|
8726
|
+
"vacation",
|
|
8727
|
+
"custom_bypass"
|
|
8728
|
+
]
|
|
8729
|
+
},
|
|
8730
|
+
{
|
|
8731
|
+
"path": "requiresCode",
|
|
8732
|
+
"valueType": "boolean"
|
|
8733
|
+
}
|
|
8734
|
+
],
|
|
8735
|
+
"ambient-light-sensor": [
|
|
8736
|
+
{
|
|
8737
|
+
"path": "lux",
|
|
8738
|
+
"valueType": "number"
|
|
8739
|
+
},
|
|
8740
|
+
{
|
|
8741
|
+
"path": "unit",
|
|
8742
|
+
"valueType": "string"
|
|
8743
|
+
},
|
|
8744
|
+
{
|
|
8745
|
+
"path": "precision",
|
|
8746
|
+
"valueType": "number"
|
|
8747
|
+
}
|
|
8748
|
+
],
|
|
8749
|
+
"audio-metrics": [
|
|
8750
|
+
{
|
|
8751
|
+
"path": "ts",
|
|
8752
|
+
"valueType": "number"
|
|
8753
|
+
},
|
|
8754
|
+
{
|
|
8755
|
+
"path": "windowSec",
|
|
8756
|
+
"valueType": "number"
|
|
8757
|
+
},
|
|
8758
|
+
{
|
|
8759
|
+
"path": "level.rms",
|
|
8760
|
+
"valueType": "number"
|
|
8761
|
+
},
|
|
8762
|
+
{
|
|
8763
|
+
"path": "level.dbfs",
|
|
8764
|
+
"valueType": "number"
|
|
8765
|
+
},
|
|
8766
|
+
{
|
|
8767
|
+
"path": "peakDbfs",
|
|
8768
|
+
"valueType": "number"
|
|
8769
|
+
},
|
|
8770
|
+
{
|
|
8771
|
+
"path": "avgDbfs",
|
|
8772
|
+
"valueType": "number"
|
|
8773
|
+
},
|
|
8774
|
+
{
|
|
8775
|
+
"path": "current.className",
|
|
8776
|
+
"valueType": "string"
|
|
8777
|
+
},
|
|
8778
|
+
{
|
|
8779
|
+
"path": "current.score",
|
|
8780
|
+
"valueType": "number"
|
|
8781
|
+
},
|
|
8782
|
+
{
|
|
8783
|
+
"path": "current.timestamp",
|
|
8784
|
+
"valueType": "number"
|
|
8785
|
+
}
|
|
8786
|
+
],
|
|
8787
|
+
"automation-control": [
|
|
8788
|
+
{
|
|
8789
|
+
"path": "enabled",
|
|
8790
|
+
"valueType": "boolean"
|
|
8791
|
+
},
|
|
8792
|
+
{
|
|
8793
|
+
"path": "isRunning",
|
|
8794
|
+
"valueType": "boolean"
|
|
8795
|
+
},
|
|
8796
|
+
{
|
|
8797
|
+
"path": "lastTriggeredAt",
|
|
8798
|
+
"valueType": "number"
|
|
8799
|
+
},
|
|
8800
|
+
{
|
|
8801
|
+
"path": "lastError",
|
|
8802
|
+
"valueType": "string"
|
|
8803
|
+
}
|
|
8804
|
+
],
|
|
8805
|
+
"battery": [
|
|
8806
|
+
{
|
|
8807
|
+
"path": "percentage",
|
|
8808
|
+
"valueType": "number"
|
|
8809
|
+
},
|
|
8810
|
+
{
|
|
8811
|
+
"path": "charging",
|
|
8812
|
+
"valueType": "enum",
|
|
8813
|
+
"enumValues": [
|
|
8814
|
+
"dc",
|
|
8815
|
+
"solar",
|
|
8816
|
+
"none",
|
|
8817
|
+
"unknown"
|
|
8818
|
+
]
|
|
8819
|
+
},
|
|
8820
|
+
{
|
|
8821
|
+
"path": "sleeping",
|
|
8822
|
+
"valueType": "boolean"
|
|
8823
|
+
},
|
|
8824
|
+
{
|
|
8825
|
+
"path": "lastUpdated",
|
|
8826
|
+
"valueType": "number"
|
|
8827
|
+
},
|
|
8828
|
+
{
|
|
8829
|
+
"path": "lastContactAt",
|
|
8830
|
+
"valueType": "number"
|
|
8831
|
+
},
|
|
8832
|
+
{
|
|
8833
|
+
"path": "lastFullRefreshAt",
|
|
8834
|
+
"valueType": "number"
|
|
8835
|
+
},
|
|
8836
|
+
{
|
|
8837
|
+
"path": "binary",
|
|
8838
|
+
"valueType": "boolean"
|
|
8839
|
+
}
|
|
8840
|
+
],
|
|
8841
|
+
"binary": [{
|
|
8842
|
+
"path": "on",
|
|
8843
|
+
"valueType": "boolean"
|
|
8844
|
+
}],
|
|
8845
|
+
"brightness": [{
|
|
8846
|
+
"path": "percentage",
|
|
8847
|
+
"valueType": "number"
|
|
8848
|
+
}],
|
|
8849
|
+
"broker": [{
|
|
8850
|
+
"path": "brokerCount",
|
|
8851
|
+
"valueType": "number"
|
|
8852
|
+
}, {
|
|
8853
|
+
"path": "connectedCount",
|
|
8854
|
+
"valueType": "number"
|
|
8855
|
+
}],
|
|
8856
|
+
"camera-credentials": [
|
|
8857
|
+
{
|
|
8858
|
+
"path": "host",
|
|
8859
|
+
"valueType": "string"
|
|
8860
|
+
},
|
|
8861
|
+
{
|
|
8862
|
+
"path": "port",
|
|
8863
|
+
"valueType": "number"
|
|
8864
|
+
},
|
|
8865
|
+
{
|
|
8866
|
+
"path": "onvifPort",
|
|
8867
|
+
"valueType": "number"
|
|
8868
|
+
},
|
|
8869
|
+
{
|
|
8870
|
+
"path": "rtspPort",
|
|
8871
|
+
"valueType": "number"
|
|
8872
|
+
},
|
|
8873
|
+
{
|
|
8874
|
+
"path": "https",
|
|
8875
|
+
"valueType": "boolean"
|
|
8876
|
+
},
|
|
8877
|
+
{
|
|
8878
|
+
"path": "hasUsername",
|
|
8879
|
+
"valueType": "boolean"
|
|
8880
|
+
},
|
|
8881
|
+
{
|
|
8882
|
+
"path": "hasPassword",
|
|
8883
|
+
"valueType": "boolean"
|
|
8884
|
+
},
|
|
8885
|
+
{
|
|
8886
|
+
"path": "onvifProfile",
|
|
8887
|
+
"valueType": "string"
|
|
8888
|
+
}
|
|
8889
|
+
],
|
|
8890
|
+
"camera-streams": [
|
|
8891
|
+
{
|
|
8892
|
+
"path": "online",
|
|
8893
|
+
"valueType": "boolean"
|
|
8894
|
+
},
|
|
8895
|
+
{
|
|
8896
|
+
"path": "slotStatuses.high",
|
|
8897
|
+
"valueType": "enum",
|
|
8898
|
+
"enumValues": [
|
|
8899
|
+
"unassigned",
|
|
8900
|
+
"idle",
|
|
8901
|
+
"connecting",
|
|
8902
|
+
"streaming",
|
|
8903
|
+
"error"
|
|
8904
|
+
]
|
|
8905
|
+
},
|
|
8906
|
+
{
|
|
8907
|
+
"path": "slotStatuses.mid",
|
|
8908
|
+
"valueType": "enum",
|
|
8909
|
+
"enumValues": [
|
|
8910
|
+
"unassigned",
|
|
8911
|
+
"idle",
|
|
8912
|
+
"connecting",
|
|
8913
|
+
"streaming",
|
|
8914
|
+
"error"
|
|
8915
|
+
]
|
|
8916
|
+
},
|
|
8917
|
+
{
|
|
8918
|
+
"path": "slotStatuses.low",
|
|
8919
|
+
"valueType": "enum",
|
|
8920
|
+
"enumValues": [
|
|
8921
|
+
"unassigned",
|
|
8922
|
+
"idle",
|
|
8923
|
+
"connecting",
|
|
8924
|
+
"streaming",
|
|
8925
|
+
"error"
|
|
8926
|
+
]
|
|
8927
|
+
},
|
|
8928
|
+
{
|
|
8929
|
+
"path": "slotErrors.high",
|
|
8930
|
+
"valueType": "string"
|
|
8931
|
+
},
|
|
8932
|
+
{
|
|
8933
|
+
"path": "slotErrors.mid",
|
|
8934
|
+
"valueType": "string"
|
|
8935
|
+
},
|
|
8936
|
+
{
|
|
8937
|
+
"path": "slotErrors.low",
|
|
8938
|
+
"valueType": "string"
|
|
8939
|
+
}
|
|
8940
|
+
],
|
|
8941
|
+
"carbon-monoxide": [{
|
|
8942
|
+
"path": "detected",
|
|
8943
|
+
"valueType": "boolean"
|
|
8944
|
+
}],
|
|
8945
|
+
"climate-control": [
|
|
8946
|
+
{
|
|
8947
|
+
"path": "mode",
|
|
8948
|
+
"valueType": "enum",
|
|
8949
|
+
"enumValues": [
|
|
8950
|
+
"off",
|
|
8951
|
+
"heat",
|
|
8952
|
+
"cool",
|
|
8953
|
+
"auto",
|
|
8954
|
+
"heat_cool",
|
|
8955
|
+
"fan_only",
|
|
8956
|
+
"dry"
|
|
8957
|
+
]
|
|
8958
|
+
},
|
|
8959
|
+
{
|
|
8960
|
+
"path": "fanMode",
|
|
8961
|
+
"valueType": "string"
|
|
8962
|
+
},
|
|
8963
|
+
{
|
|
8964
|
+
"path": "preset",
|
|
8965
|
+
"valueType": "string"
|
|
8966
|
+
},
|
|
8967
|
+
{
|
|
8968
|
+
"path": "target",
|
|
8969
|
+
"valueType": "number"
|
|
8970
|
+
},
|
|
8971
|
+
{
|
|
8972
|
+
"path": "targetHigh",
|
|
8973
|
+
"valueType": "number"
|
|
8974
|
+
},
|
|
8975
|
+
{
|
|
8976
|
+
"path": "targetLow",
|
|
8977
|
+
"valueType": "number"
|
|
8978
|
+
},
|
|
8979
|
+
{
|
|
8980
|
+
"path": "targetHumidity",
|
|
8981
|
+
"valueType": "number"
|
|
8982
|
+
},
|
|
8983
|
+
{
|
|
8984
|
+
"path": "currentTemp",
|
|
8985
|
+
"valueType": "number"
|
|
8986
|
+
},
|
|
8987
|
+
{
|
|
8988
|
+
"path": "currentHumidity",
|
|
8989
|
+
"valueType": "number"
|
|
8990
|
+
},
|
|
8991
|
+
{
|
|
8992
|
+
"path": "swingVertical",
|
|
8993
|
+
"valueType": "boolean"
|
|
8994
|
+
},
|
|
8995
|
+
{
|
|
8996
|
+
"path": "swingHorizontal",
|
|
8997
|
+
"valueType": "boolean"
|
|
8998
|
+
},
|
|
8999
|
+
{
|
|
9000
|
+
"path": "minTemp",
|
|
9001
|
+
"valueType": "number"
|
|
9002
|
+
},
|
|
9003
|
+
{
|
|
9004
|
+
"path": "maxTemp",
|
|
9005
|
+
"valueType": "number"
|
|
9006
|
+
},
|
|
9007
|
+
{
|
|
9008
|
+
"path": "tempStep",
|
|
9009
|
+
"valueType": "number"
|
|
9010
|
+
}
|
|
9011
|
+
],
|
|
9012
|
+
"color": [
|
|
9013
|
+
{
|
|
9014
|
+
"path": "mode",
|
|
9015
|
+
"valueType": "enum",
|
|
9016
|
+
"enumValues": [
|
|
9017
|
+
"rgb",
|
|
9018
|
+
"hsv",
|
|
9019
|
+
"mired"
|
|
9020
|
+
]
|
|
9021
|
+
},
|
|
9022
|
+
{
|
|
9023
|
+
"path": "rgb.r",
|
|
9024
|
+
"valueType": "number"
|
|
9025
|
+
},
|
|
9026
|
+
{
|
|
9027
|
+
"path": "rgb.g",
|
|
9028
|
+
"valueType": "number"
|
|
9029
|
+
},
|
|
9030
|
+
{
|
|
9031
|
+
"path": "rgb.b",
|
|
9032
|
+
"valueType": "number"
|
|
9033
|
+
},
|
|
9034
|
+
{
|
|
9035
|
+
"path": "hsv.h",
|
|
9036
|
+
"valueType": "number"
|
|
9037
|
+
},
|
|
9038
|
+
{
|
|
9039
|
+
"path": "hsv.s",
|
|
9040
|
+
"valueType": "number"
|
|
9041
|
+
},
|
|
9042
|
+
{
|
|
9043
|
+
"path": "hsv.v",
|
|
9044
|
+
"valueType": "number"
|
|
9045
|
+
},
|
|
9046
|
+
{
|
|
9047
|
+
"path": "mireds",
|
|
9048
|
+
"valueType": "number"
|
|
9049
|
+
}
|
|
9050
|
+
],
|
|
9051
|
+
"connectivity": [{
|
|
9052
|
+
"path": "connected",
|
|
9053
|
+
"valueType": "boolean"
|
|
9054
|
+
}],
|
|
9055
|
+
"contact": [{
|
|
9056
|
+
"path": "entryOpen",
|
|
9057
|
+
"valueType": "boolean"
|
|
9058
|
+
}],
|
|
9059
|
+
"control": [
|
|
9060
|
+
{
|
|
9061
|
+
"path": "kind",
|
|
9062
|
+
"valueType": "enum",
|
|
9063
|
+
"enumValues": [
|
|
9064
|
+
"numeric",
|
|
9065
|
+
"select",
|
|
9066
|
+
"text",
|
|
9067
|
+
"datetime"
|
|
9068
|
+
]
|
|
9069
|
+
},
|
|
9070
|
+
{
|
|
9071
|
+
"path": "unit",
|
|
9072
|
+
"valueType": "string"
|
|
9073
|
+
},
|
|
9074
|
+
{
|
|
9075
|
+
"path": "min",
|
|
9076
|
+
"valueType": "number"
|
|
9077
|
+
},
|
|
9078
|
+
{
|
|
9079
|
+
"path": "max",
|
|
9080
|
+
"valueType": "number"
|
|
9081
|
+
},
|
|
9082
|
+
{
|
|
9083
|
+
"path": "step",
|
|
9084
|
+
"valueType": "number"
|
|
9085
|
+
},
|
|
9086
|
+
{
|
|
9087
|
+
"path": "precision",
|
|
9088
|
+
"valueType": "number"
|
|
9089
|
+
},
|
|
9090
|
+
{
|
|
9091
|
+
"path": "format",
|
|
9092
|
+
"valueType": "enum",
|
|
9093
|
+
"enumValues": [
|
|
9094
|
+
"date",
|
|
9095
|
+
"time",
|
|
9096
|
+
"datetime"
|
|
9097
|
+
]
|
|
9098
|
+
}
|
|
9099
|
+
],
|
|
9100
|
+
"cover": [
|
|
9101
|
+
{
|
|
9102
|
+
"path": "state",
|
|
9103
|
+
"valueType": "enum",
|
|
9104
|
+
"enumValues": [
|
|
9105
|
+
"open",
|
|
9106
|
+
"opening",
|
|
9107
|
+
"closing",
|
|
9108
|
+
"closed",
|
|
9109
|
+
"stopped"
|
|
9110
|
+
]
|
|
9111
|
+
},
|
|
9112
|
+
{
|
|
9113
|
+
"path": "position",
|
|
9114
|
+
"valueType": "number"
|
|
9115
|
+
},
|
|
9116
|
+
{
|
|
9117
|
+
"path": "tiltPosition",
|
|
9118
|
+
"valueType": "number"
|
|
9119
|
+
}
|
|
9120
|
+
],
|
|
9121
|
+
"day-night": [
|
|
9122
|
+
{
|
|
9123
|
+
"path": "mode",
|
|
9124
|
+
"valueType": "enum",
|
|
9125
|
+
"enumValues": [
|
|
9126
|
+
"auto",
|
|
9127
|
+
"day",
|
|
9128
|
+
"night",
|
|
9129
|
+
"schedule"
|
|
9130
|
+
]
|
|
9131
|
+
},
|
|
9132
|
+
{
|
|
9133
|
+
"path": "sensitivity",
|
|
9134
|
+
"valueType": "number"
|
|
9135
|
+
},
|
|
9136
|
+
{
|
|
9137
|
+
"path": "switchDelaySec",
|
|
9138
|
+
"valueType": "number"
|
|
9139
|
+
}
|
|
9140
|
+
],
|
|
9141
|
+
"device-adoption": [
|
|
9142
|
+
{
|
|
9143
|
+
"path": "lastDiscoveryAt",
|
|
9144
|
+
"valueType": "number"
|
|
9145
|
+
},
|
|
9146
|
+
{
|
|
9147
|
+
"path": "candidateCount",
|
|
9148
|
+
"valueType": "number"
|
|
9149
|
+
},
|
|
9150
|
+
{
|
|
9151
|
+
"path": "adoptedCount",
|
|
9152
|
+
"valueType": "number"
|
|
9153
|
+
},
|
|
9154
|
+
{
|
|
9155
|
+
"path": "lastError",
|
|
9156
|
+
"valueType": "string"
|
|
9157
|
+
}
|
|
9158
|
+
],
|
|
9159
|
+
"device-discovery": [{
|
|
9160
|
+
"path": "lastDiscoveryAt",
|
|
9161
|
+
"valueType": "number"
|
|
9162
|
+
}, {
|
|
9163
|
+
"path": "lastError",
|
|
9164
|
+
"valueType": "string"
|
|
9165
|
+
}],
|
|
9166
|
+
"device-export": [
|
|
9167
|
+
{
|
|
9168
|
+
"path": "linkState",
|
|
9169
|
+
"valueType": "enum",
|
|
9170
|
+
"enumValues": [
|
|
9171
|
+
"unlinked",
|
|
9172
|
+
"linked",
|
|
9173
|
+
"error"
|
|
9174
|
+
]
|
|
9175
|
+
},
|
|
9176
|
+
{
|
|
9177
|
+
"path": "exposedDeviceCount",
|
|
9178
|
+
"valueType": "number"
|
|
9179
|
+
},
|
|
9180
|
+
{
|
|
9181
|
+
"path": "error",
|
|
9182
|
+
"valueType": "string"
|
|
9183
|
+
},
|
|
9184
|
+
{
|
|
9185
|
+
"path": "setup.qr",
|
|
9186
|
+
"valueType": "string"
|
|
9187
|
+
},
|
|
9188
|
+
{
|
|
9189
|
+
"path": "setup.note",
|
|
9190
|
+
"valueType": "string"
|
|
9191
|
+
}
|
|
9192
|
+
],
|
|
9193
|
+
"device-status": [{
|
|
9194
|
+
"path": "online",
|
|
9195
|
+
"valueType": "boolean"
|
|
9196
|
+
}],
|
|
9197
|
+
"dishwasher": [
|
|
9198
|
+
{
|
|
9199
|
+
"path": "availability",
|
|
9200
|
+
"valueType": "enum",
|
|
9201
|
+
"enumValues": [
|
|
9202
|
+
"available",
|
|
9203
|
+
"offline",
|
|
9204
|
+
"description-missing"
|
|
9205
|
+
]
|
|
9206
|
+
},
|
|
9207
|
+
{
|
|
9208
|
+
"path": "state",
|
|
9209
|
+
"valueType": "enum",
|
|
9210
|
+
"enumValues": [
|
|
9211
|
+
"idle",
|
|
9212
|
+
"running",
|
|
9213
|
+
"paused",
|
|
9214
|
+
"finished",
|
|
9215
|
+
"error",
|
|
9216
|
+
"unavailable"
|
|
9217
|
+
]
|
|
9218
|
+
},
|
|
9219
|
+
{
|
|
9220
|
+
"path": "operationState",
|
|
9221
|
+
"valueType": "enum",
|
|
9222
|
+
"enumValues": [
|
|
9223
|
+
"Inactive",
|
|
9224
|
+
"Ready",
|
|
9225
|
+
"DelayedStart",
|
|
9226
|
+
"Run",
|
|
9227
|
+
"Pause",
|
|
9228
|
+
"ActionRequired",
|
|
9229
|
+
"Finished",
|
|
9230
|
+
"Error",
|
|
9231
|
+
"Aborting"
|
|
9232
|
+
]
|
|
9233
|
+
},
|
|
9234
|
+
{
|
|
9235
|
+
"path": "program",
|
|
9236
|
+
"valueType": "string"
|
|
9237
|
+
},
|
|
9238
|
+
{
|
|
9239
|
+
"path": "selectedProgram",
|
|
9240
|
+
"valueType": "string"
|
|
9241
|
+
},
|
|
9242
|
+
{
|
|
9243
|
+
"path": "remainingSeconds",
|
|
9244
|
+
"valueType": "number"
|
|
9245
|
+
},
|
|
9246
|
+
{
|
|
9247
|
+
"path": "delayedStartSeconds",
|
|
9248
|
+
"valueType": "number"
|
|
9249
|
+
},
|
|
9250
|
+
{
|
|
9251
|
+
"path": "progressPercent",
|
|
9252
|
+
"valueType": "number"
|
|
9253
|
+
},
|
|
9254
|
+
{
|
|
9255
|
+
"path": "doorOpen",
|
|
9256
|
+
"valueType": "boolean"
|
|
9257
|
+
},
|
|
9258
|
+
{
|
|
9259
|
+
"path": "doorLocked",
|
|
9260
|
+
"valueType": "boolean"
|
|
9261
|
+
},
|
|
9262
|
+
{
|
|
9263
|
+
"path": "remoteStartAllowed",
|
|
9264
|
+
"valueType": "boolean"
|
|
9265
|
+
},
|
|
9266
|
+
{
|
|
9267
|
+
"path": "remoteControlActive",
|
|
9268
|
+
"valueType": "boolean"
|
|
9269
|
+
},
|
|
9270
|
+
{
|
|
9271
|
+
"path": "localControlActive",
|
|
9272
|
+
"valueType": "boolean"
|
|
9273
|
+
},
|
|
9274
|
+
{
|
|
9275
|
+
"path": "powerOn",
|
|
9276
|
+
"valueType": "boolean"
|
|
9277
|
+
},
|
|
9278
|
+
{
|
|
9279
|
+
"path": "powerState",
|
|
9280
|
+
"valueType": "string"
|
|
9281
|
+
},
|
|
9282
|
+
{
|
|
9283
|
+
"path": "filterCleaningDue",
|
|
9284
|
+
"valueType": "boolean"
|
|
9285
|
+
},
|
|
9286
|
+
{
|
|
9287
|
+
"path": "machineCareDue",
|
|
9288
|
+
"valueType": "boolean"
|
|
9289
|
+
},
|
|
9290
|
+
{
|
|
9291
|
+
"path": "machineCareRemainingRuns",
|
|
9292
|
+
"valueType": "number"
|
|
9293
|
+
},
|
|
9294
|
+
{
|
|
9295
|
+
"path": "halfLoad",
|
|
9296
|
+
"valueType": "boolean"
|
|
9297
|
+
},
|
|
9298
|
+
{
|
|
9299
|
+
"path": "hygienePlus",
|
|
9300
|
+
"valueType": "boolean"
|
|
9301
|
+
},
|
|
9302
|
+
{
|
|
9303
|
+
"path": "extraDry",
|
|
9304
|
+
"valueType": "boolean"
|
|
9305
|
+
},
|
|
9306
|
+
{
|
|
9307
|
+
"path": "intensiveZone",
|
|
9308
|
+
"valueType": "boolean"
|
|
9309
|
+
},
|
|
9310
|
+
{
|
|
9311
|
+
"path": "varioSpeedPlus",
|
|
9312
|
+
"valueType": "boolean"
|
|
9313
|
+
},
|
|
9314
|
+
{
|
|
9315
|
+
"path": "childLock",
|
|
9316
|
+
"valueType": "boolean"
|
|
9317
|
+
},
|
|
9318
|
+
{
|
|
9319
|
+
"path": "errorCode",
|
|
9320
|
+
"valueType": "number"
|
|
9321
|
+
},
|
|
9322
|
+
{
|
|
9323
|
+
"path": "errorLabel",
|
|
9324
|
+
"valueType": "string"
|
|
9325
|
+
}
|
|
9326
|
+
],
|
|
9327
|
+
"doorbell": [{
|
|
9328
|
+
"path": "lastPressedAt",
|
|
9329
|
+
"valueType": "number"
|
|
9330
|
+
}, {
|
|
9331
|
+
"path": "pressCountSinceStart",
|
|
9332
|
+
"valueType": "number"
|
|
9333
|
+
}],
|
|
9334
|
+
"enum-sensor": [{
|
|
9335
|
+
"path": "value",
|
|
9336
|
+
"valueType": "string"
|
|
9337
|
+
}, {
|
|
9338
|
+
"path": "format",
|
|
9339
|
+
"valueType": "enum",
|
|
9340
|
+
"enumValues": [
|
|
9341
|
+
"date",
|
|
9342
|
+
"time",
|
|
9343
|
+
"datetime"
|
|
9344
|
+
]
|
|
9345
|
+
}],
|
|
9346
|
+
"event-emitter": [
|
|
9347
|
+
{
|
|
9348
|
+
"path": "lastEvent.deviceId",
|
|
9349
|
+
"valueType": "number"
|
|
9350
|
+
},
|
|
9351
|
+
{
|
|
9352
|
+
"path": "lastEvent.eventType",
|
|
9353
|
+
"valueType": "string"
|
|
9354
|
+
},
|
|
9355
|
+
{
|
|
9356
|
+
"path": "lastEvent.timestamp",
|
|
9357
|
+
"valueType": "number"
|
|
9358
|
+
},
|
|
9359
|
+
{
|
|
9360
|
+
"path": "lastEvent.seq",
|
|
9361
|
+
"valueType": "number"
|
|
9362
|
+
},
|
|
9363
|
+
{
|
|
9364
|
+
"path": "eventCountSinceStart",
|
|
9365
|
+
"valueType": "number"
|
|
9366
|
+
}
|
|
9367
|
+
],
|
|
9368
|
+
"fan-control": [
|
|
9369
|
+
{
|
|
9370
|
+
"path": "percentage",
|
|
9371
|
+
"valueType": "number"
|
|
9372
|
+
},
|
|
9373
|
+
{
|
|
9374
|
+
"path": "percentageStep",
|
|
9375
|
+
"valueType": "number"
|
|
9376
|
+
},
|
|
9377
|
+
{
|
|
9378
|
+
"path": "preset",
|
|
9379
|
+
"valueType": "string"
|
|
9380
|
+
},
|
|
9381
|
+
{
|
|
9382
|
+
"path": "direction",
|
|
9383
|
+
"valueType": "enum",
|
|
9384
|
+
"enumValues": ["forward", "reverse"]
|
|
9385
|
+
},
|
|
9386
|
+
{
|
|
9387
|
+
"path": "oscillating",
|
|
9388
|
+
"valueType": "boolean"
|
|
9389
|
+
}
|
|
9390
|
+
],
|
|
9391
|
+
"feature-probe": [
|
|
9392
|
+
{
|
|
9393
|
+
"path": "deviceType",
|
|
9394
|
+
"valueType": "string"
|
|
9395
|
+
},
|
|
9396
|
+
{
|
|
9397
|
+
"path": "model",
|
|
9398
|
+
"valueType": "string"
|
|
9399
|
+
},
|
|
9400
|
+
{
|
|
9401
|
+
"path": "channelCount",
|
|
9402
|
+
"valueType": "number"
|
|
9403
|
+
},
|
|
9404
|
+
{
|
|
9405
|
+
"path": "lastProbedAt",
|
|
9406
|
+
"valueType": "number"
|
|
9407
|
+
}
|
|
9408
|
+
],
|
|
9409
|
+
"flood": [{
|
|
9410
|
+
"path": "flooded",
|
|
9411
|
+
"valueType": "boolean"
|
|
9412
|
+
}],
|
|
9413
|
+
"gas": [{
|
|
9414
|
+
"path": "detected",
|
|
9415
|
+
"valueType": "boolean"
|
|
9416
|
+
}],
|
|
9417
|
+
"heating-valve": [{
|
|
9418
|
+
"path": "position",
|
|
9419
|
+
"valueType": "number"
|
|
9420
|
+
}],
|
|
9421
|
+
"humidifier": [
|
|
9422
|
+
{
|
|
9423
|
+
"path": "on",
|
|
9424
|
+
"valueType": "boolean"
|
|
9425
|
+
},
|
|
9426
|
+
{
|
|
9427
|
+
"path": "currentHumidity",
|
|
9428
|
+
"valueType": "number"
|
|
9429
|
+
},
|
|
9430
|
+
{
|
|
9431
|
+
"path": "targetHumidity",
|
|
9432
|
+
"valueType": "number"
|
|
9433
|
+
},
|
|
9434
|
+
{
|
|
9435
|
+
"path": "mode",
|
|
9436
|
+
"valueType": "string"
|
|
9437
|
+
},
|
|
9438
|
+
{
|
|
9439
|
+
"path": "action",
|
|
9440
|
+
"valueType": "string"
|
|
9441
|
+
},
|
|
9442
|
+
{
|
|
9443
|
+
"path": "minHumidity",
|
|
9444
|
+
"valueType": "number"
|
|
9445
|
+
},
|
|
9446
|
+
{
|
|
9447
|
+
"path": "maxHumidity",
|
|
9448
|
+
"valueType": "number"
|
|
9449
|
+
}
|
|
9450
|
+
],
|
|
9451
|
+
"humidity-sensor": [
|
|
9452
|
+
{
|
|
9453
|
+
"path": "percent",
|
|
9454
|
+
"valueType": "number"
|
|
9455
|
+
},
|
|
9456
|
+
{
|
|
9457
|
+
"path": "unit",
|
|
9458
|
+
"valueType": "string"
|
|
9459
|
+
},
|
|
9460
|
+
{
|
|
9461
|
+
"path": "precision",
|
|
9462
|
+
"valueType": "number"
|
|
9463
|
+
}
|
|
9464
|
+
],
|
|
9465
|
+
"image": [{
|
|
9466
|
+
"path": "url",
|
|
9467
|
+
"valueType": "string"
|
|
9468
|
+
}, {
|
|
9469
|
+
"path": "lastUpdated",
|
|
9470
|
+
"valueType": "number"
|
|
9471
|
+
}],
|
|
9472
|
+
"image-settings": [
|
|
9473
|
+
{
|
|
9474
|
+
"path": "brightness",
|
|
9475
|
+
"valueType": "number"
|
|
9476
|
+
},
|
|
9477
|
+
{
|
|
9478
|
+
"path": "contrast",
|
|
9479
|
+
"valueType": "number"
|
|
9480
|
+
},
|
|
9481
|
+
{
|
|
9482
|
+
"path": "saturation",
|
|
9483
|
+
"valueType": "number"
|
|
9484
|
+
},
|
|
9485
|
+
{
|
|
9486
|
+
"path": "sharpness",
|
|
9487
|
+
"valueType": "number"
|
|
9488
|
+
},
|
|
9489
|
+
{
|
|
9490
|
+
"path": "mirror",
|
|
9491
|
+
"valueType": "boolean"
|
|
9492
|
+
},
|
|
9493
|
+
{
|
|
9494
|
+
"path": "flip",
|
|
9495
|
+
"valueType": "boolean"
|
|
9496
|
+
},
|
|
9497
|
+
{
|
|
9498
|
+
"path": "rotate",
|
|
9499
|
+
"valueType": "enum",
|
|
9500
|
+
"enumValues": [
|
|
9501
|
+
"0",
|
|
9502
|
+
"90",
|
|
9503
|
+
"180",
|
|
9504
|
+
"270"
|
|
9505
|
+
]
|
|
9506
|
+
},
|
|
9507
|
+
{
|
|
9508
|
+
"path": "whiteBalance",
|
|
9509
|
+
"valueType": "enum",
|
|
9510
|
+
"enumValues": ["auto", "manual"]
|
|
9511
|
+
},
|
|
9512
|
+
{
|
|
9513
|
+
"path": "warmth",
|
|
9514
|
+
"valueType": "number"
|
|
9515
|
+
},
|
|
9516
|
+
{
|
|
9517
|
+
"path": "exposureMode",
|
|
9518
|
+
"valueType": "enum",
|
|
9519
|
+
"enumValues": ["auto", "manual"]
|
|
9520
|
+
},
|
|
9521
|
+
{
|
|
9522
|
+
"path": "backlightMode",
|
|
9523
|
+
"valueType": "enum",
|
|
9524
|
+
"enumValues": [
|
|
9525
|
+
"off",
|
|
9526
|
+
"blc",
|
|
9527
|
+
"wdr",
|
|
9528
|
+
"hlc"
|
|
9529
|
+
]
|
|
9530
|
+
}
|
|
9531
|
+
],
|
|
9532
|
+
"intercom": [
|
|
9533
|
+
{
|
|
9534
|
+
"path": "talking",
|
|
9535
|
+
"valueType": "boolean"
|
|
9536
|
+
},
|
|
9537
|
+
{
|
|
9538
|
+
"path": "lastSessionAt",
|
|
9539
|
+
"valueType": "number"
|
|
9540
|
+
},
|
|
9541
|
+
{
|
|
9542
|
+
"path": "ability.sampleRate",
|
|
9543
|
+
"valueType": "number"
|
|
9544
|
+
},
|
|
9545
|
+
{
|
|
9546
|
+
"path": "ability.duplex",
|
|
9547
|
+
"valueType": "enum",
|
|
9548
|
+
"enumValues": ["half", "full"]
|
|
9549
|
+
},
|
|
9550
|
+
{
|
|
9551
|
+
"path": "ability.maxBacklogMs",
|
|
9552
|
+
"valueType": "number"
|
|
9553
|
+
}
|
|
9554
|
+
],
|
|
9555
|
+
"lawn-mower-control": [
|
|
9556
|
+
{
|
|
9557
|
+
"path": "activity",
|
|
9558
|
+
"valueType": "enum",
|
|
9559
|
+
"enumValues": [
|
|
9560
|
+
"idle",
|
|
9561
|
+
"mowing",
|
|
9562
|
+
"paused",
|
|
9563
|
+
"docked",
|
|
9564
|
+
"error"
|
|
9565
|
+
]
|
|
9566
|
+
},
|
|
9567
|
+
{
|
|
9568
|
+
"path": "batteryLevel",
|
|
9569
|
+
"valueType": "number"
|
|
9570
|
+
},
|
|
9571
|
+
{
|
|
9572
|
+
"path": "progressPercent",
|
|
9573
|
+
"valueType": "number"
|
|
9574
|
+
},
|
|
9575
|
+
{
|
|
9576
|
+
"path": "currentCode",
|
|
9577
|
+
"valueType": "number"
|
|
9578
|
+
},
|
|
9579
|
+
{
|
|
9580
|
+
"path": "currentCodeLabel",
|
|
9581
|
+
"valueType": "string"
|
|
9582
|
+
},
|
|
9583
|
+
{
|
|
9584
|
+
"path": "severity",
|
|
9585
|
+
"valueType": "enum",
|
|
9586
|
+
"enumValues": [
|
|
9587
|
+
"info",
|
|
9588
|
+
"warning",
|
|
9589
|
+
"error"
|
|
9590
|
+
]
|
|
9591
|
+
}
|
|
9592
|
+
],
|
|
9593
|
+
"lock-control": [{
|
|
9594
|
+
"path": "state",
|
|
9595
|
+
"valueType": "enum",
|
|
9596
|
+
"enumValues": [
|
|
9597
|
+
"locked",
|
|
9598
|
+
"unlocked",
|
|
9599
|
+
"locking",
|
|
9600
|
+
"unlocking",
|
|
9601
|
+
"jammed"
|
|
9602
|
+
]
|
|
9603
|
+
}],
|
|
9604
|
+
"media-player": [
|
|
9605
|
+
{
|
|
9606
|
+
"path": "state",
|
|
9607
|
+
"valueType": "enum",
|
|
9608
|
+
"enumValues": [
|
|
9609
|
+
"off",
|
|
9610
|
+
"on",
|
|
9611
|
+
"idle",
|
|
9612
|
+
"playing",
|
|
9613
|
+
"paused",
|
|
9614
|
+
"buffering",
|
|
9615
|
+
"standby"
|
|
9616
|
+
]
|
|
9617
|
+
},
|
|
9618
|
+
{
|
|
9619
|
+
"path": "volumeLevel",
|
|
9620
|
+
"valueType": "number"
|
|
9621
|
+
},
|
|
9622
|
+
{
|
|
9623
|
+
"path": "isMuted",
|
|
9624
|
+
"valueType": "boolean"
|
|
9625
|
+
},
|
|
9626
|
+
{
|
|
9627
|
+
"path": "source",
|
|
9628
|
+
"valueType": "string"
|
|
9629
|
+
},
|
|
9630
|
+
{
|
|
9631
|
+
"path": "currentMedia.type",
|
|
9632
|
+
"valueType": "string"
|
|
9633
|
+
},
|
|
9634
|
+
{
|
|
9635
|
+
"path": "currentMedia.title",
|
|
9636
|
+
"valueType": "string"
|
|
9637
|
+
},
|
|
9638
|
+
{
|
|
9639
|
+
"path": "currentMedia.artist",
|
|
9640
|
+
"valueType": "string"
|
|
9641
|
+
},
|
|
9642
|
+
{
|
|
9643
|
+
"path": "currentMedia.album",
|
|
9644
|
+
"valueType": "string"
|
|
9645
|
+
},
|
|
9646
|
+
{
|
|
9647
|
+
"path": "currentMedia.imageUrl",
|
|
9648
|
+
"valueType": "string"
|
|
9649
|
+
},
|
|
9650
|
+
{
|
|
9651
|
+
"path": "positionMs",
|
|
9652
|
+
"valueType": "number"
|
|
9653
|
+
},
|
|
9654
|
+
{
|
|
9655
|
+
"path": "durationMs",
|
|
9656
|
+
"valueType": "number"
|
|
9657
|
+
},
|
|
9658
|
+
{
|
|
9659
|
+
"path": "shuffle",
|
|
9660
|
+
"valueType": "boolean"
|
|
9661
|
+
},
|
|
9662
|
+
{
|
|
9663
|
+
"path": "repeat",
|
|
9664
|
+
"valueType": "enum",
|
|
9665
|
+
"enumValues": [
|
|
9666
|
+
"off",
|
|
9667
|
+
"all",
|
|
9668
|
+
"one"
|
|
9669
|
+
]
|
|
9670
|
+
}
|
|
9671
|
+
],
|
|
9672
|
+
"motion": [
|
|
9673
|
+
{
|
|
9674
|
+
"path": "detected",
|
|
9675
|
+
"valueType": "boolean"
|
|
9676
|
+
},
|
|
9677
|
+
{
|
|
9678
|
+
"path": "lastDetectedAt",
|
|
9679
|
+
"valueType": "number"
|
|
9680
|
+
},
|
|
9681
|
+
{
|
|
9682
|
+
"path": "autoClearAfterMs",
|
|
9683
|
+
"valueType": "number"
|
|
9684
|
+
}
|
|
9685
|
+
],
|
|
9686
|
+
"motion-trigger": [{
|
|
9687
|
+
"path": "enabled",
|
|
9688
|
+
"valueType": "boolean"
|
|
9689
|
+
}],
|
|
9690
|
+
"motion-zones": [{
|
|
9691
|
+
"path": "enabled",
|
|
9692
|
+
"valueType": "boolean"
|
|
9693
|
+
}, {
|
|
9694
|
+
"path": "sensitivity",
|
|
9695
|
+
"valueType": "number"
|
|
9696
|
+
}],
|
|
9697
|
+
"mqtt-broker": [{
|
|
9698
|
+
"path": "brokerCount",
|
|
9699
|
+
"valueType": "number"
|
|
9700
|
+
}, {
|
|
9701
|
+
"path": "embeddedRunning",
|
|
9702
|
+
"valueType": "boolean"
|
|
9703
|
+
}],
|
|
9704
|
+
"native-object-detection": [{
|
|
9705
|
+
"path": "enabled",
|
|
9706
|
+
"valueType": "boolean"
|
|
9707
|
+
}],
|
|
9708
|
+
"navigation": [
|
|
9709
|
+
{
|
|
9710
|
+
"path": "mode",
|
|
9711
|
+
"valueType": "enum",
|
|
9712
|
+
"enumValues": [
|
|
9713
|
+
"idle",
|
|
9714
|
+
"cleaning",
|
|
9715
|
+
"spot",
|
|
9716
|
+
"following",
|
|
9717
|
+
"goto",
|
|
9718
|
+
"returning",
|
|
9719
|
+
"paused",
|
|
9720
|
+
"unknown"
|
|
9721
|
+
]
|
|
9722
|
+
},
|
|
9723
|
+
{
|
|
9724
|
+
"path": "following",
|
|
9725
|
+
"valueType": "boolean"
|
|
9726
|
+
},
|
|
9727
|
+
{
|
|
9728
|
+
"path": "flash",
|
|
9729
|
+
"valueType": "boolean"
|
|
9730
|
+
},
|
|
9731
|
+
{
|
|
9732
|
+
"path": "lightMode",
|
|
9733
|
+
"valueType": "enum",
|
|
9734
|
+
"enumValues": ["auto", "manual"]
|
|
9735
|
+
},
|
|
9736
|
+
{
|
|
9737
|
+
"path": "lightLevel",
|
|
9738
|
+
"valueType": "number"
|
|
9739
|
+
}
|
|
9740
|
+
],
|
|
9741
|
+
"network-link": [
|
|
9742
|
+
{
|
|
9743
|
+
"path": "type",
|
|
9744
|
+
"valueType": "enum",
|
|
9745
|
+
"enumValues": [
|
|
9746
|
+
"wifi",
|
|
9747
|
+
"ethernet",
|
|
9748
|
+
"cellular",
|
|
9749
|
+
"unknown"
|
|
9750
|
+
]
|
|
9751
|
+
},
|
|
9752
|
+
{
|
|
9753
|
+
"path": "signalPercent",
|
|
9754
|
+
"valueType": "number"
|
|
9755
|
+
},
|
|
9756
|
+
{
|
|
9757
|
+
"path": "rssiDbm",
|
|
9758
|
+
"valueType": "number"
|
|
9759
|
+
},
|
|
9760
|
+
{
|
|
9761
|
+
"path": "ssid",
|
|
9762
|
+
"valueType": "string"
|
|
9763
|
+
},
|
|
9764
|
+
{
|
|
9765
|
+
"path": "lastUpdated",
|
|
9766
|
+
"valueType": "number"
|
|
9767
|
+
}
|
|
9768
|
+
],
|
|
9769
|
+
"notifier": [
|
|
9770
|
+
{
|
|
9771
|
+
"path": "lastSentAt",
|
|
9772
|
+
"valueType": "number"
|
|
9773
|
+
},
|
|
9774
|
+
{
|
|
9775
|
+
"path": "lastError",
|
|
9776
|
+
"valueType": "string"
|
|
9777
|
+
},
|
|
9778
|
+
{
|
|
9779
|
+
"path": "queueDepth",
|
|
9780
|
+
"valueType": "number"
|
|
9781
|
+
},
|
|
9782
|
+
{
|
|
9783
|
+
"path": "supports.image",
|
|
9784
|
+
"valueType": "boolean"
|
|
9785
|
+
},
|
|
9786
|
+
{
|
|
9787
|
+
"path": "supports.priority",
|
|
9788
|
+
"valueType": "boolean"
|
|
9789
|
+
},
|
|
9790
|
+
{
|
|
9791
|
+
"path": "supports.data",
|
|
9792
|
+
"valueType": "boolean"
|
|
9793
|
+
},
|
|
9794
|
+
{
|
|
9795
|
+
"path": "supports.actions",
|
|
9796
|
+
"valueType": "boolean"
|
|
9797
|
+
},
|
|
9798
|
+
{
|
|
9799
|
+
"path": "supports.recipients",
|
|
9800
|
+
"valueType": "boolean"
|
|
9801
|
+
}
|
|
9802
|
+
],
|
|
9803
|
+
"numeric-sensor": [
|
|
9804
|
+
{
|
|
9805
|
+
"path": "value",
|
|
9806
|
+
"valueType": "number"
|
|
9807
|
+
},
|
|
9808
|
+
{
|
|
9809
|
+
"path": "unit",
|
|
9810
|
+
"valueType": "string"
|
|
9811
|
+
},
|
|
9812
|
+
{
|
|
9813
|
+
"path": "precision",
|
|
9814
|
+
"valueType": "number"
|
|
9815
|
+
}
|
|
9816
|
+
],
|
|
9817
|
+
"pet-feeder": [
|
|
9818
|
+
{
|
|
9819
|
+
"path": "foodLevel",
|
|
9820
|
+
"valueType": "number"
|
|
9821
|
+
},
|
|
9822
|
+
{
|
|
9823
|
+
"path": "food1",
|
|
9824
|
+
"valueType": "number"
|
|
9825
|
+
},
|
|
9826
|
+
{
|
|
9827
|
+
"path": "food2",
|
|
9828
|
+
"valueType": "number"
|
|
9829
|
+
},
|
|
9830
|
+
{
|
|
9831
|
+
"path": "lowFood",
|
|
9832
|
+
"valueType": "boolean"
|
|
9833
|
+
},
|
|
9834
|
+
{
|
|
9835
|
+
"path": "batteryPower",
|
|
9836
|
+
"valueType": "number"
|
|
9837
|
+
},
|
|
9838
|
+
{
|
|
9839
|
+
"path": "desiccantLeftDays",
|
|
9840
|
+
"valueType": "number"
|
|
9841
|
+
},
|
|
9842
|
+
{
|
|
9843
|
+
"path": "feeding",
|
|
9844
|
+
"valueType": "boolean"
|
|
9845
|
+
},
|
|
9846
|
+
{
|
|
9847
|
+
"path": "status",
|
|
9848
|
+
"valueType": "enum",
|
|
9849
|
+
"enumValues": [
|
|
9850
|
+
"normal",
|
|
9851
|
+
"offline",
|
|
9852
|
+
"on_batteries"
|
|
9853
|
+
]
|
|
9854
|
+
},
|
|
9855
|
+
{
|
|
9856
|
+
"path": "error",
|
|
9857
|
+
"valueType": "string"
|
|
9858
|
+
},
|
|
9859
|
+
{
|
|
9860
|
+
"path": "errorCode",
|
|
9861
|
+
"valueType": "number"
|
|
9862
|
+
},
|
|
9863
|
+
{
|
|
9864
|
+
"path": "isDualHopper",
|
|
9865
|
+
"valueType": "boolean"
|
|
9866
|
+
},
|
|
9867
|
+
{
|
|
9868
|
+
"path": "childLock",
|
|
9869
|
+
"valueType": "boolean"
|
|
9870
|
+
},
|
|
9871
|
+
{
|
|
9872
|
+
"path": "indicatorLight",
|
|
9873
|
+
"valueType": "boolean"
|
|
9874
|
+
},
|
|
9875
|
+
{
|
|
9876
|
+
"path": "feedSound",
|
|
9877
|
+
"valueType": "boolean"
|
|
9878
|
+
},
|
|
9879
|
+
{
|
|
9880
|
+
"path": "volume",
|
|
9881
|
+
"valueType": "number"
|
|
9882
|
+
}
|
|
9883
|
+
],
|
|
9884
|
+
"power-meter": [
|
|
9885
|
+
{
|
|
9886
|
+
"path": "watts",
|
|
9887
|
+
"valueType": "number"
|
|
9888
|
+
},
|
|
9889
|
+
{
|
|
9890
|
+
"path": "kwhTotal",
|
|
9891
|
+
"valueType": "number"
|
|
9892
|
+
},
|
|
9893
|
+
{
|
|
9894
|
+
"path": "volts",
|
|
9895
|
+
"valueType": "number"
|
|
9896
|
+
},
|
|
9897
|
+
{
|
|
9898
|
+
"path": "amps",
|
|
9899
|
+
"valueType": "number"
|
|
9900
|
+
},
|
|
9901
|
+
{
|
|
9902
|
+
"path": "va",
|
|
9903
|
+
"valueType": "number"
|
|
9904
|
+
},
|
|
9905
|
+
{
|
|
9906
|
+
"path": "powerFactor",
|
|
9907
|
+
"valueType": "number"
|
|
9908
|
+
},
|
|
9909
|
+
{
|
|
9910
|
+
"path": "unit",
|
|
9911
|
+
"valueType": "string"
|
|
9912
|
+
},
|
|
9913
|
+
{
|
|
9914
|
+
"path": "precision",
|
|
9915
|
+
"valueType": "number"
|
|
9916
|
+
}
|
|
9917
|
+
],
|
|
9918
|
+
"presence": [
|
|
9919
|
+
{
|
|
9920
|
+
"path": "state",
|
|
9921
|
+
"valueType": "string"
|
|
9922
|
+
},
|
|
9923
|
+
{
|
|
9924
|
+
"path": "location",
|
|
9925
|
+
"valueType": "string"
|
|
9926
|
+
},
|
|
9927
|
+
{
|
|
9928
|
+
"path": "gps.latitude",
|
|
9929
|
+
"valueType": "number"
|
|
9930
|
+
},
|
|
9931
|
+
{
|
|
9932
|
+
"path": "gps.longitude",
|
|
9933
|
+
"valueType": "number"
|
|
9934
|
+
},
|
|
9935
|
+
{
|
|
9936
|
+
"path": "gps.accuracyMeters",
|
|
9937
|
+
"valueType": "number"
|
|
9938
|
+
},
|
|
9939
|
+
{
|
|
9940
|
+
"path": "batteryPercent",
|
|
9941
|
+
"valueType": "number"
|
|
9942
|
+
}
|
|
9943
|
+
],
|
|
9944
|
+
"pressure-sensor": [
|
|
9945
|
+
{
|
|
9946
|
+
"path": "hpa",
|
|
9947
|
+
"valueType": "number"
|
|
9948
|
+
},
|
|
9949
|
+
{
|
|
9950
|
+
"path": "unit",
|
|
9951
|
+
"valueType": "string"
|
|
9952
|
+
},
|
|
9953
|
+
{
|
|
9954
|
+
"path": "precision",
|
|
9955
|
+
"valueType": "number"
|
|
9956
|
+
}
|
|
9957
|
+
],
|
|
9958
|
+
"privacy-mask": [{
|
|
9959
|
+
"path": "enabled",
|
|
9960
|
+
"valueType": "boolean"
|
|
9961
|
+
}, {
|
|
9962
|
+
"path": "audioEnabled",
|
|
9963
|
+
"valueType": "boolean"
|
|
9964
|
+
}],
|
|
9965
|
+
"ptz": [
|
|
9966
|
+
{
|
|
9967
|
+
"path": "pan",
|
|
9968
|
+
"valueType": "number"
|
|
9969
|
+
},
|
|
9970
|
+
{
|
|
9971
|
+
"path": "tilt",
|
|
9972
|
+
"valueType": "number"
|
|
9973
|
+
},
|
|
9974
|
+
{
|
|
9975
|
+
"path": "zoom",
|
|
9976
|
+
"valueType": "number"
|
|
9977
|
+
},
|
|
9978
|
+
{
|
|
9979
|
+
"path": "autofocus",
|
|
9980
|
+
"valueType": "boolean"
|
|
9981
|
+
}
|
|
9982
|
+
],
|
|
9983
|
+
"ptz-autotrack": [
|
|
9984
|
+
{
|
|
9985
|
+
"path": "enabled",
|
|
9986
|
+
"valueType": "boolean"
|
|
9987
|
+
},
|
|
9988
|
+
{
|
|
9989
|
+
"path": "currentSettings.targetType",
|
|
9990
|
+
"valueType": "string"
|
|
9991
|
+
},
|
|
9992
|
+
{
|
|
9993
|
+
"path": "currentSettings.stopDelaySeconds",
|
|
9994
|
+
"valueType": "number"
|
|
9995
|
+
},
|
|
9996
|
+
{
|
|
9997
|
+
"path": "currentSettings.disappearDelaySeconds",
|
|
9998
|
+
"valueType": "number"
|
|
9999
|
+
}
|
|
10000
|
+
],
|
|
10001
|
+
"recording-archive": [
|
|
10002
|
+
{
|
|
10003
|
+
"path": "deviceId",
|
|
10004
|
+
"valueType": "number"
|
|
10005
|
+
},
|
|
10006
|
+
{
|
|
10007
|
+
"path": "enabled",
|
|
10008
|
+
"valueType": "boolean"
|
|
10009
|
+
},
|
|
10010
|
+
{
|
|
10011
|
+
"path": "activeMode",
|
|
10012
|
+
"valueType": "enum",
|
|
10013
|
+
"enumValues": [
|
|
10014
|
+
"off",
|
|
10015
|
+
"events",
|
|
10016
|
+
"continuous",
|
|
10017
|
+
"on-device-decision"
|
|
10018
|
+
]
|
|
10019
|
+
},
|
|
10020
|
+
{
|
|
10021
|
+
"path": "nodeId",
|
|
10022
|
+
"valueType": "string"
|
|
10023
|
+
},
|
|
10024
|
+
{
|
|
10025
|
+
"path": "storageBytes",
|
|
10026
|
+
"valueType": "number"
|
|
10027
|
+
}
|
|
10028
|
+
],
|
|
10029
|
+
"recording-onboard": [
|
|
10030
|
+
{
|
|
10031
|
+
"path": "primaryTrackId",
|
|
10032
|
+
"valueType": "string"
|
|
10033
|
+
},
|
|
10034
|
+
{
|
|
10035
|
+
"path": "enabled",
|
|
10036
|
+
"valueType": "boolean"
|
|
10037
|
+
},
|
|
10038
|
+
{
|
|
10039
|
+
"path": "overwriteWhenFull",
|
|
10040
|
+
"valueType": "boolean"
|
|
10041
|
+
},
|
|
10042
|
+
{
|
|
10043
|
+
"path": "preRecordSec",
|
|
10044
|
+
"valueType": "number"
|
|
10045
|
+
},
|
|
10046
|
+
{
|
|
10047
|
+
"path": "postRecordSec",
|
|
10048
|
+
"valueType": "number"
|
|
10049
|
+
},
|
|
10050
|
+
{
|
|
10051
|
+
"path": "segmentMinutes",
|
|
10052
|
+
"valueType": "number"
|
|
10053
|
+
},
|
|
10054
|
+
{
|
|
10055
|
+
"path": "unreadableWindows",
|
|
10056
|
+
"valueType": "number"
|
|
10057
|
+
},
|
|
10058
|
+
{
|
|
10059
|
+
"path": "recordingToNowhere",
|
|
10060
|
+
"valueType": "boolean"
|
|
10061
|
+
}
|
|
10062
|
+
],
|
|
10063
|
+
"recording-signal": [{
|
|
10064
|
+
"path": "active",
|
|
10065
|
+
"valueType": "boolean"
|
|
10066
|
+
}, {
|
|
10067
|
+
"path": "reason",
|
|
10068
|
+
"valueType": "string"
|
|
10069
|
+
}],
|
|
10070
|
+
"running-state": [
|
|
10071
|
+
{
|
|
10072
|
+
"path": "running",
|
|
10073
|
+
"valueType": "boolean"
|
|
10074
|
+
},
|
|
10075
|
+
{
|
|
10076
|
+
"path": "since",
|
|
10077
|
+
"valueType": "number"
|
|
10078
|
+
},
|
|
10079
|
+
{
|
|
10080
|
+
"path": "source",
|
|
10081
|
+
"valueType": "enum",
|
|
10082
|
+
"enumValues": ["native", "assigned"]
|
|
10083
|
+
},
|
|
10084
|
+
{
|
|
10085
|
+
"path": "phase",
|
|
10086
|
+
"valueType": "string"
|
|
10087
|
+
}
|
|
10088
|
+
],
|
|
10089
|
+
"script-runner": [
|
|
10090
|
+
{
|
|
10091
|
+
"path": "isRunning",
|
|
10092
|
+
"valueType": "boolean"
|
|
10093
|
+
},
|
|
10094
|
+
{
|
|
10095
|
+
"path": "lastRunAt",
|
|
10096
|
+
"valueType": "number"
|
|
10097
|
+
},
|
|
10098
|
+
{
|
|
10099
|
+
"path": "lastRunSuccess",
|
|
10100
|
+
"valueType": "boolean"
|
|
10101
|
+
},
|
|
10102
|
+
{
|
|
10103
|
+
"path": "lastError",
|
|
10104
|
+
"valueType": "string"
|
|
10105
|
+
}
|
|
10106
|
+
],
|
|
10107
|
+
"smoke": [{
|
|
10108
|
+
"path": "detected",
|
|
10109
|
+
"valueType": "boolean"
|
|
10110
|
+
}],
|
|
10111
|
+
"snapshot": [
|
|
10112
|
+
{
|
|
10113
|
+
"path": "lastCapturedAt",
|
|
10114
|
+
"valueType": "number"
|
|
10115
|
+
},
|
|
10116
|
+
{
|
|
10117
|
+
"path": "cacheAgeMs",
|
|
10118
|
+
"valueType": "number"
|
|
10119
|
+
},
|
|
10120
|
+
{
|
|
10121
|
+
"path": "lastBytes",
|
|
10122
|
+
"valueType": "number"
|
|
10123
|
+
},
|
|
10124
|
+
{
|
|
10125
|
+
"path": "lastStreamId",
|
|
10126
|
+
"valueType": "string"
|
|
10127
|
+
}
|
|
10128
|
+
],
|
|
10129
|
+
"stream-params": [
|
|
10130
|
+
{
|
|
10131
|
+
"path": "main.width",
|
|
10132
|
+
"valueType": "number"
|
|
10133
|
+
},
|
|
10134
|
+
{
|
|
10135
|
+
"path": "main.height",
|
|
10136
|
+
"valueType": "number"
|
|
10137
|
+
},
|
|
10138
|
+
{
|
|
10139
|
+
"path": "main.codec",
|
|
10140
|
+
"valueType": "enum",
|
|
10141
|
+
"enumValues": ["h264", "h265"]
|
|
10142
|
+
},
|
|
10143
|
+
{
|
|
10144
|
+
"path": "main.framerate",
|
|
10145
|
+
"valueType": "number"
|
|
10146
|
+
},
|
|
10147
|
+
{
|
|
10148
|
+
"path": "main.bitrate",
|
|
10149
|
+
"valueType": "number"
|
|
10150
|
+
},
|
|
10151
|
+
{
|
|
10152
|
+
"path": "main.bitrateMode",
|
|
10153
|
+
"valueType": "enum",
|
|
10154
|
+
"enumValues": ["vbr", "cbr"]
|
|
10155
|
+
},
|
|
10156
|
+
{
|
|
10157
|
+
"path": "main.encoderProfile",
|
|
10158
|
+
"valueType": "enum",
|
|
10159
|
+
"enumValues": [
|
|
10160
|
+
"high",
|
|
10161
|
+
"main",
|
|
10162
|
+
"baseline"
|
|
10163
|
+
]
|
|
10164
|
+
},
|
|
10165
|
+
{
|
|
10166
|
+
"path": "main.gop",
|
|
10167
|
+
"valueType": "number"
|
|
10168
|
+
},
|
|
10169
|
+
{
|
|
10170
|
+
"path": "main.audio",
|
|
10171
|
+
"valueType": "boolean"
|
|
10172
|
+
},
|
|
10173
|
+
{
|
|
10174
|
+
"path": "sub.width",
|
|
10175
|
+
"valueType": "number"
|
|
10176
|
+
},
|
|
10177
|
+
{
|
|
10178
|
+
"path": "sub.height",
|
|
10179
|
+
"valueType": "number"
|
|
10180
|
+
},
|
|
10181
|
+
{
|
|
10182
|
+
"path": "sub.codec",
|
|
10183
|
+
"valueType": "enum",
|
|
10184
|
+
"enumValues": ["h264", "h265"]
|
|
10185
|
+
},
|
|
10186
|
+
{
|
|
10187
|
+
"path": "sub.framerate",
|
|
10188
|
+
"valueType": "number"
|
|
10189
|
+
},
|
|
10190
|
+
{
|
|
10191
|
+
"path": "sub.bitrate",
|
|
10192
|
+
"valueType": "number"
|
|
10193
|
+
},
|
|
10194
|
+
{
|
|
10195
|
+
"path": "sub.bitrateMode",
|
|
10196
|
+
"valueType": "enum",
|
|
10197
|
+
"enumValues": ["vbr", "cbr"]
|
|
10198
|
+
},
|
|
10199
|
+
{
|
|
10200
|
+
"path": "sub.encoderProfile",
|
|
10201
|
+
"valueType": "enum",
|
|
10202
|
+
"enumValues": [
|
|
10203
|
+
"high",
|
|
10204
|
+
"main",
|
|
10205
|
+
"baseline"
|
|
10206
|
+
]
|
|
10207
|
+
},
|
|
10208
|
+
{
|
|
10209
|
+
"path": "sub.gop",
|
|
10210
|
+
"valueType": "number"
|
|
10211
|
+
},
|
|
10212
|
+
{
|
|
10213
|
+
"path": "sub.audio",
|
|
10214
|
+
"valueType": "boolean"
|
|
10215
|
+
},
|
|
10216
|
+
{
|
|
10217
|
+
"path": "ext.width",
|
|
10218
|
+
"valueType": "number"
|
|
10219
|
+
},
|
|
10220
|
+
{
|
|
10221
|
+
"path": "ext.height",
|
|
10222
|
+
"valueType": "number"
|
|
10223
|
+
},
|
|
10224
|
+
{
|
|
10225
|
+
"path": "ext.codec",
|
|
10226
|
+
"valueType": "enum",
|
|
10227
|
+
"enumValues": ["h264", "h265"]
|
|
10228
|
+
},
|
|
10229
|
+
{
|
|
10230
|
+
"path": "ext.framerate",
|
|
10231
|
+
"valueType": "number"
|
|
10232
|
+
},
|
|
10233
|
+
{
|
|
10234
|
+
"path": "ext.bitrate",
|
|
10235
|
+
"valueType": "number"
|
|
10236
|
+
},
|
|
10237
|
+
{
|
|
10238
|
+
"path": "ext.bitrateMode",
|
|
10239
|
+
"valueType": "enum",
|
|
10240
|
+
"enumValues": ["vbr", "cbr"]
|
|
10241
|
+
},
|
|
10242
|
+
{
|
|
10243
|
+
"path": "ext.encoderProfile",
|
|
10244
|
+
"valueType": "enum",
|
|
10245
|
+
"enumValues": [
|
|
10246
|
+
"high",
|
|
10247
|
+
"main",
|
|
10248
|
+
"baseline"
|
|
10249
|
+
]
|
|
10250
|
+
},
|
|
10251
|
+
{
|
|
10252
|
+
"path": "ext.gop",
|
|
10253
|
+
"valueType": "number"
|
|
10254
|
+
},
|
|
10255
|
+
{
|
|
10256
|
+
"path": "ext.audio",
|
|
10257
|
+
"valueType": "boolean"
|
|
10258
|
+
}
|
|
10259
|
+
],
|
|
10260
|
+
"switch": [{
|
|
10261
|
+
"path": "on",
|
|
10262
|
+
"valueType": "boolean"
|
|
10263
|
+
}],
|
|
10264
|
+
"tamper": [{
|
|
10265
|
+
"path": "tampered",
|
|
10266
|
+
"valueType": "boolean"
|
|
10267
|
+
}],
|
|
10268
|
+
"temperature-sensor": [
|
|
10269
|
+
{
|
|
10270
|
+
"path": "celsius",
|
|
10271
|
+
"valueType": "number"
|
|
10272
|
+
},
|
|
10273
|
+
{
|
|
10274
|
+
"path": "unit",
|
|
10275
|
+
"valueType": "string"
|
|
10276
|
+
},
|
|
10277
|
+
{
|
|
10278
|
+
"path": "precision",
|
|
10279
|
+
"valueType": "number"
|
|
10280
|
+
}
|
|
10281
|
+
],
|
|
10282
|
+
"update": [
|
|
10283
|
+
{
|
|
10284
|
+
"path": "currentVersion",
|
|
10285
|
+
"valueType": "string"
|
|
10286
|
+
},
|
|
10287
|
+
{
|
|
10288
|
+
"path": "availableVersion",
|
|
10289
|
+
"valueType": "string"
|
|
10290
|
+
},
|
|
10291
|
+
{
|
|
10292
|
+
"path": "updatable",
|
|
10293
|
+
"valueType": "boolean"
|
|
10294
|
+
},
|
|
10295
|
+
{
|
|
10296
|
+
"path": "state",
|
|
10297
|
+
"valueType": "string"
|
|
10298
|
+
},
|
|
10299
|
+
{
|
|
10300
|
+
"path": "inProgress",
|
|
10301
|
+
"valueType": "boolean"
|
|
10302
|
+
}
|
|
10303
|
+
],
|
|
10304
|
+
"vacuum-control": [
|
|
10305
|
+
{
|
|
10306
|
+
"path": "state",
|
|
10307
|
+
"valueType": "enum",
|
|
10308
|
+
"enumValues": [
|
|
10309
|
+
"idle",
|
|
10310
|
+
"cleaning",
|
|
10311
|
+
"paused",
|
|
10312
|
+
"returning",
|
|
10313
|
+
"docked",
|
|
10314
|
+
"drying",
|
|
10315
|
+
"error"
|
|
10316
|
+
]
|
|
10317
|
+
},
|
|
10318
|
+
{
|
|
10319
|
+
"path": "batteryLevel",
|
|
10320
|
+
"valueType": "number"
|
|
10321
|
+
},
|
|
10322
|
+
{
|
|
10323
|
+
"path": "fanSpeed",
|
|
10324
|
+
"valueType": "string"
|
|
10325
|
+
},
|
|
10326
|
+
{
|
|
10327
|
+
"path": "progressPercent",
|
|
10328
|
+
"valueType": "number"
|
|
10329
|
+
},
|
|
10330
|
+
{
|
|
10331
|
+
"path": "errorCode",
|
|
10332
|
+
"valueType": "number"
|
|
10333
|
+
},
|
|
10334
|
+
{
|
|
10335
|
+
"path": "errorLabel",
|
|
10336
|
+
"valueType": "string"
|
|
10337
|
+
}
|
|
10338
|
+
],
|
|
10339
|
+
"valve": [{
|
|
10340
|
+
"path": "state",
|
|
10341
|
+
"valueType": "enum",
|
|
10342
|
+
"enumValues": [
|
|
10343
|
+
"open",
|
|
10344
|
+
"opening",
|
|
10345
|
+
"closing",
|
|
10346
|
+
"closed",
|
|
10347
|
+
"stopped"
|
|
10348
|
+
]
|
|
10349
|
+
}, {
|
|
10350
|
+
"path": "position",
|
|
10351
|
+
"valueType": "number"
|
|
10352
|
+
}],
|
|
10353
|
+
"vibration": [{
|
|
10354
|
+
"path": "detected",
|
|
10355
|
+
"valueType": "boolean"
|
|
10356
|
+
}],
|
|
10357
|
+
"water-heater": [
|
|
10358
|
+
{
|
|
10359
|
+
"path": "currentTemp",
|
|
10360
|
+
"valueType": "number"
|
|
10361
|
+
},
|
|
10362
|
+
{
|
|
10363
|
+
"path": "targetTemp",
|
|
10364
|
+
"valueType": "number"
|
|
10365
|
+
},
|
|
10366
|
+
{
|
|
10367
|
+
"path": "operationMode",
|
|
10368
|
+
"valueType": "string"
|
|
10369
|
+
},
|
|
10370
|
+
{
|
|
10371
|
+
"path": "away",
|
|
10372
|
+
"valueType": "boolean"
|
|
10373
|
+
},
|
|
10374
|
+
{
|
|
10375
|
+
"path": "minTemp",
|
|
10376
|
+
"valueType": "number"
|
|
10377
|
+
},
|
|
10378
|
+
{
|
|
10379
|
+
"path": "maxTemp",
|
|
10380
|
+
"valueType": "number"
|
|
10381
|
+
}
|
|
10382
|
+
],
|
|
10383
|
+
"weather": [
|
|
10384
|
+
{
|
|
10385
|
+
"path": "condition",
|
|
10386
|
+
"valueType": "string"
|
|
10387
|
+
},
|
|
10388
|
+
{
|
|
10389
|
+
"path": "temperature",
|
|
10390
|
+
"valueType": "number"
|
|
10391
|
+
},
|
|
10392
|
+
{
|
|
10393
|
+
"path": "temperatureUnit",
|
|
10394
|
+
"valueType": "string"
|
|
10395
|
+
},
|
|
10396
|
+
{
|
|
10397
|
+
"path": "humidity",
|
|
10398
|
+
"valueType": "number"
|
|
10399
|
+
},
|
|
10400
|
+
{
|
|
10401
|
+
"path": "pressure",
|
|
10402
|
+
"valueType": "number"
|
|
10403
|
+
},
|
|
10404
|
+
{
|
|
10405
|
+
"path": "pressureUnit",
|
|
10406
|
+
"valueType": "string"
|
|
10407
|
+
},
|
|
10408
|
+
{
|
|
10409
|
+
"path": "windSpeed",
|
|
10410
|
+
"valueType": "number"
|
|
10411
|
+
},
|
|
10412
|
+
{
|
|
10413
|
+
"path": "windSpeedUnit",
|
|
10414
|
+
"valueType": "string"
|
|
10415
|
+
},
|
|
10416
|
+
{
|
|
10417
|
+
"path": "windBearing",
|
|
10418
|
+
"valueType": "number"
|
|
10419
|
+
}
|
|
10420
|
+
],
|
|
10421
|
+
"zone-analytics": [
|
|
10422
|
+
{
|
|
10423
|
+
"path": "ts",
|
|
10424
|
+
"valueType": "number"
|
|
10425
|
+
},
|
|
10426
|
+
{
|
|
10427
|
+
"path": "frameWidth",
|
|
10428
|
+
"valueType": "number"
|
|
10429
|
+
},
|
|
10430
|
+
{
|
|
10431
|
+
"path": "frameHeight",
|
|
10432
|
+
"valueType": "number"
|
|
10433
|
+
},
|
|
10434
|
+
{
|
|
10435
|
+
"path": "frame.totalObjects",
|
|
10436
|
+
"valueType": "number"
|
|
10437
|
+
},
|
|
10438
|
+
{
|
|
10439
|
+
"path": "frame.standingObjects",
|
|
10440
|
+
"valueType": "number"
|
|
10441
|
+
},
|
|
10442
|
+
{
|
|
10443
|
+
"path": "frame.transientObjects",
|
|
10444
|
+
"valueType": "number"
|
|
10445
|
+
},
|
|
10446
|
+
{
|
|
10447
|
+
"path": "unzoned.totalObjects",
|
|
10448
|
+
"valueType": "number"
|
|
10449
|
+
},
|
|
10450
|
+
{
|
|
10451
|
+
"path": "unzoned.standingObjects",
|
|
10452
|
+
"valueType": "number"
|
|
10453
|
+
},
|
|
10454
|
+
{
|
|
10455
|
+
"path": "unzoned.transientObjects",
|
|
10456
|
+
"valueType": "number"
|
|
10457
|
+
}
|
|
10458
|
+
]
|
|
10459
|
+
});
|
|
8486
10460
|
object({
|
|
8487
10461
|
code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
|
|
8488
10462
|
params: record(string(), union([string(), number()])).optional()
|
|
@@ -8841,7 +10815,7 @@ function errMsg(err) {
|
|
|
8841
10815
|
return String(err);
|
|
8842
10816
|
}
|
|
8843
10817
|
//#endregion
|
|
8844
|
-
//#region ../types/dist/composition-
|
|
10818
|
+
//#region ../types/dist/composition-kEl9mevu.mjs
|
|
8845
10819
|
/**
|
|
8846
10820
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
8847
10821
|
*
|
|
@@ -8901,7 +10875,7 @@ portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac
|
|
|
8901
10875
|
* ONE table for everyone who asks "is this device HIGH?": the
|
|
8902
10876
|
* recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
|
|
8903
10877
|
* sensor markers, the orchestrator's camera-sensors bridge and
|
|
8904
|
-
* the sources of a
|
|
10878
|
+
* the sources of a pulse (`compilePulseOverride`, D936).
|
|
8905
10879
|
* A second copy would diverge at the first cap added, and the symptom — "the
|
|
8906
10880
|
* sensor rings the doorbell but does not record" — is exactly D62.
|
|
8907
10881
|
*
|
|
@@ -12056,7 +14030,7 @@ var LogChannelDescriptorSchema = object({
|
|
|
12056
14030
|
* `true` is a PROMISE with two halves, and both must hold: the gate is
|
|
12057
14031
|
* consulted with the numeric device id, AND every line the channel admits
|
|
12058
14032
|
* carries `tags: { deviceId }` with that same numeric id. The second half is
|
|
12059
|
-
* what makes `| json | deviceId="
|
|
14033
|
+
* what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
|
|
12060
14034
|
* keeps `deviceId` out of the stream labels for cardinality, so the tag in
|
|
12061
14035
|
* the body is the only way to filter.
|
|
12062
14036
|
*
|
|
@@ -12244,7 +14218,7 @@ var ModelVariantGroupSchema = object({
|
|
|
12244
14218
|
precision: _enum(["fp32", "int8"]).optional(),
|
|
12245
14219
|
/**
|
|
12246
14220
|
* Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
|
|
12247
|
-
* an alternate training of the same family (
|
|
14221
|
+
* an alternate training of the same family (plugin catalog `relu_test`); chip
|
|
12248
14222
|
* label is "Test".
|
|
12249
14223
|
*/
|
|
12250
14224
|
optimization: _enum(["standard", "test"]).optional(),
|
|
@@ -12496,8 +14470,8 @@ var ModelCatalogEntrySchema = object({
|
|
|
12496
14470
|
provider: ModelProviderIdSchema.optional(),
|
|
12497
14471
|
/**
|
|
12498
14472
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
12499
|
-
* applies (
|
|
12500
|
-
* labels already ARE the CamStack macros (
|
|
14473
|
+
* applies (plus catalog / COCO public catalog). Set on a custom model whose raw
|
|
14474
|
+
* labels already ARE the CamStack macros (plugin catalog identity map).
|
|
12501
14475
|
*/
|
|
12502
14476
|
classMap: DetectionCatalogClassMapSchema.optional(),
|
|
12503
14477
|
/**
|
|
@@ -15466,7 +17440,7 @@ method(object({
|
|
|
15466
17440
|
* `1` is real time and is the ONLY value that allows the copy branch —
|
|
15467
17441
|
* anything else forces `libx264` over the window. That was priced
|
|
15468
17442
|
* before it was chosen: a per-event burst measured at 0.23 s and 254 KB
|
|
15469
|
-
* on a real
|
|
17443
|
+
* on a real 101 720p cut, against 922 KB for the copy it replaces. A
|
|
15470
17444
|
* re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
|
|
15471
17445
|
* once the decode is forced the width stops being free.
|
|
15472
17446
|
*/
|
|
@@ -15992,6 +17966,7 @@ var CompositionRunStatusSchema = _enum([
|
|
|
15992
17966
|
"starting",
|
|
15993
17967
|
"running",
|
|
15994
17968
|
"degraded",
|
|
17969
|
+
"incomplete",
|
|
15995
17970
|
"failed"
|
|
15996
17971
|
]);
|
|
15997
17972
|
var CompositionFieldStateKindSchema = _enum([
|
|
@@ -16041,6 +18016,13 @@ var ComposerUnreadableBlockSchema = object({
|
|
|
16041
18016
|
/** The parse error, in the operator's words. */
|
|
16042
18017
|
error: string()
|
|
16043
18018
|
});
|
|
18019
|
+
/** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
|
|
18020
|
+
var UnreleasedClaimSchema = object({
|
|
18021
|
+
deviceId: number().int(),
|
|
18022
|
+
capName: string(),
|
|
18023
|
+
owner: string(),
|
|
18024
|
+
error: string()
|
|
18025
|
+
});
|
|
16044
18026
|
method(object({
|
|
16045
18027
|
/** The shared Blocks integration; null until `core-blocks` has reconciled it. */
|
|
16046
18028
|
integrationId: string().nullable(),
|
|
@@ -16050,7 +18032,13 @@ method(object({
|
|
|
16050
18032
|
/** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
|
|
16051
18033
|
restartBlockIds: array(string()),
|
|
16052
18034
|
/** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
|
|
16053
|
-
unreadableBlocks: array(ComposerUnreadableBlockSchema)
|
|
18035
|
+
unreadableBlocks: array(ComposerUnreadableBlockSchema),
|
|
18036
|
+
/**
|
|
18037
|
+
* Operator-confirmed deletions. Their claims are released on this apply,
|
|
18038
|
+
* before any replacement block claims. A block that merely vanished from the
|
|
18039
|
+
* snapshot is not listed here and still waits for two applies (D49).
|
|
18040
|
+
*/
|
|
18041
|
+
retiredBlockIds: array(string()).optional()
|
|
16054
18042
|
}), object({
|
|
16055
18043
|
blocks: array(object({
|
|
16056
18044
|
blockId: string(),
|
|
@@ -16062,7 +18050,13 @@ method(object({
|
|
|
16062
18050
|
* integration unknown, its own rows unread or read empty once). An empty
|
|
16063
18051
|
* apply the caller owes is paid off only by one the composer acted on (D49).
|
|
16064
18052
|
*/
|
|
16065
|
-
acted: boolean()
|
|
18053
|
+
acted: boolean(),
|
|
18054
|
+
/**
|
|
18055
|
+
* Confirmed releases this apply tried and the hub did not accept. Empty when
|
|
18056
|
+
* every one landed (or there was nothing to hand back). Absent on a result
|
|
18057
|
+
* that never got that far.
|
|
18058
|
+
*/
|
|
18059
|
+
unreleasedClaims: array(UnreleasedClaimSchema).optional()
|
|
16066
18060
|
}), {
|
|
16067
18061
|
kind: "mutation",
|
|
16068
18062
|
auth: "admin"
|
|
@@ -16186,6 +18180,7 @@ var CoreBlockStatusSchema = _enum([
|
|
|
16186
18180
|
"starting",
|
|
16187
18181
|
"running",
|
|
16188
18182
|
"degraded",
|
|
18183
|
+
"incomplete",
|
|
16189
18184
|
"failed"
|
|
16190
18185
|
]);
|
|
16191
18186
|
/** path → TypeScript source for a multi-file block. */
|
|
@@ -38237,7 +40232,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
|
|
|
38237
40232
|
* `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
|
|
38238
40233
|
* operator's casing. The registry matches labels trimmed + case-insensitively
|
|
38239
40234
|
* everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
|
|
38240
|
-
* case-only rename (`
|
|
40235
|
+
* case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
|
|
38241
40236
|
* map keyed on the displayed casing would orphan its entry on exactly that
|
|
38242
40237
|
* edit. Consumers join by keying their own label through `locationIconKey`.
|
|
38243
40238
|
*/
|
|
@@ -38262,7 +40257,7 @@ var LocationDescriptionAssignmentSchema = object({
|
|
|
38262
40257
|
/**
|
|
38263
40258
|
* A SITE ZONE — a named part of the property that several locations belong to.
|
|
38264
40259
|
*
|
|
38265
|
-
* "
|
|
40260
|
+
* "Night zone" holds every bedroom; "Zona giorno" the living room and the
|
|
38266
40261
|
* kitchen. A camera belongs to exactly one location, and a location to at most
|
|
38267
40262
|
* one zone, so a camera's zone is derived and never stored on the device: the
|
|
38268
40263
|
* whole point of this entity is that grouping rooms touches no device row.
|
|
@@ -38291,7 +40286,7 @@ var LocationDescriptionAssignmentSchema = object({
|
|
|
38291
40286
|
* the locations inside it.
|
|
38292
40287
|
*
|
|
38293
40288
|
* The LABEL is carried alongside the key because the key is lossy on purpose —
|
|
38294
|
-
* a surface must show "
|
|
40289
|
+
* a surface must show "Night zone", not "night zone". Locations are carried
|
|
38295
40290
|
* here, rather than left to a second call, because every consumer wants both
|
|
38296
40291
|
* at once and a viewer that asked twice could render a zone whose membership
|
|
38297
40292
|
* it has not fetched yet.
|
|
@@ -40485,8 +42480,8 @@ var LoadContributionSchema = object({
|
|
|
40485
42480
|
"unattributable"
|
|
40486
42481
|
]),
|
|
40487
42482
|
/**
|
|
40488
|
-
* What ONE entry is, in the contributor's own words — `
|
|
40489
|
-
* `
|
|
42483
|
+
* What ONE entry is, in the contributor's own words — `101/high`,
|
|
42484
|
+
* `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
|
|
40490
42485
|
* family and inventing a common one would lose the only information that
|
|
40491
42486
|
* makes two entries for the same camera distinguishable.
|
|
40492
42487
|
*/
|
|
@@ -42134,6 +44129,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
|
|
|
42134
44129
|
for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
|
|
42135
44130
|
for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
|
|
42136
44131
|
/**
|
|
44132
|
+
* Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
|
|
44133
|
+
* not entries. `heatmapScrub` is a mark, not an event kind.
|
|
44134
|
+
*/
|
|
44135
|
+
var PALETTE_ENTRY_IDS = [
|
|
44136
|
+
"motion",
|
|
44137
|
+
"audio",
|
|
44138
|
+
"recording",
|
|
44139
|
+
"live",
|
|
44140
|
+
"heatmapScrub",
|
|
44141
|
+
"person",
|
|
44142
|
+
"vehicle",
|
|
44143
|
+
"animal",
|
|
44144
|
+
"package",
|
|
44145
|
+
"sensor",
|
|
44146
|
+
"control",
|
|
44147
|
+
"face",
|
|
44148
|
+
"plate",
|
|
44149
|
+
"car",
|
|
44150
|
+
"truck",
|
|
44151
|
+
"bus",
|
|
44152
|
+
"motorcycle",
|
|
44153
|
+
"bicycle",
|
|
44154
|
+
"airplane",
|
|
44155
|
+
"boat",
|
|
44156
|
+
"train",
|
|
44157
|
+
"bird",
|
|
44158
|
+
"dog",
|
|
44159
|
+
"cat",
|
|
44160
|
+
"horse",
|
|
44161
|
+
"sheep",
|
|
44162
|
+
"cow",
|
|
44163
|
+
"elephant",
|
|
44164
|
+
"bear",
|
|
44165
|
+
"zebra",
|
|
44166
|
+
"giraffe",
|
|
44167
|
+
"package-delivered",
|
|
44168
|
+
"package-picked-up",
|
|
44169
|
+
"suitcase",
|
|
44170
|
+
"backpack",
|
|
44171
|
+
"handbag",
|
|
44172
|
+
"contact",
|
|
44173
|
+
"motion-sensor",
|
|
44174
|
+
"smoke",
|
|
44175
|
+
"flood",
|
|
44176
|
+
"gas",
|
|
44177
|
+
"carbon-monoxide",
|
|
44178
|
+
"vibration",
|
|
44179
|
+
"tamper",
|
|
44180
|
+
"presence",
|
|
44181
|
+
"enum-sensor",
|
|
44182
|
+
"device-event",
|
|
44183
|
+
"lock",
|
|
44184
|
+
"cover",
|
|
44185
|
+
"switch",
|
|
44186
|
+
"siren",
|
|
44187
|
+
"button",
|
|
44188
|
+
"doorbell"
|
|
44189
|
+
];
|
|
44190
|
+
var AUDIO_ENTRY_ID = "audio";
|
|
44191
|
+
/** Six rungs, quiet → loud. The opaque end is the entry's hex. */
|
|
44192
|
+
var AUDIO_GRADIENT_ALPHAS = [
|
|
44193
|
+
.3,
|
|
44194
|
+
.42,
|
|
44195
|
+
.55,
|
|
44196
|
+
.7,
|
|
44197
|
+
.85,
|
|
44198
|
+
1
|
|
44199
|
+
];
|
|
44200
|
+
var PALETTE_PRESET_IDS = [
|
|
44201
|
+
"camstack",
|
|
44202
|
+
"high-contrast",
|
|
44203
|
+
"okabe-ito"
|
|
44204
|
+
];
|
|
44205
|
+
/** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
|
|
44206
|
+
var CAMSTACK_HEX = {
|
|
44207
|
+
motion: "#d946ef",
|
|
44208
|
+
audio: "#059eb8",
|
|
44209
|
+
recording: "#ef4444",
|
|
44210
|
+
live: "#8d7a00",
|
|
44211
|
+
heatmapScrub: "#4b32ff",
|
|
44212
|
+
person: "#11a64c",
|
|
44213
|
+
vehicle: "#3b82f6",
|
|
44214
|
+
animal: "#ea6a09",
|
|
44215
|
+
package: "#924667",
|
|
44216
|
+
sensor: "#624bbc",
|
|
44217
|
+
control: "#944d24",
|
|
44218
|
+
face: "#ed4f8d",
|
|
44219
|
+
plate: "#4b7027",
|
|
44220
|
+
car: "#9684cf",
|
|
44221
|
+
truck: "#0f9b89",
|
|
44222
|
+
bus: "#a734a9",
|
|
44223
|
+
motorcycle: "#c1133a",
|
|
44224
|
+
bicycle: "#0e6a9b",
|
|
44225
|
+
airplane: "#7c9928",
|
|
44226
|
+
boat: "#b17933",
|
|
44227
|
+
train: "#ad6ca3",
|
|
44228
|
+
bird: "#0f7c55",
|
|
44229
|
+
dog: "#c82700",
|
|
44230
|
+
cat: "#7268f2",
|
|
44231
|
+
horse: "#cb795e",
|
|
44232
|
+
sheep: "#b8636b",
|
|
44233
|
+
cow: "#cb2969",
|
|
44234
|
+
elephant: "#1158d2",
|
|
44235
|
+
bear: "#8d5e00",
|
|
44236
|
+
zebra: "#0097d6",
|
|
44237
|
+
giraffe: "#8f61bb",
|
|
44238
|
+
"package-delivered": "#cd3f9b",
|
|
44239
|
+
"package-picked-up": "#388a08",
|
|
44240
|
+
suitcase: "#666800",
|
|
44241
|
+
backpack: "#ec5022",
|
|
44242
|
+
handbag: "#a76ef8",
|
|
44243
|
+
contact: "#ab5a49",
|
|
44244
|
+
"motion-sensor": "#b95d1a",
|
|
44245
|
+
smoke: "#dd3858",
|
|
44246
|
+
flood: "#b31e7d",
|
|
44247
|
+
gas: "#5b70b5",
|
|
44248
|
+
"carbon-monoxide": "#7b4e8e",
|
|
44249
|
+
vibration: "#e65bba",
|
|
44250
|
+
tamper: "#98464b",
|
|
44251
|
+
presence: "#3a9468",
|
|
44252
|
+
"enum-sensor": "#7885f8",
|
|
44253
|
+
"device-event": "#8c43c8",
|
|
44254
|
+
lock: "#649653",
|
|
44255
|
+
cover: "#c67597",
|
|
44256
|
+
switch: "#7a812a",
|
|
44257
|
+
siren: "#ac5d7f",
|
|
44258
|
+
button: "#b276cd",
|
|
44259
|
+
doorbell: "#0087ab"
|
|
44260
|
+
};
|
|
44261
|
+
var CAMSTACK_FALLBACK = [
|
|
44262
|
+
"#b34dc7",
|
|
44263
|
+
"#1d7d34",
|
|
44264
|
+
"#db6b6c",
|
|
44265
|
+
"#a43d29",
|
|
44266
|
+
"#0e6ee6",
|
|
44267
|
+
"#29a10b",
|
|
44268
|
+
"#a98731",
|
|
44269
|
+
"#0181c6"
|
|
44270
|
+
];
|
|
44271
|
+
var HIGH_CONTRAST_HEX = {
|
|
44272
|
+
motion: "#964360",
|
|
44273
|
+
audio: "#23a132",
|
|
44274
|
+
recording: "#2494ca",
|
|
44275
|
+
live: "#bd7e2b",
|
|
44276
|
+
heatmapScrub: "#ad6eea",
|
|
44277
|
+
person: "#62611e",
|
|
44278
|
+
vehicle: "#f4534c",
|
|
44279
|
+
animal: "#1556cd",
|
|
44280
|
+
package: "#9c4415",
|
|
44281
|
+
sensor: "#066c48",
|
|
44282
|
+
control: "#f2479f",
|
|
44283
|
+
face: "#139d8a",
|
|
44284
|
+
plate: "#909024",
|
|
44285
|
+
car: "#8e35ab",
|
|
44286
|
+
truck: "#bd0b2b",
|
|
44287
|
+
bus: "#7a88ca",
|
|
44288
|
+
motorcycle: "#e26725",
|
|
44289
|
+
bicycle: "#a6679b",
|
|
44290
|
+
airplane: "#7c5720",
|
|
44291
|
+
boat: "#467a1b",
|
|
44292
|
+
train: "#6f65a4",
|
|
44293
|
+
bird: "#cb717f",
|
|
44294
|
+
dog: "#c62490",
|
|
44295
|
+
cat: "#b36850",
|
|
44296
|
+
horse: "#1872ac",
|
|
44297
|
+
sheep: "#927939",
|
|
44298
|
+
cow: "#428a5c",
|
|
44299
|
+
elephant: "#d41160",
|
|
44300
|
+
bear: "#799453",
|
|
44301
|
+
zebra: "#a85455",
|
|
44302
|
+
giraffe: "#746be8",
|
|
44303
|
+
"package-delivered": "#824a80",
|
|
44304
|
+
"package-picked-up": "#614ac1",
|
|
44305
|
+
suitcase: "#2f77f3",
|
|
44306
|
+
backpack: "#fa476d",
|
|
44307
|
+
handbag: "#c14cbe",
|
|
44308
|
+
contact: "#c83921",
|
|
44309
|
+
"motion-sensor": "#a07ebd",
|
|
44310
|
+
smoke: "#a25b13",
|
|
44311
|
+
flood: "#526bab",
|
|
44312
|
+
gas: "#924938",
|
|
44313
|
+
"carbon-monoxide": "#bb7e53",
|
|
44314
|
+
vibration: "#b66182",
|
|
44315
|
+
tamper: "#3c6931",
|
|
44316
|
+
presence: "#6c851d",
|
|
44317
|
+
"enum-sensor": "#ad2d48",
|
|
44318
|
+
"device-event": "#5e9b04",
|
|
44319
|
+
lock: "#00a062",
|
|
44320
|
+
cover: "#ad8624",
|
|
44321
|
+
switch: "#d05259",
|
|
44322
|
+
siren: "#cd67b3",
|
|
44323
|
+
button: "#c9746a",
|
|
44324
|
+
doorbell: "#338eeb"
|
|
44325
|
+
};
|
|
44326
|
+
var HIGH_CONTRAST_FALLBACK = [
|
|
44327
|
+
"#817f3b",
|
|
44328
|
+
"#a0733e",
|
|
44329
|
+
"#8658b2",
|
|
44330
|
+
"#956301",
|
|
44331
|
+
"#bc652d",
|
|
44332
|
+
"#647331",
|
|
44333
|
+
"#a14c9e",
|
|
44334
|
+
"#d14e71"
|
|
44335
|
+
];
|
|
44336
|
+
var OKABE_ITO_HEX = {
|
|
44337
|
+
motion: "#b88128",
|
|
44338
|
+
audio: "#1096c8",
|
|
44339
|
+
recording: "#009e73",
|
|
44340
|
+
live: "#9c8c22",
|
|
44341
|
+
heatmapScrub: "#0072b2",
|
|
44342
|
+
person: "#d55e00",
|
|
44343
|
+
vehicle: "#c0739f",
|
|
44344
|
+
animal: "#226d18",
|
|
44345
|
+
package: "#91446c",
|
|
44346
|
+
sensor: "#217b56",
|
|
44347
|
+
control: "#648647",
|
|
44348
|
+
face: "#c22998",
|
|
44349
|
+
plate: "#fa4575",
|
|
44350
|
+
car: "#956301",
|
|
44351
|
+
truck: "#2f77f3",
|
|
44352
|
+
bus: "#7a4e86",
|
|
44353
|
+
motorcycle: "#f54597",
|
|
44354
|
+
bicycle: "#bb3e75",
|
|
44355
|
+
airplane: "#e054c0",
|
|
44356
|
+
boat: "#457942",
|
|
44357
|
+
train: "#867afa",
|
|
44358
|
+
bird: "#88914c",
|
|
44359
|
+
dog: "#1556cd",
|
|
44360
|
+
cat: "#71702c",
|
|
44361
|
+
horse: "#9b4fa4",
|
|
44362
|
+
sheep: "#c0559d",
|
|
44363
|
+
cow: "#d14f65",
|
|
44364
|
+
elephant: "#98470f",
|
|
44365
|
+
bear: "#595896",
|
|
44366
|
+
zebra: "#96790e",
|
|
44367
|
+
giraffe: "#cb717b",
|
|
44368
|
+
"package-delivered": "#139d8a",
|
|
44369
|
+
"package-picked-up": "#906ead",
|
|
44370
|
+
suitcase: "#d02939",
|
|
44371
|
+
backpack: "#d41160",
|
|
44372
|
+
handbag: "#f64f54",
|
|
44373
|
+
contact: "#7258d2",
|
|
44374
|
+
"motion-sensor": "#b66182",
|
|
44375
|
+
smoke: "#627abb",
|
|
44376
|
+
flood: "#b86ae4",
|
|
44377
|
+
gas: "#a95261",
|
|
44378
|
+
"carbon-monoxide": "#c65d3c",
|
|
44379
|
+
vibration: "#7a40b7",
|
|
44380
|
+
tamper: "#914b34",
|
|
44381
|
+
presence: "#9481c3",
|
|
44382
|
+
"enum-sensor": "#ac6d47",
|
|
44383
|
+
"device-event": "#7b6fce",
|
|
44384
|
+
lock: "#c67662",
|
|
44385
|
+
cover: "#a6564d",
|
|
44386
|
+
switch: "#ad2c4e",
|
|
44387
|
+
siren: "#348e08",
|
|
44388
|
+
button: "#d27303",
|
|
44389
|
+
doorbell: "#55770f"
|
|
44390
|
+
};
|
|
44391
|
+
var OKABE_ITO_FALLBACK = [
|
|
44392
|
+
"#9a3784",
|
|
44393
|
+
"#a7392c",
|
|
44394
|
+
"#409d50",
|
|
44395
|
+
"#6987e7",
|
|
44396
|
+
"#ee5b3d",
|
|
44397
|
+
"#c0430d",
|
|
44398
|
+
"#af79b3",
|
|
44399
|
+
"#4b6628"
|
|
44400
|
+
];
|
|
44401
|
+
/**
|
|
44402
|
+
* The display palette (D939). One table of colours, three presets, one
|
|
44403
|
+
* validator. Taxonomy colours and every consumer read this — there is no
|
|
44404
|
+
* second hex table.
|
|
44405
|
+
*/
|
|
44406
|
+
var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
|
|
44407
|
+
var paletteSwatchSchema = discriminatedUnion("form", [object({
|
|
44408
|
+
form: literal("solid"),
|
|
44409
|
+
hex: paletteHexSchema
|
|
44410
|
+
}), object({
|
|
44411
|
+
form: literal("gradient"),
|
|
44412
|
+
hex: paletteHexSchema,
|
|
44413
|
+
alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
|
|
44414
|
+
})]);
|
|
44415
|
+
var paletteReadySchema = object({
|
|
44416
|
+
status: literal("ready"),
|
|
44417
|
+
presetId: _enum(PALETTE_PRESET_IDS),
|
|
44418
|
+
customized: boolean(),
|
|
44419
|
+
source: _enum(["stored", "unconfigured"]),
|
|
44420
|
+
swatches: record(string(), paletteSwatchSchema),
|
|
44421
|
+
fallbacks: array(paletteHexSchema).length(8)
|
|
44422
|
+
});
|
|
44423
|
+
var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
|
|
44424
|
+
status: literal("unknown"),
|
|
44425
|
+
reason: string()
|
|
44426
|
+
})]);
|
|
44427
|
+
var setPaletteInputSchema = union([object({ presetId: string() }), object({
|
|
44428
|
+
presetId: string(),
|
|
44429
|
+
overrides: record(string(), paletteSwatchSchema)
|
|
44430
|
+
})]);
|
|
44431
|
+
object({
|
|
44432
|
+
presetId: string(),
|
|
44433
|
+
overrides: record(string(), paletteSwatchSchema)
|
|
44434
|
+
});
|
|
44435
|
+
function solid(hex) {
|
|
44436
|
+
return {
|
|
44437
|
+
form: "solid",
|
|
44438
|
+
hex
|
|
44439
|
+
};
|
|
44440
|
+
}
|
|
44441
|
+
function audioGradient(hex) {
|
|
44442
|
+
return {
|
|
44443
|
+
form: "gradient",
|
|
44444
|
+
hex,
|
|
44445
|
+
alphas: [...AUDIO_GRADIENT_ALPHAS]
|
|
44446
|
+
};
|
|
44447
|
+
}
|
|
44448
|
+
function swatchesFrom(hexes) {
|
|
44449
|
+
const out = {};
|
|
44450
|
+
for (const id of PALETTE_ENTRY_IDS) {
|
|
44451
|
+
const hex = hexes[id];
|
|
44452
|
+
if (hex === void 0) throw new Error(`palette table missing ${id}`);
|
|
44453
|
+
out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
|
|
44454
|
+
}
|
|
44455
|
+
return out;
|
|
44456
|
+
}
|
|
44457
|
+
function preset(id, name, hexes, fallbacks) {
|
|
44458
|
+
return {
|
|
44459
|
+
id,
|
|
44460
|
+
name,
|
|
44461
|
+
swatches: swatchesFrom(hexes),
|
|
44462
|
+
fallbacks
|
|
44463
|
+
};
|
|
44464
|
+
}
|
|
44465
|
+
var DISPLAY_PRESETS = [
|
|
44466
|
+
preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
|
|
44467
|
+
preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
|
|
44468
|
+
preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
|
|
44469
|
+
];
|
|
44470
|
+
function presetById(id) {
|
|
44471
|
+
return DISPLAY_PRESETS.find((item) => item.id === id);
|
|
44472
|
+
}
|
|
44473
|
+
function bundledCamstack() {
|
|
44474
|
+
const presetRow = presetById("camstack");
|
|
44475
|
+
if (presetRow === void 0) throw new Error("CamStack preset missing");
|
|
44476
|
+
return readyOf(presetRow, "unconfigured", false);
|
|
44477
|
+
}
|
|
44478
|
+
function readyOf(row, source, customized) {
|
|
44479
|
+
return {
|
|
44480
|
+
status: "ready",
|
|
44481
|
+
presetId: row.id,
|
|
44482
|
+
customized,
|
|
44483
|
+
source,
|
|
44484
|
+
swatches: row.swatches,
|
|
44485
|
+
fallbacks: [...row.fallbacks]
|
|
44486
|
+
};
|
|
44487
|
+
}
|
|
44488
|
+
function hashFallback(kind, fallbacks) {
|
|
44489
|
+
let hash = 0;
|
|
44490
|
+
for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
|
|
44491
|
+
const hex = fallbacks[hash % fallbacks.length];
|
|
44492
|
+
if (hex === void 0) throw new Error("display palette has no fallback colour");
|
|
44493
|
+
return hex;
|
|
44494
|
+
}
|
|
44495
|
+
/** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
|
|
44496
|
+
function paintHex(swatches, fallbacks, kind) {
|
|
44497
|
+
const key = kind.trim().toLowerCase();
|
|
44498
|
+
if (key.startsWith("audio-")) {
|
|
44499
|
+
const audio = swatches[AUDIO_ENTRY_ID];
|
|
44500
|
+
return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
|
|
44501
|
+
}
|
|
44502
|
+
const direct = swatches[key];
|
|
44503
|
+
if (direct !== void 0) return direct.hex;
|
|
44504
|
+
return hashFallback(key, fallbacks);
|
|
44505
|
+
}
|
|
44506
|
+
/**
|
|
42137
44507
|
* Unified event-kind taxonomy — THE single source of truth for
|
|
42138
44508
|
* `kind → { parentKind, category, level, color, iconId, labelKey, label,
|
|
42139
44509
|
* icon }`.
|
|
@@ -42147,109 +44517,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
|
|
|
42147
44517
|
* - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
|
|
42148
44518
|
* - the COCO / audio class maps (macro ↔ sub relationships)
|
|
42149
44519
|
*
|
|
42150
|
-
* The DATA (serializable —
|
|
42151
|
-
* `@camstack/types`.
|
|
42152
|
-
*
|
|
42153
|
-
*
|
|
42154
|
-
*
|
|
44520
|
+
* The DATA (serializable — parentKind / iconId / labelKey) lives here in
|
|
44521
|
+
* `@camstack/types`. Colour is NOT a second table: each entry's `color` is
|
|
44522
|
+
* the bundled CamStack display palette (D939). The effective cluster palette
|
|
44523
|
+
* is the `display-palette` capability. The UI-side mapping `iconId → lucide
|
|
44524
|
+
* component` and `labelKey → t()` lives in `@camstack/ui-library`.
|
|
42155
44525
|
*
|
|
42156
44526
|
* Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
|
|
42157
44527
|
*/
|
|
42158
|
-
var
|
|
42159
|
-
|
|
42160
|
-
|
|
42161
|
-
|
|
42162
|
-
|
|
42163
|
-
|
|
42164
|
-
|
|
42165
|
-
|
|
42166
|
-
|
|
42167
|
-
|
|
42168
|
-
};
|
|
42169
|
-
var DETECTION_SUB_COLORS = {
|
|
42170
|
-
car: "#f59e0b",
|
|
42171
|
-
truck: "#d97706",
|
|
42172
|
-
bus: "#b45309",
|
|
42173
|
-
motorcycle: "#eab308",
|
|
42174
|
-
bicycle: "#ca8a04",
|
|
42175
|
-
airplane: "#60a5fa",
|
|
42176
|
-
boat: "#2563eb",
|
|
42177
|
-
train: "#1d4ed8",
|
|
42178
|
-
bird: "#14b8a6",
|
|
42179
|
-
dog: "#84cc16",
|
|
42180
|
-
cat: "#f97316",
|
|
42181
|
-
horse: "#a16207",
|
|
42182
|
-
sheep: "#a3a3a3",
|
|
42183
|
-
cow: "#78716c",
|
|
42184
|
-
elephant: "#6b7280",
|
|
42185
|
-
bear: "#7c2d12",
|
|
42186
|
-
zebra: "#404040",
|
|
42187
|
-
giraffe: "#d4a373"
|
|
42188
|
-
};
|
|
44528
|
+
var BUNDLED_PALETTE = bundledCamstack();
|
|
44529
|
+
function kindColor(kind) {
|
|
44530
|
+
return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
|
|
44531
|
+
}
|
|
44532
|
+
function firstFallback(fallbacks) {
|
|
44533
|
+
const hex = fallbacks[0];
|
|
44534
|
+
if (hex === void 0) throw new Error("display palette has no fallback colour");
|
|
44535
|
+
return hex;
|
|
44536
|
+
}
|
|
44537
|
+
firstFallback(BUNDLED_PALETTE.fallbacks);
|
|
42189
44538
|
function titleCase(id) {
|
|
42190
44539
|
return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
|
|
42191
44540
|
}
|
|
42192
44541
|
var entries = /* @__PURE__ */ new Map();
|
|
42193
|
-
function macro(kind, category,
|
|
44542
|
+
function macro(kind, category, iconId, label) {
|
|
42194
44543
|
entries.set(kind, {
|
|
42195
44544
|
kind,
|
|
42196
44545
|
parentKind: null,
|
|
42197
44546
|
level: "macro",
|
|
42198
44547
|
category,
|
|
42199
|
-
color,
|
|
44548
|
+
color: kindColor(kind),
|
|
42200
44549
|
iconId,
|
|
42201
44550
|
labelKey: `eventKind.${kind}`,
|
|
42202
44551
|
label
|
|
42203
44552
|
});
|
|
42204
44553
|
}
|
|
42205
|
-
function sub(kind, parentKind, category,
|
|
44554
|
+
function sub(kind, parentKind, category, iconId, label) {
|
|
42206
44555
|
entries.set(kind, {
|
|
42207
44556
|
kind,
|
|
42208
44557
|
parentKind,
|
|
42209
44558
|
level: "sub",
|
|
42210
44559
|
category,
|
|
42211
|
-
color,
|
|
44560
|
+
color: kindColor(kind),
|
|
42212
44561
|
iconId,
|
|
42213
44562
|
labelKey: `eventKind.${kind}`,
|
|
42214
44563
|
label
|
|
42215
44564
|
});
|
|
42216
44565
|
}
|
|
42217
|
-
macro("motion", "motion",
|
|
42218
|
-
macro("audio", "audio",
|
|
42219
|
-
macro("person", "detection",
|
|
42220
|
-
macro("vehicle", "detection",
|
|
42221
|
-
macro("animal", "detection",
|
|
42222
|
-
macro("package", "package",
|
|
42223
|
-
macro("sensor", "sensor",
|
|
42224
|
-
macro("control", "control",
|
|
44566
|
+
macro("motion", "motion", "motion", "Motion");
|
|
44567
|
+
macro("audio", "audio", "audio", "Audio");
|
|
44568
|
+
macro("person", "detection", "person", "Person");
|
|
44569
|
+
macro("vehicle", "detection", "vehicle", "Vehicle");
|
|
44570
|
+
macro("animal", "detection", "animal", "Animal");
|
|
44571
|
+
macro("package", "package", "package", "Package");
|
|
44572
|
+
macro("sensor", "sensor", "sensor", "Sensor");
|
|
44573
|
+
macro("control", "control", "control", "Control");
|
|
42225
44574
|
for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
|
|
42226
44575
|
if (macroClass !== "vehicle" && macroClass !== "animal") continue;
|
|
42227
44576
|
if (entries.has(cocoClass)) continue;
|
|
42228
|
-
sub(cocoClass, macroClass, "detection",
|
|
44577
|
+
sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
|
|
42229
44578
|
}
|
|
42230
|
-
sub("package-delivered", "package", "package",
|
|
42231
|
-
sub("package-picked-up", "package", "package",
|
|
42232
|
-
sub("contact", "sensor", "sensor", "
|
|
42233
|
-
sub("motion-sensor", "sensor", "sensor",
|
|
42234
|
-
sub("smoke", "sensor", "sensor", "
|
|
42235
|
-
sub("flood", "sensor", "sensor", "
|
|
42236
|
-
sub("gas", "sensor", "sensor", "
|
|
42237
|
-
sub("carbon-monoxide", "sensor", "sensor", "
|
|
42238
|
-
sub("vibration", "sensor", "sensor", "
|
|
42239
|
-
sub("tamper", "sensor", "sensor", "
|
|
42240
|
-
sub("presence", "sensor", "sensor", "
|
|
42241
|
-
sub("enum-sensor", "sensor", "sensor",
|
|
42242
|
-
sub("device-event", "sensor", "sensor", "
|
|
42243
|
-
sub("lock", "control", "control", "
|
|
42244
|
-
sub("cover", "control", "control", "
|
|
42245
|
-
sub("switch", "control", "control",
|
|
42246
|
-
sub("siren", "control", "control", "
|
|
42247
|
-
sub("button", "control", "control", "
|
|
42248
|
-
sub("doorbell", "control", "control", "
|
|
44579
|
+
sub("package-delivered", "package", "package", "package", "Package delivered");
|
|
44580
|
+
sub("package-picked-up", "package", "package", "package", "Package picked up");
|
|
44581
|
+
sub("contact", "sensor", "sensor", "door", "Contact");
|
|
44582
|
+
sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
|
|
44583
|
+
sub("smoke", "sensor", "sensor", "smoke", "Smoke");
|
|
44584
|
+
sub("flood", "sensor", "sensor", "water", "Water leak");
|
|
44585
|
+
sub("gas", "sensor", "sensor", "gas", "Gas");
|
|
44586
|
+
sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
|
|
44587
|
+
sub("vibration", "sensor", "sensor", "vibration", "Vibration");
|
|
44588
|
+
sub("tamper", "sensor", "sensor", "tamper", "Tamper");
|
|
44589
|
+
sub("presence", "sensor", "sensor", "presence", "Presence");
|
|
44590
|
+
sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
|
|
44591
|
+
sub("device-event", "sensor", "sensor", "button", "Device event");
|
|
44592
|
+
sub("lock", "control", "control", "lock", "Lock");
|
|
44593
|
+
sub("cover", "control", "control", "door", "Cover");
|
|
44594
|
+
sub("switch", "control", "control", "switch", "Switch");
|
|
44595
|
+
sub("siren", "control", "control", "siren", "Siren");
|
|
44596
|
+
sub("button", "control", "control", "button", "Button");
|
|
44597
|
+
sub("doorbell", "control", "control", "doorbell", "Doorbell");
|
|
42249
44598
|
for (const l of AUDIO_MACRO_LABELS) {
|
|
42250
44599
|
const kind = `audio-${l.id}`;
|
|
42251
44600
|
if (entries.has(kind)) continue;
|
|
42252
|
-
sub(kind, "audio", "audio",
|
|
44601
|
+
sub(kind, "audio", "audio", kind, l.name);
|
|
42253
44602
|
}
|
|
42254
44603
|
/** The complete taxonomy dictionary, keyed by kind. */
|
|
42255
44604
|
var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
|
|
@@ -43136,7 +45485,7 @@ var NcConditionsSchema = object({
|
|
|
43136
45485
|
* with the list under it is worse than no switch (D62).
|
|
43137
45486
|
*
|
|
43138
45487
|
* MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
|
|
43139
|
-
* renameable, and a rule authored on "
|
|
45488
|
+
* renameable, and a rule authored on "Alice" went silently dark the moment
|
|
43140
45489
|
* the operator fixed the spelling. The id reaches the record on
|
|
43141
45490
|
* `LabelAttribution.identityId`; the name is what the editor shows and what
|
|
43142
45491
|
* `{{label}}` renders.
|
|
@@ -43687,7 +46036,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
|
|
|
43687
46036
|
* A rule scoped to one camera and one zone silently became a rule that
|
|
43688
46037
|
* matches EVERY event on EVERY camera, and lost its `media` policy
|
|
43689
46038
|
* (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
|
|
43690
|
-
* live on 2026-08-12: a rule scoped to device
|
|
46039
|
+
* live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
|
|
43691
46040
|
* within a minute of a two-field patch.
|
|
43692
46041
|
*
|
|
43693
46042
|
* So every defaulted field is re-declared here WITHOUT its default. The
|
|
@@ -45500,7 +47849,7 @@ var LabelAttributionSchema = object({
|
|
|
45500
47849
|
* `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
|
|
45501
47850
|
*
|
|
45502
47851
|
* The text alone is a DISPLAY NAME, and a display name is renameable: a
|
|
45503
|
-
* notification rule authored on "
|
|
47852
|
+
* notification rule authored on "Alice" stopped matching the moment the
|
|
45504
47853
|
* operator fixed the spelling in the gallery, and nothing said so. The id is
|
|
45505
47854
|
* the thing that does not move, so it is what a rule matches on
|
|
45506
47855
|
* (`NcConditions.identities`) and the text is what a human is shown.
|
|
@@ -48039,7 +50388,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
48039
50388
|
/**
|
|
48040
50389
|
* Root-supplied detections for the tree's ROOT step (D730). Set by
|
|
48041
50390
|
* `runDetailSubtree` when the camera's root model supplies a crop-kind
|
|
48042
|
-
* step (a
|
|
50391
|
+
* step (a plus catalog `license_plate` for `plate-detection`): the step is
|
|
48043
50392
|
* NOT inferred, these boxes are its output, and its children (the plate
|
|
48044
50393
|
* reader) run on them through their own crop policy. Boxes are in the
|
|
48045
50394
|
* PIXELS of the image this call carries. Absent ⇒ the root step runs.
|
|
@@ -49716,7 +52065,7 @@ var RunnerCameraConfigSchema = object({
|
|
|
49716
52065
|
* detection session that asks for history. What shipped was a last-moment
|
|
49717
52066
|
* discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
|
|
49718
52067
|
* arriving inside a few hundred ms of wall clock looks to it like one frame's
|
|
49719
|
-
* worth. Device
|
|
52068
|
+
* worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
|
|
49720
52069
|
* recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
|
|
49721
52070
|
* 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
|
|
49722
52071
|
* was decoded, and was freed.
|
|
@@ -51746,7 +54095,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
|
|
|
51746
54095
|
* The signals a device can emit to WAKE its own stream.
|
|
51747
54096
|
*
|
|
51748
54097
|
* A camera whose stream is built on demand sleeps until something asks for it,
|
|
51749
|
-
* and "something" cannot be a consumer that is merely attached — a
|
|
54098
|
+
* and "something" cannot be a consumer that is merely attached — a external-catalog
|
|
51750
54099
|
* puller holds a session open for ever, and treating that as demand would keep
|
|
51751
54100
|
* a battery camera awake for ever, which is the whole thing the battery is for
|
|
51752
54101
|
* (D173). So the wake has to come from the CAMERA: an event it noticed by
|
|
@@ -52466,7 +54815,7 @@ var ClipSchema = object({
|
|
|
52466
54815
|
* {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
|
|
52467
54816
|
*
|
|
52468
54817
|
* Bounded because it is not a payload the surface pages through: one visit on
|
|
52469
|
-
* device
|
|
54818
|
+
* device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
|
|
52470
54819
|
* camera-day. Read {@link eventCount} for the true total.
|
|
52471
54820
|
*/
|
|
52472
54821
|
eventIds: array(string()).optional(),
|
|
@@ -52611,7 +54960,7 @@ var ClipPlaybackSchema = object({
|
|
|
52611
54960
|
* camera has no recordings", which is the defect this whole line of work is
|
|
52612
54961
|
* about: a battery camera nobody woke (`sleeping`), a camera that could not be
|
|
52613
54962
|
* reached at all (`unreachable`, also what a provider that THREW reports), a
|
|
52614
|
-
* camera whose SD card is not mounted (`no-storage`, measured on
|
|
54963
|
+
* camera whose SD card is not mounted (`no-storage`, measured on 106 —
|
|
52615
54964
|
* `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
|
|
52616
54965
|
* camera whose OWN index disagrees with its OWN calendar (`index-empty`,
|
|
52617
54966
|
* measured on 618: the calendar marks 3–20 September, days 6–20 list zero
|
|
@@ -52876,7 +55225,7 @@ DeviceType.Camera, method(object({
|
|
|
52876
55225
|
*
|
|
52877
55226
|
* It was optional, documented as "absent means the device's BOUND
|
|
52878
55227
|
* provider, which is CamStack on every camera". No code implemented
|
|
52879
|
-
* that. Measured on the live hub 2026-09-20 — device
|
|
55228
|
+
* that. Measured on the live hub 2026-09-20 — device 107, bound to
|
|
52880
55229
|
* `recorder` AND `provider-reolink` — a bare call with `limit: 3`
|
|
52881
55230
|
* answered SIX rows, three from each source, merged newest-first:
|
|
52882
55231
|
* `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
|
|
@@ -54019,7 +56368,10 @@ var airQualitySensorCapability = {
|
|
|
54019
56368
|
*/
|
|
54020
56369
|
var AmbientLightSensorStatusSchema = object({
|
|
54021
56370
|
/** Current illuminance in lux (lx). */
|
|
54022
|
-
lux: number().min(0)
|
|
56371
|
+
lux: number().min(0).meta({
|
|
56372
|
+
unit: "lx",
|
|
56373
|
+
label: "Illuminance"
|
|
56374
|
+
}),
|
|
54023
56375
|
/** Ms epoch when the slice was last updated. */
|
|
54024
56376
|
lastFetchedAt: number(),
|
|
54025
56377
|
/** Live display unit from the upstream source (e.g. HA
|
|
@@ -54062,7 +56414,12 @@ var ambientLightSensorCapability = {
|
|
|
54062
56414
|
} } },
|
|
54063
56415
|
/** Clock fields: written, but excluded from the compare that decides
|
|
54064
56416
|
* whether persisting is worth a SQLite commit. */
|
|
54065
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
56417
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
56418
|
+
customize: {
|
|
56419
|
+
version: 1,
|
|
56420
|
+
advanced: "derive",
|
|
56421
|
+
targets: []
|
|
56422
|
+
}
|
|
54066
56423
|
};
|
|
54067
56424
|
/**
|
|
54068
56425
|
* Per-class audio metrics aggregated over a sliding window.
|
|
@@ -54289,7 +56646,10 @@ var BatteryStatusSchema = object({
|
|
|
54289
56646
|
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
54290
56647
|
* declines to band a non-finite reading, which is the correct shape.
|
|
54291
56648
|
*/
|
|
54292
|
-
percentage: number().min(0).max(100).nullable()
|
|
56649
|
+
percentage: number().min(0).max(100).nullable().meta({
|
|
56650
|
+
unit: "%",
|
|
56651
|
+
label: "Charge"
|
|
56652
|
+
}),
|
|
54293
56653
|
/**
|
|
54294
56654
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
54295
56655
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
|
@@ -54308,13 +56668,13 @@ var BatteryStatusSchema = object({
|
|
|
54308
56668
|
"solar",
|
|
54309
56669
|
"none",
|
|
54310
56670
|
"unknown"
|
|
54311
|
-
]),
|
|
56671
|
+
]).meta({ label: "Charging source" }),
|
|
54312
56672
|
/**
|
|
54313
56673
|
* True when the camera firmware has gone into low-power mode. Battery
|
|
54314
56674
|
* providers MUST avoid polling during sleep — reading the battery
|
|
54315
56675
|
* wakes the camera up and drains charge.
|
|
54316
56676
|
*/
|
|
54317
|
-
sleeping: boolean(),
|
|
56677
|
+
sleeping: boolean().meta({ label: "Sleeping" }),
|
|
54318
56678
|
/** Ms epoch of the last observation. Lets consumers reason about freshness. */
|
|
54319
56679
|
lastUpdated: number(),
|
|
54320
56680
|
/**
|
|
@@ -54354,22 +56714,71 @@ var BatteryStatusSchema = object({
|
|
|
54354
56714
|
* sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
|
|
54355
56715
|
* misleading exact percentage. Absent/false → genuine 0–100 % reading.
|
|
54356
56716
|
*/
|
|
54357
|
-
binary: boolean().optional()
|
|
56717
|
+
binary: boolean().optional().meta({ label: "Binary indicator" })
|
|
54358
56718
|
});
|
|
56719
|
+
var BATTERY_DEVICE_TYPES = [
|
|
56720
|
+
DeviceType.Camera,
|
|
56721
|
+
DeviceType.Sensor,
|
|
56722
|
+
DeviceType.Button,
|
|
56723
|
+
DeviceType.Switch,
|
|
56724
|
+
DeviceType.PetFeeder,
|
|
56725
|
+
DeviceType.Container,
|
|
56726
|
+
DeviceType.Thermostat
|
|
56727
|
+
];
|
|
56728
|
+
/** Generic Customize target for the percentage reading (D936). */
|
|
56729
|
+
var batteryCustomize = {
|
|
56730
|
+
version: 1,
|
|
56731
|
+
advanced: "derive",
|
|
56732
|
+
targets: [{
|
|
56733
|
+
id: "percentage",
|
|
56734
|
+
cardinality: "scalar",
|
|
56735
|
+
vocabulary: {
|
|
56736
|
+
cap: "battery",
|
|
56737
|
+
stateField: "percentage"
|
|
56738
|
+
},
|
|
56739
|
+
deviceTypes: BATTERY_DEVICE_TYPES,
|
|
56740
|
+
apply: "add-or-replace",
|
|
56741
|
+
path: "percentage",
|
|
56742
|
+
sources: [{
|
|
56743
|
+
kind: "field",
|
|
56744
|
+
valueKinds: ["number", "string"],
|
|
56745
|
+
transforms: [{ kind: "identity" }, {
|
|
56746
|
+
kind: "linear",
|
|
56747
|
+
defaultScale: 1,
|
|
56748
|
+
defaultOffset: 0,
|
|
56749
|
+
clampMin: 0,
|
|
56750
|
+
clampMax: 100
|
|
56751
|
+
}]
|
|
56752
|
+
}],
|
|
56753
|
+
companions: [
|
|
56754
|
+
{
|
|
56755
|
+
kind: "constant",
|
|
56756
|
+
path: "charging",
|
|
56757
|
+
value: "unknown",
|
|
56758
|
+
when: "add"
|
|
56759
|
+
},
|
|
56760
|
+
{
|
|
56761
|
+
kind: "constant",
|
|
56762
|
+
path: "sleeping",
|
|
56763
|
+
value: false,
|
|
56764
|
+
when: "add"
|
|
56765
|
+
},
|
|
56766
|
+
{
|
|
56767
|
+
kind: "clock",
|
|
56768
|
+
path: "lastUpdated",
|
|
56769
|
+
when: "add"
|
|
56770
|
+
}
|
|
56771
|
+
],
|
|
56772
|
+
sourceReport: { status: "assignment-status" },
|
|
56773
|
+
advancedExpression: true
|
|
56774
|
+
}]
|
|
56775
|
+
};
|
|
54359
56776
|
var batteryCapability = {
|
|
54360
56777
|
name: "battery",
|
|
54361
56778
|
scope: "device",
|
|
54362
56779
|
deviceNative: true,
|
|
54363
56780
|
mode: "singleton",
|
|
54364
|
-
deviceTypes:
|
|
54365
|
-
DeviceType.Camera,
|
|
54366
|
-
DeviceType.Sensor,
|
|
54367
|
-
DeviceType.Button,
|
|
54368
|
-
DeviceType.Switch,
|
|
54369
|
-
DeviceType.PetFeeder,
|
|
54370
|
-
DeviceType.Container,
|
|
54371
|
-
DeviceType.Thermostat
|
|
54372
|
-
],
|
|
56781
|
+
deviceTypes: BATTERY_DEVICE_TYPES,
|
|
54373
56782
|
methods: {
|
|
54374
56783
|
/**
|
|
54375
56784
|
* Explicitly wake the camera from low-power sleep ahead of a
|
|
@@ -54453,6 +56862,7 @@ onStatusChanged: { data: object({
|
|
|
54453
56862
|
kind: "gauge",
|
|
54454
56863
|
unit: "%"
|
|
54455
56864
|
} } },
|
|
56865
|
+
customize: batteryCustomize,
|
|
54456
56866
|
/** Clock fields: written, but excluded from the compare that decides
|
|
54457
56867
|
* whether persisting is worth a SQLite commit. */
|
|
54458
56868
|
volatileStateFields: ["lastUpdated"]
|
|
@@ -54469,7 +56879,7 @@ onStatusChanged: { data: object({
|
|
|
54469
56879
|
* with the right HomeKit / Alexa display category.
|
|
54470
56880
|
*/
|
|
54471
56881
|
var BinaryStatusSchema = object({
|
|
54472
|
-
on: boolean(),
|
|
56882
|
+
on: boolean().meta({ label: "On" }),
|
|
54473
56883
|
/** Ms epoch of the last transition. 0 if never observed. */
|
|
54474
56884
|
lastChangedAt: number()
|
|
54475
56885
|
});
|
|
@@ -54498,7 +56908,12 @@ var binaryCapability = {
|
|
|
54498
56908
|
history: { fields: { on: { kind: "boolean" } } },
|
|
54499
56909
|
/** Clock fields: written, but excluded from the compare that decides
|
|
54500
56910
|
* whether persisting is worth a SQLite commit. */
|
|
54501
|
-
volatileStateFields: ["lastChangedAt"]
|
|
56911
|
+
volatileStateFields: ["lastChangedAt"],
|
|
56912
|
+
customize: {
|
|
56913
|
+
version: 1,
|
|
56914
|
+
advanced: "derive",
|
|
56915
|
+
targets: []
|
|
56916
|
+
}
|
|
54502
56917
|
};
|
|
54503
56918
|
/**
|
|
54504
56919
|
* Dimmable-light brightness control. Co-exists with `switch` on the
|
|
@@ -54804,7 +57219,7 @@ var GridLayoutCellSchema = object({
|
|
|
54804
57219
|
*
|
|
54805
57220
|
* A grid's `high` composes its sources' `high` and its `low` their `low`, so a
|
|
54806
57221
|
* profile is on offer only when EVERY source can serve it. The refusal NAMES
|
|
54807
|
-
* the sources, because "this grid has no low" is not a finding — "
|
|
57222
|
+
* the sources, because "this grid has no low" is not a finding — "101 has no
|
|
54808
57223
|
* low" is, and it is the one an operator can act on.
|
|
54809
57224
|
*/
|
|
54810
57225
|
var GridProfileOfferSchema = object({
|
|
@@ -55421,6 +57836,106 @@ var ConsumablesStatusSchema = object({
|
|
|
55421
57836
|
items: array(ConsumableItemSchema),
|
|
55422
57837
|
lastChangedAt: number()
|
|
55423
57838
|
});
|
|
57839
|
+
/** Synthesize seed for a link-built status (no native provider).
|
|
57840
|
+
*
|
|
57841
|
+
* ⚠ NO LIVE CALLER since 2026-08-08 (device-links deleted; see
|
|
57842
|
+
* `CapabilityStatusSchema.empty`). The wiring guidance below was written for
|
|
57843
|
+
* exactly the case the operator is asking about again — a Dreame's HA
|
|
57844
|
+
* consumable-life sensors — so it is kept for that conversation, not because
|
|
57845
|
+
* anything reads it today. */
|
|
57846
|
+
var EMPTY_STATUS = {
|
|
57847
|
+
items: [],
|
|
57848
|
+
lastChangedAt: 0
|
|
57849
|
+
};
|
|
57850
|
+
/** Seed for a NEW link-built consumable item. `key`/`label` are overwritten
|
|
57851
|
+
* with the link's `itemKey` (see `status.itemArray`), so the placeholder
|
|
57852
|
+
* empty strings never survive into a validated item. Link-built items are
|
|
57853
|
+
* not resettable — there is no native provider to receive `reset()`.
|
|
57854
|
+
*
|
|
57855
|
+
* Wiring guidance (HA vacuum consumable-life sensors):
|
|
57856
|
+
* - a percent-remaining source (`numeric-sensor`, unit '%') → `level` via
|
|
57857
|
+
* `identity` (or `linear` scale 1 offset 0 clamp [0,100] to be safe);
|
|
57858
|
+
* - an hours-remaining source (e.g. Dreame 'Main Brush Time Left', unit 'h')
|
|
57859
|
+
* → `level` via `linear` with scale = 100 / max-hours for that item
|
|
57860
|
+
* (e.g. main brush 300 h → scale 0.3333) + clamp [0,100];
|
|
57861
|
+
* - a discrete source (`enum-sensor`, e.g. mop pad 'installed') → `status`
|
|
57862
|
+
* via `enum-map` (e.g. { installed: 'ok', missing: 'replace' }).
|
|
57863
|
+
* A numeric→'replace' THRESHOLD (level < 10 → 'replace') is NOT expressible
|
|
57864
|
+
* with the current transform kinds — leave `status` null (valid) until the
|
|
57865
|
+
* expression transform lands. */
|
|
57866
|
+
/** Generic Customize target for one consumable item (D936). Native rows stay read-only. */
|
|
57867
|
+
var consumablesCustomize = {
|
|
57868
|
+
version: 1,
|
|
57869
|
+
targets: [{
|
|
57870
|
+
id: "items",
|
|
57871
|
+
cardinality: "keyedArray",
|
|
57872
|
+
vocabulary: { cap: "consumables" },
|
|
57873
|
+
deviceTypes: Object.values(DeviceType),
|
|
57874
|
+
apply: "add",
|
|
57875
|
+
path: "items",
|
|
57876
|
+
keyField: "key",
|
|
57877
|
+
labelField: "label",
|
|
57878
|
+
itemSchema: ConsumableItemSchema,
|
|
57879
|
+
nativeItems: "read-only",
|
|
57880
|
+
sourceReport: { status: "assignment-status" },
|
|
57881
|
+
fields: [
|
|
57882
|
+
{
|
|
57883
|
+
path: "level",
|
|
57884
|
+
sources: [{
|
|
57885
|
+
kind: "numeric",
|
|
57886
|
+
transforms: [{ kind: "identity" }, {
|
|
57887
|
+
kind: "linear",
|
|
57888
|
+
defaultScale: 1,
|
|
57889
|
+
defaultOffset: 0,
|
|
57890
|
+
clampMin: 0,
|
|
57891
|
+
clampMax: 100
|
|
57892
|
+
}]
|
|
57893
|
+
}]
|
|
57894
|
+
},
|
|
57895
|
+
{
|
|
57896
|
+
path: "remaining.value",
|
|
57897
|
+
sources: [{
|
|
57898
|
+
kind: "numeric",
|
|
57899
|
+
transforms: [{ kind: "identity" }]
|
|
57900
|
+
}],
|
|
57901
|
+
literals: [{
|
|
57902
|
+
path: "remaining.unit",
|
|
57903
|
+
values: [...ConsumableRemainingUnitSchema.options]
|
|
57904
|
+
}]
|
|
57905
|
+
},
|
|
57906
|
+
{
|
|
57907
|
+
path: "status",
|
|
57908
|
+
sources: [{
|
|
57909
|
+
kind: "enum",
|
|
57910
|
+
transforms: [{
|
|
57911
|
+
kind: "enum-map",
|
|
57912
|
+
outputValues: [...ConsumableStatusSchema.options],
|
|
57913
|
+
unmapped: null
|
|
57914
|
+
}]
|
|
57915
|
+
}]
|
|
57916
|
+
}
|
|
57917
|
+
],
|
|
57918
|
+
traits: [{
|
|
57919
|
+
path: "kind",
|
|
57920
|
+
values: [...ConsumableKindSchema.options],
|
|
57921
|
+
defaultValue: "wear"
|
|
57922
|
+
}, {
|
|
57923
|
+
path: "form",
|
|
57924
|
+
values: [...ConsumableFormSchema.options],
|
|
57925
|
+
defaultValue: "part"
|
|
57926
|
+
}],
|
|
57927
|
+
companions: [{
|
|
57928
|
+
kind: "clock",
|
|
57929
|
+
path: "lastChangedAt",
|
|
57930
|
+
when: "add"
|
|
57931
|
+
}, {
|
|
57932
|
+
kind: "clock",
|
|
57933
|
+
path: "lastFetchedAt",
|
|
57934
|
+
when: "add"
|
|
57935
|
+
}],
|
|
57936
|
+
advancedExpression: true
|
|
57937
|
+
}]
|
|
57938
|
+
};
|
|
55424
57939
|
var consumablesCapability = {
|
|
55425
57940
|
name: "consumables",
|
|
55426
57941
|
scope: "device",
|
|
@@ -55458,10 +57973,7 @@ reset: method(object({
|
|
|
55458
57973
|
status: {
|
|
55459
57974
|
schema: ConsumablesStatusSchema,
|
|
55460
57975
|
kind: "push",
|
|
55461
|
-
empty:
|
|
55462
|
-
items: [],
|
|
55463
|
-
lastChangedAt: 0
|
|
55464
|
-
},
|
|
57976
|
+
empty: EMPTY_STATUS,
|
|
55465
57977
|
itemArray: {
|
|
55466
57978
|
path: "items",
|
|
55467
57979
|
keyField: "key",
|
|
@@ -55497,6 +58009,7 @@ reset: method(object({
|
|
|
55497
58009
|
* brush's remaining life and a dishwasher's salt are each recorded the moment
|
|
55498
58010
|
* their provider reports them; an item that appears later gets its series.
|
|
55499
58011
|
*/
|
|
58012
|
+
customize: consumablesCustomize,
|
|
55500
58013
|
history: {
|
|
55501
58014
|
fields: {},
|
|
55502
58015
|
items: {
|
|
@@ -55876,6 +58389,30 @@ var dayNightCapability = {
|
|
|
55876
58389
|
volatileStateFields: ["lastFetchedAt"]
|
|
55877
58390
|
};
|
|
55878
58391
|
/**
|
|
58392
|
+
* display-palette — the cluster's one colour table (D939).
|
|
58393
|
+
*
|
|
58394
|
+
* Hub singleton. `getPalette` reports `unknown` when the settings store
|
|
58395
|
+
* cannot be read; it does not pretend the bundled preset was stored.
|
|
58396
|
+
* `setPalette` refuses a palette that fails the ΔE / contrast rule and names
|
|
58397
|
+
* the pairs.
|
|
58398
|
+
*/
|
|
58399
|
+
var presetSummarySchema = object({
|
|
58400
|
+
id: string(),
|
|
58401
|
+
name: string(),
|
|
58402
|
+
swatches: record(string(), paletteSwatchSchema),
|
|
58403
|
+
fallbacks: array(string())
|
|
58404
|
+
});
|
|
58405
|
+
method(_void(), paletteResultSchema, {
|
|
58406
|
+
auth: "protected",
|
|
58407
|
+
role: "viewer"
|
|
58408
|
+
}), method(_void(), array(presetSummarySchema).readonly(), {
|
|
58409
|
+
auth: "protected",
|
|
58410
|
+
role: "viewer"
|
|
58411
|
+
}), method(setPaletteInputSchema, paletteReadySchema, {
|
|
58412
|
+
kind: "mutation",
|
|
58413
|
+
auth: "admin"
|
|
58414
|
+
});
|
|
58415
|
+
/**
|
|
55879
58416
|
* Generic device-level status snapshot. Auto-registered by `BaseDevice`
|
|
55880
58417
|
* for every device, regardless of provider — the kernel needs a uniform
|
|
55881
58418
|
* cap-keyed slice for the basic device flags every consumer expects to
|
|
@@ -56239,6 +58776,36 @@ var dishwasherCapability = {
|
|
|
56239
58776
|
powerOn: { kind: "boolean" }
|
|
56240
58777
|
} }
|
|
56241
58778
|
};
|
|
58779
|
+
/** Pulse override: a rising edge advances `lastPressedAt` and the press count. */
|
|
58780
|
+
var doorbellCustomize = {
|
|
58781
|
+
version: 1,
|
|
58782
|
+
targets: [{
|
|
58783
|
+
id: "pressed",
|
|
58784
|
+
cardinality: "event",
|
|
58785
|
+
shape: "pulse",
|
|
58786
|
+
vocabulary: {
|
|
58787
|
+
cap: "doorbell",
|
|
58788
|
+
eventName: "onPressed"
|
|
58789
|
+
},
|
|
58790
|
+
deviceTypes: [DeviceType.Camera],
|
|
58791
|
+
apply: "add",
|
|
58792
|
+
applyAuthority: { kind: "composition-claim" },
|
|
58793
|
+
eventName: "onPressed",
|
|
58794
|
+
edges: ["rising"],
|
|
58795
|
+
timestampPath: "lastPressedAt",
|
|
58796
|
+
counterPath: "pressCountSinceStart",
|
|
58797
|
+
highWater: "composer-advance",
|
|
58798
|
+
combine: "any",
|
|
58799
|
+
debounce: {
|
|
58800
|
+
kind: "rising-edge",
|
|
58801
|
+
defaultDebounceMs: 2e3,
|
|
58802
|
+
changedAtRequired: true
|
|
58803
|
+
},
|
|
58804
|
+
sources: [{ kind: "binary" }, { kind: "switch" }],
|
|
58805
|
+
sourceReport: { status: "assignment-status" },
|
|
58806
|
+
advancedExpression: true
|
|
58807
|
+
}]
|
|
58808
|
+
};
|
|
56242
58809
|
var DoorbellStatusSchema = object({
|
|
56243
58810
|
/** Ms epoch of the last press. null = never observed since this provider started. */
|
|
56244
58811
|
lastPressedAt: number().nullable(),
|
|
@@ -56305,7 +58872,8 @@ onPressed: {
|
|
|
56305
58872
|
/**
|
|
56306
58873
|
* History (D850): none — `pressCountSinceStart` resets with the addon, so it is not a monotonic meter; presses live in the events ledger.
|
|
56307
58874
|
*/
|
|
56308
|
-
history: "none"
|
|
58875
|
+
history: "none",
|
|
58876
|
+
customize: doorbellCustomize
|
|
56309
58877
|
};
|
|
56310
58878
|
/**
|
|
56311
58879
|
* Enum-state sensor — a string value picked from a finite option set.
|
|
@@ -57177,7 +59745,10 @@ var humidifierCapability = {
|
|
|
57177
59745
|
*/
|
|
57178
59746
|
var HumiditySensorStatusSchema = object({
|
|
57179
59747
|
/** Current relative humidity, 0..100. */
|
|
57180
|
-
percent: number().min(0).max(100)
|
|
59748
|
+
percent: number().min(0).max(100).meta({
|
|
59749
|
+
unit: "%",
|
|
59750
|
+
label: "Humidity"
|
|
59751
|
+
}),
|
|
57181
59752
|
/** Ms epoch when the slice was last updated. */
|
|
57182
59753
|
lastFetchedAt: number(),
|
|
57183
59754
|
/** Live display unit from the upstream source (e.g. HA
|
|
@@ -57219,7 +59790,12 @@ var humiditySensorCapability = {
|
|
|
57219
59790
|
} } },
|
|
57220
59791
|
/** Clock fields: written, but excluded from the compare that decides
|
|
57221
59792
|
* whether persisting is worth a SQLite commit. */
|
|
57222
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
59793
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
59794
|
+
customize: {
|
|
59795
|
+
version: 1,
|
|
59796
|
+
advanced: "derive",
|
|
59797
|
+
targets: []
|
|
59798
|
+
}
|
|
57223
59799
|
};
|
|
57224
59800
|
/**
|
|
57225
59801
|
* Image display cap. Models a single still image exposed by an integration —
|
|
@@ -58701,6 +61277,38 @@ authKey: string().optional() }), object({
|
|
|
58701
61277
|
/** Human-readable error when `ok: false`. */
|
|
58702
61278
|
error: string().optional()
|
|
58703
61279
|
}), { kind: "mutation" });
|
|
61280
|
+
/** Span override: start on a rising edge, end on a fall or this timeout. */
|
|
61281
|
+
var motionCustomize = {
|
|
61282
|
+
version: 1,
|
|
61283
|
+
targets: [{
|
|
61284
|
+
id: "detected",
|
|
61285
|
+
cardinality: "event",
|
|
61286
|
+
shape: "span",
|
|
61287
|
+
vocabulary: {
|
|
61288
|
+
cap: "motion",
|
|
61289
|
+
eventName: "onMotionChanged"
|
|
61290
|
+
},
|
|
61291
|
+
deviceTypes: [DeviceType.Camera],
|
|
61292
|
+
apply: "replace",
|
|
61293
|
+
applyAuthority: {
|
|
61294
|
+
kind: "camera-sensors",
|
|
61295
|
+
timeoutField: "motionCooldownMs"
|
|
61296
|
+
},
|
|
61297
|
+
eventName: "onMotionChanged",
|
|
61298
|
+
start: "rising-edge",
|
|
61299
|
+
end: "falling-edge-or-timeout",
|
|
61300
|
+
timeoutMs: 3e4,
|
|
61301
|
+
combine: "any",
|
|
61302
|
+
sourceModes: [
|
|
61303
|
+
"in-addition",
|
|
61304
|
+
"confirm",
|
|
61305
|
+
"replace"
|
|
61306
|
+
],
|
|
61307
|
+
sources: [{ kind: "binary" }, { kind: "switch" }],
|
|
61308
|
+
sourceReport: { status: "assignment-status" },
|
|
61309
|
+
advancedExpression: false
|
|
61310
|
+
}]
|
|
61311
|
+
};
|
|
58704
61312
|
var MotionStatusSchema = object({
|
|
58705
61313
|
detected: boolean(),
|
|
58706
61314
|
/** Ms epoch of the last detected-true observation. Null if never detected. */
|
|
@@ -58840,7 +61448,8 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
|
|
|
58840
61448
|
history: { fields: { detected: {
|
|
58841
61449
|
kind: "boolean",
|
|
58842
61450
|
excludeDeviceTypes: [DeviceType.Camera]
|
|
58843
|
-
} } }
|
|
61451
|
+
} } },
|
|
61452
|
+
customize: motionCustomize
|
|
58844
61453
|
};
|
|
58845
61454
|
/**
|
|
58846
61455
|
* Motion-trigger toggle for accessory devices.
|
|
@@ -60819,9 +63428,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
|
|
|
60819
63428
|
*/
|
|
60820
63429
|
var PowerMeterStatusSchema = object({
|
|
60821
63430
|
/** Instantaneous power draw in watts. */
|
|
60822
|
-
watts: number().optional()
|
|
63431
|
+
watts: number().optional().meta({
|
|
63432
|
+
unit: "W",
|
|
63433
|
+
label: "Power"
|
|
63434
|
+
}),
|
|
60823
63435
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
60824
|
-
kwhTotal: number().optional()
|
|
63436
|
+
kwhTotal: number().optional().meta({
|
|
63437
|
+
unit: "kWh",
|
|
63438
|
+
label: "Energy"
|
|
63439
|
+
}),
|
|
60825
63440
|
/** Voltage in volts. */
|
|
60826
63441
|
volts: number().optional(),
|
|
60827
63442
|
/** Current in amperes. */
|
|
@@ -60906,7 +63521,12 @@ var powerMeterCapability = {
|
|
|
60906
63521
|
} },
|
|
60907
63522
|
/** Clock fields: written, but excluded from the compare that decides
|
|
60908
63523
|
* whether persisting is worth a SQLite commit. */
|
|
60909
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
63524
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
63525
|
+
customize: {
|
|
63526
|
+
version: 1,
|
|
63527
|
+
advanced: "derive",
|
|
63528
|
+
targets: []
|
|
63529
|
+
}
|
|
60910
63530
|
};
|
|
60911
63531
|
/**
|
|
60912
63532
|
* Presence cap. Models HA `person.*` and `device_tracker.*` entities
|
|
@@ -61328,9 +63948,9 @@ var PtzOptionsSchema = object({
|
|
|
61328
63948
|
* Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
|
|
61329
63949
|
* not one of the three cameras honours its own:
|
|
61330
63950
|
*
|
|
61331
|
-
*
|
|
61332
|
-
* 1438
|
|
61333
|
-
* 3836
|
|
63951
|
+
* 107 Camera camera Carol (reolink) preset 0 holds "stanza"
|
|
63952
|
+
* 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
|
|
63953
|
+
* 3836 Camera studio (amcrest) preset 1 holds "Preset1"
|
|
61334
63954
|
*
|
|
61335
63955
|
* So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
|
|
61336
63956
|
* and two of the three swallowed the failure in a bare `catch`. For autotrack
|
|
@@ -61566,27 +64186,119 @@ var ptzAutotrackCapability = {
|
|
|
61566
64186
|
*/
|
|
61567
64187
|
history: "none"
|
|
61568
64188
|
};
|
|
64189
|
+
var RUNNING_POWER_START_DELAY_MS = 3e4;
|
|
64190
|
+
var RUNNING_POWER_STOP_DELAY_MS = 18e4;
|
|
64191
|
+
/** Before any provider reading — all fields unknown (D933). */
|
|
64192
|
+
var RUNNING_STATE_COLD = {
|
|
64193
|
+
running: null,
|
|
64194
|
+
since: null,
|
|
64195
|
+
source: "native",
|
|
64196
|
+
phase: null,
|
|
64197
|
+
lastFetchedAt: null
|
|
64198
|
+
};
|
|
61569
64199
|
var RunningStateSourceSchema = _enum(["native", "assigned"]);
|
|
61570
64200
|
var RunningStateStatusSchema = object({
|
|
61571
64201
|
/** null = unknown — never coerced to false (D393). */
|
|
61572
64202
|
running: boolean().nullable(),
|
|
61573
64203
|
/** Epoch ms the current boolean began; null while `running` is null. */
|
|
61574
64204
|
since: number().nullable(),
|
|
61575
|
-
source: RunningStateSourceSchema,
|
|
64205
|
+
source: RunningStateSourceSchema.meta({ label: "Source" }),
|
|
61576
64206
|
phase: string().nullable(),
|
|
61577
|
-
|
|
64207
|
+
/** null until a reading has been published (D393). */
|
|
64208
|
+
lastFetchedAt: number().nullable()
|
|
61578
64209
|
});
|
|
61579
64210
|
var RunningFlipEventDataSchema = object({
|
|
61580
64211
|
deviceId: number(),
|
|
61581
64212
|
since: number().nullable(),
|
|
61582
64213
|
phase: string().nullable()
|
|
61583
64214
|
});
|
|
64215
|
+
var RUNNING_DEVICE_TYPES = Object.values(DeviceType);
|
|
64216
|
+
/** Generic Customize target for the running boolean (D936). */
|
|
64217
|
+
var runningCustomize = {
|
|
64218
|
+
version: 1,
|
|
64219
|
+
advanced: "derive",
|
|
64220
|
+
targets: [{
|
|
64221
|
+
id: "running",
|
|
64222
|
+
cardinality: "scalar",
|
|
64223
|
+
vocabulary: {
|
|
64224
|
+
cap: "running-state",
|
|
64225
|
+
stateField: "running"
|
|
64226
|
+
},
|
|
64227
|
+
deviceTypes: [
|
|
64228
|
+
DeviceType.Dishwasher,
|
|
64229
|
+
DeviceType.Vacuum,
|
|
64230
|
+
DeviceType.LawnMower,
|
|
64231
|
+
DeviceType.MediaPlayer,
|
|
64232
|
+
DeviceType.WaterHeater,
|
|
64233
|
+
DeviceType.Humidifier,
|
|
64234
|
+
DeviceType.Fan,
|
|
64235
|
+
DeviceType.Climate,
|
|
64236
|
+
DeviceType.Thermostat,
|
|
64237
|
+
DeviceType.PetFeeder
|
|
64238
|
+
],
|
|
64239
|
+
apply: "add-or-replace",
|
|
64240
|
+
path: "running",
|
|
64241
|
+
sources: [
|
|
64242
|
+
{
|
|
64243
|
+
kind: "switch",
|
|
64244
|
+
transforms: [{ kind: "identity" }]
|
|
64245
|
+
},
|
|
64246
|
+
{
|
|
64247
|
+
kind: "binary",
|
|
64248
|
+
transforms: [{ kind: "identity" }, { kind: "invert" }]
|
|
64249
|
+
},
|
|
64250
|
+
{
|
|
64251
|
+
kind: "numeric",
|
|
64252
|
+
requiredUnit: "W",
|
|
64253
|
+
transforms: [{
|
|
64254
|
+
kind: "threshold",
|
|
64255
|
+
comparison: "gte",
|
|
64256
|
+
defaultThreshold: 5,
|
|
64257
|
+
defaultStartDwellMs: RUNNING_POWER_START_DELAY_MS,
|
|
64258
|
+
defaultStopDwellMs: RUNNING_POWER_STOP_DELAY_MS,
|
|
64259
|
+
thresholdUnit: "W"
|
|
64260
|
+
}]
|
|
64261
|
+
}
|
|
64262
|
+
],
|
|
64263
|
+
companions: [
|
|
64264
|
+
{
|
|
64265
|
+
kind: "constant",
|
|
64266
|
+
path: "source",
|
|
64267
|
+
value: "assigned",
|
|
64268
|
+
when: "always"
|
|
64269
|
+
},
|
|
64270
|
+
{
|
|
64271
|
+
kind: "constant",
|
|
64272
|
+
path: "phase",
|
|
64273
|
+
value: null,
|
|
64274
|
+
when: "always"
|
|
64275
|
+
},
|
|
64276
|
+
{
|
|
64277
|
+
kind: "clock",
|
|
64278
|
+
path: "lastFetchedAt",
|
|
64279
|
+
when: "always"
|
|
64280
|
+
},
|
|
64281
|
+
{
|
|
64282
|
+
kind: "transition-time",
|
|
64283
|
+
path: "since",
|
|
64284
|
+
sourceChangedAt: "prefer"
|
|
64285
|
+
}
|
|
64286
|
+
],
|
|
64287
|
+
sourceReport: {
|
|
64288
|
+
status: "assignment-status",
|
|
64289
|
+
runtimeField: "source",
|
|
64290
|
+
nativeValue: "native",
|
|
64291
|
+
assignedValue: "assigned"
|
|
64292
|
+
},
|
|
64293
|
+
advancedExpression: true
|
|
64294
|
+
}]
|
|
64295
|
+
};
|
|
61584
64296
|
var runningStateCapability = {
|
|
61585
64297
|
name: "running-state",
|
|
61586
64298
|
scope: "device",
|
|
61587
64299
|
deviceNative: true,
|
|
61588
64300
|
mode: "singleton",
|
|
61589
|
-
deviceTypes:
|
|
64301
|
+
deviceTypes: RUNNING_DEVICE_TYPES,
|
|
61590
64302
|
methods: {},
|
|
61591
64303
|
events: {
|
|
61592
64304
|
onStarted: { data: RunningFlipEventDataSchema },
|
|
@@ -61599,7 +64311,8 @@ var runningStateCapability = {
|
|
|
61599
64311
|
runtimeState: RunningStateStatusSchema,
|
|
61600
64312
|
durability: "restored",
|
|
61601
64313
|
history: { fields: { running: { kind: "boolean" } } },
|
|
61602
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
64314
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
64315
|
+
customize: runningCustomize
|
|
61603
64316
|
};
|
|
61604
64317
|
DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
|
|
61605
64318
|
kind: "mutation",
|
|
@@ -61642,7 +64355,7 @@ var RecordingAvailabilitySchema = object({
|
|
|
61642
64355
|
* would look identical. But the answer used to say nothing about that, so a
|
|
61643
64356
|
* caller asking "what can I export?" read the single preferred profile as
|
|
61644
64357
|
* the only one that exists — on this deployment every camera records `high`
|
|
61645
|
-
* AND `low`, the low tree holding 14 GB for camera
|
|
64358
|
+
* AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
|
|
61646
64359
|
* UI could not see it.
|
|
61647
64360
|
*
|
|
61648
64361
|
* Cheap: it is the same shallow directory read the profile CHOICE already
|
|
@@ -61741,7 +64454,7 @@ var RecordingSourceOptionsSchema = object({
|
|
|
61741
64454
|
* `sparse` = gaps are the absence of one, and must be drawn as such.
|
|
61742
64455
|
*
|
|
61743
64456
|
* Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
|
|
61744
|
-
* of
|
|
64457
|
+
* of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
|
|
61745
64458
|
* pair, and ours answers it per camera from `deriveRecordingMode`. */
|
|
61746
64459
|
coverage: _enum(["continuous", "sparse"]),
|
|
61747
64460
|
/** Where the playhead may be put.
|
|
@@ -61817,7 +64530,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
|
|
|
61817
64530
|
* merely discouraged (D554 amended).
|
|
61818
64531
|
*
|
|
61819
64532
|
* It was learned the expensive way on `videoclips.listClips`: measured
|
|
61820
|
-
* on the live hub 2026-09-20, device
|
|
64533
|
+
* on the live hub 2026-09-20, device 107 bound to `recorder` AND
|
|
61821
64534
|
* `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
|
|
61822
64535
|
* three from each source, merged — `device-collection-dispatch.ts`
|
|
61823
64536
|
* leaves an unpinned fan-out un-narrowed, so absence buys the union the
|
|
@@ -62418,7 +65131,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
|
|
|
62418
65131
|
* on a 10 h window holding 29,393 s of footage every range landed late by the
|
|
62419
65132
|
* gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
|
|
62420
65133
|
* the video was a uniform timelapse, and the log line reported the five ranges
|
|
62421
|
-
* that had been ASKED for (2026-08-13, export `57d14363`, camera
|
|
65134
|
+
* that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
|
|
62422
65135
|
*
|
|
62423
65136
|
* Relative and not absolute epoch, because an absolute epoch would make every
|
|
62424
65137
|
* call site responsible for the same subtraction.
|
|
@@ -63129,7 +65842,7 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
|
|
|
63129
65842
|
* which put a "Scenes" tab on one camera's detail page. That is the wrong shape
|
|
63130
65843
|
* for the thing: a scene is a standing question about the property ("is the bin
|
|
63131
65844
|
* still out"), and the operator's question is "which of my scenes have tripped",
|
|
63132
|
-
* across every camera at once — not "what does camera
|
|
65845
|
+
* across every camera at once — not "what does camera 102 think". Buried one
|
|
63133
65846
|
* camera deep it also could not be found. The surface is now a top-level admin
|
|
63134
65847
|
* page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
|
|
63135
65848
|
* picks the camera inside the create flow, the same shape Events and Faces have.
|
|
@@ -63988,7 +66701,7 @@ var streamParamsCapability = {
|
|
|
63988
66701
|
* `getSettingsUISchema()` surface.
|
|
63989
66702
|
*/
|
|
63990
66703
|
var SwitchStatusSchema = object({
|
|
63991
|
-
on: boolean(),
|
|
66704
|
+
on: boolean().meta({ label: "On" }),
|
|
63992
66705
|
/** Ms epoch of the last state change. Useful for UI "X minutes ago". */
|
|
63993
66706
|
lastChangedAt: number()
|
|
63994
66707
|
});
|
|
@@ -64047,7 +66760,12 @@ var switchCapability = {
|
|
|
64047
66760
|
label: "On",
|
|
64048
66761
|
kind: "boolean"
|
|
64049
66762
|
}
|
|
64050
|
-
}] }
|
|
66763
|
+
}] },
|
|
66764
|
+
customize: {
|
|
66765
|
+
version: 1,
|
|
66766
|
+
advanced: "derive",
|
|
66767
|
+
targets: []
|
|
66768
|
+
}
|
|
64051
66769
|
};
|
|
64052
66770
|
/** C0 controls, DEL and the C1 range: none of them belongs in a name. */
|
|
64053
66771
|
function hasControlCharacter(value) {
|
|
@@ -64643,7 +67361,10 @@ var tamperCapability = {
|
|
|
64643
67361
|
*/
|
|
64644
67362
|
var TemperatureSensorStatusSchema = object({
|
|
64645
67363
|
/** Current temperature in Celsius. */
|
|
64646
|
-
celsius: number()
|
|
67364
|
+
celsius: number().meta({
|
|
67365
|
+
unit: "°C",
|
|
67366
|
+
label: "Temperature"
|
|
67367
|
+
}),
|
|
64647
67368
|
/** Ms epoch when the slice was last updated (push or poll). */
|
|
64648
67369
|
lastFetchedAt: number(),
|
|
64649
67370
|
/** Live display unit from the upstream source (e.g. HA
|
|
@@ -64686,7 +67407,12 @@ var temperatureSensorCapability = {
|
|
|
64686
67407
|
} } },
|
|
64687
67408
|
/** Clock fields: written, but excluded from the compare that decides
|
|
64688
67409
|
* whether persisting is worth a SQLite commit. */
|
|
64689
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
67410
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
67411
|
+
customize: {
|
|
67412
|
+
version: 1,
|
|
67413
|
+
advanced: "derive",
|
|
67414
|
+
targets: []
|
|
67415
|
+
}
|
|
64690
67416
|
};
|
|
64691
67417
|
/**
|
|
64692
67418
|
* toast — system-scoped singleton capability that streams toast
|
|
@@ -66231,27 +68957,42 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
|
|
|
66231
68957
|
kind: "mutation",
|
|
66232
68958
|
auth: "admin"
|
|
66233
68959
|
});
|
|
66234
|
-
function
|
|
68960
|
+
function programStartFromRemaining(running, remainingSeconds, fetchedAt) {
|
|
68961
|
+
if (!running || remainingSeconds === null || remainingSeconds === void 0) return null;
|
|
68962
|
+
if (remainingSeconds <= 0) return null;
|
|
68963
|
+
return fetchedAt - remainingSeconds * 1e3;
|
|
68964
|
+
}
|
|
68965
|
+
function resolveSince(running, previous, transitionAtMs, bootstrapSinceMs) {
|
|
66235
68966
|
if (running === null) return null;
|
|
66236
|
-
|
|
66237
|
-
|
|
68967
|
+
const prevRunning = previous?.running ?? null;
|
|
68968
|
+
if (prevRunning === null) return bootstrapSinceMs;
|
|
68969
|
+
if (prevRunning !== running) return transitionAtMs;
|
|
68970
|
+
return previous?.since ?? null;
|
|
66238
68971
|
}
|
|
66239
|
-
function nativeSlice(running, phase, previous,
|
|
68972
|
+
function nativeSlice(running, phase, previous, transitionAtMs, fetchedAt, bootstrapSinceMs) {
|
|
66240
68973
|
return {
|
|
66241
68974
|
running,
|
|
66242
|
-
since: resolveSince(running, previous,
|
|
68975
|
+
since: resolveSince(running, previous, transitionAtMs, bootstrapSinceMs),
|
|
66243
68976
|
source: "native",
|
|
66244
68977
|
phase: running === null ? null : phase,
|
|
66245
|
-
lastFetchedAt:
|
|
68978
|
+
lastFetchedAt: fetchedAt
|
|
66246
68979
|
};
|
|
66247
68980
|
}
|
|
66248
|
-
function runningFromDishwasherOperation(operation, program, previous,
|
|
66249
|
-
|
|
66250
|
-
if (operation ===
|
|
66251
|
-
if (operation === "
|
|
66252
|
-
|
|
68981
|
+
function runningFromDishwasherOperation(operation, program, previous, fetchedAt, remainingSeconds, transitionAt) {
|
|
68982
|
+
const transitionAtMs = transitionAt ?? fetchedAt;
|
|
68983
|
+
if (operation === null) return nativeSlice(null, null, previous, transitionAtMs, fetchedAt, null);
|
|
68984
|
+
if (operation === "Run" || operation === "Aborting") {
|
|
68985
|
+
const bootstrap = programStartFromRemaining(true, remainingSeconds, fetchedAt);
|
|
68986
|
+
return nativeSlice(true, program ?? operation, previous, transitionAtMs, fetchedAt, bootstrap);
|
|
68987
|
+
}
|
|
68988
|
+
if (operation === "Pause") return nativeSlice(false, "Pause", previous, transitionAtMs, fetchedAt, null);
|
|
68989
|
+
return nativeSlice(false, operation, previous, transitionAtMs, fetchedAt, null);
|
|
66253
68990
|
}
|
|
66254
68991
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
68992
|
+
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;
|
|
68993
|
+
String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
|
|
68994
|
+
DeviceRole.BinarySensor, DeviceRole.MotionSensor;
|
|
68995
|
+
new Set(CAP_NAMES);
|
|
66255
68996
|
Object.freeze({
|
|
66256
68997
|
person: .5,
|
|
66257
68998
|
vehicle: .5,
|
|
@@ -67485,7 +70226,7 @@ var BaseDeviceProvider = class extends BaseAddon {
|
|
|
67485
70226
|
* A top-level persisted row with NO configuration is a leftover, not a
|
|
67486
70227
|
* device — quarantine it instead of dialling it.
|
|
67487
70228
|
*
|
|
67488
|
-
* Device
|
|
70229
|
+
* Device 105 was deleted, resurrected as a config-less shell by a write
|
|
67489
70230
|
* already in flight (D376), and then dialled at every single boot: eight
|
|
67490
70231
|
* `Failed to restore device — bounded retry scheduled` lines in one day,
|
|
67491
70232
|
* each one the same Zod refusal on `host` and `password`. The bound was
|
|
@@ -70795,6 +73536,27 @@ Object.freeze({
|
|
|
70795
73536
|
access: "create",
|
|
70796
73537
|
role: "viewer"
|
|
70797
73538
|
},
|
|
73539
|
+
"displayPalette.getPalette": {
|
|
73540
|
+
capName: "display-palette",
|
|
73541
|
+
capScope: "system",
|
|
73542
|
+
addonId: null,
|
|
73543
|
+
access: "view",
|
|
73544
|
+
role: "viewer"
|
|
73545
|
+
},
|
|
73546
|
+
"displayPalette.listPresets": {
|
|
73547
|
+
capName: "display-palette",
|
|
73548
|
+
capScope: "system",
|
|
73549
|
+
addonId: null,
|
|
73550
|
+
access: "view",
|
|
73551
|
+
role: "viewer"
|
|
73552
|
+
},
|
|
73553
|
+
"displayPalette.setPalette": {
|
|
73554
|
+
capName: "display-palette",
|
|
73555
|
+
capScope: "system",
|
|
73556
|
+
addonId: null,
|
|
73557
|
+
access: "create",
|
|
73558
|
+
role: "admin"
|
|
73559
|
+
},
|
|
70798
73560
|
"doorbell.getStatus": {
|
|
70799
73561
|
capName: "doorbell",
|
|
70800
73562
|
capScope: "device",
|
|
@@ -80712,7 +83474,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
80712
83474
|
state: [{
|
|
80713
83475
|
kind: "boolean",
|
|
80714
83476
|
field: "on",
|
|
80715
|
-
label: t("
|
|
83477
|
+
label: t("On", "Acceso"),
|
|
80716
83478
|
whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
|
|
80717
83479
|
whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
|
|
80718
83480
|
icon: "toggle-right"
|
|
@@ -81251,6 +84013,7 @@ var SYSTEM_CAP_VOCABULARY = {
|
|
|
81251
84013
|
"device-provider": system(INTERNAL),
|
|
81252
84014
|
"device-removal-hook": system(INTERNAL),
|
|
81253
84015
|
"device-state": system("the runtime-state mirror every trigger already reads through"),
|
|
84016
|
+
"display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
|
|
81254
84017
|
"embedding-encoder": system(ML),
|
|
81255
84018
|
"face-gallery": system("the face gallery — curated on its own page"),
|
|
81256
84019
|
"failure-contribution": system(INTERNAL),
|
|
@@ -84135,6 +86898,94 @@ Object.freeze({
|
|
|
84135
86898
|
"smtp-provider": "email"
|
|
84136
86899
|
});
|
|
84137
86900
|
DeviceType.Camera;
|
|
86901
|
+
/**
|
|
86902
|
+
* A saved Customize assignment (D936). The schema is the type: callers use
|
|
86903
|
+
* `z.infer`, they do not restate the shape.
|
|
86904
|
+
*/
|
|
86905
|
+
var OverrideSourceSchema = object({
|
|
86906
|
+
addonId: string().min(1),
|
|
86907
|
+
stableId: string().min(1),
|
|
86908
|
+
cap: string().min(1),
|
|
86909
|
+
fieldPath: string().min(1)
|
|
86910
|
+
});
|
|
86911
|
+
var CustomizeTransformDraftSchema = discriminatedUnion("kind", [
|
|
86912
|
+
object({ kind: literal("identity") }),
|
|
86913
|
+
object({ kind: literal("invert") }),
|
|
86914
|
+
object({
|
|
86915
|
+
kind: literal("threshold"),
|
|
86916
|
+
comparison: _enum(["gte", "lte"]),
|
|
86917
|
+
threshold: number(),
|
|
86918
|
+
startDwellMs: number().nonnegative(),
|
|
86919
|
+
stopDwellMs: number().nonnegative()
|
|
86920
|
+
}),
|
|
86921
|
+
object({
|
|
86922
|
+
kind: literal("linear"),
|
|
86923
|
+
scale: number(),
|
|
86924
|
+
offset: number(),
|
|
86925
|
+
clampMin: number().optional(),
|
|
86926
|
+
clampMax: number().optional()
|
|
86927
|
+
}),
|
|
86928
|
+
object({
|
|
86929
|
+
kind: literal("enum-map"),
|
|
86930
|
+
mapping: record(string(), string().nullable())
|
|
86931
|
+
}),
|
|
86932
|
+
object({ kind: literal("number") })
|
|
86933
|
+
]);
|
|
86934
|
+
var ScalarOverrideDraftSchema = object({
|
|
86935
|
+
kind: literal("scalar"),
|
|
86936
|
+
cap: string().min(1),
|
|
86937
|
+
targetId: string().min(1),
|
|
86938
|
+
source: OverrideSourceSchema,
|
|
86939
|
+
transform: CustomizeTransformDraftSchema
|
|
86940
|
+
});
|
|
86941
|
+
var KeyedArrayOverrideDraftSchema = object({
|
|
86942
|
+
kind: literal("keyedArray"),
|
|
86943
|
+
cap: string().min(1),
|
|
86944
|
+
targetId: string().min(1),
|
|
86945
|
+
key: string().min(1),
|
|
86946
|
+
label: string().min(1),
|
|
86947
|
+
fieldPath: string().min(1),
|
|
86948
|
+
source: OverrideSourceSchema,
|
|
86949
|
+
transform: CustomizeTransformDraftSchema
|
|
86950
|
+
});
|
|
86951
|
+
var PulseOverrideDraftSchema = object({
|
|
86952
|
+
kind: literal("pulse"),
|
|
86953
|
+
cap: string().min(1),
|
|
86954
|
+
targetId: string().min(1),
|
|
86955
|
+
enabled: boolean(),
|
|
86956
|
+
debounceMs: number().nonnegative(),
|
|
86957
|
+
sources: array(OverrideSourceSchema).min(1)
|
|
86958
|
+
});
|
|
86959
|
+
var SpanSourceDraftSchema = OverrideSourceSchema.extend({ mode: _enum([
|
|
86960
|
+
"in-addition",
|
|
86961
|
+
"confirm",
|
|
86962
|
+
"replace"
|
|
86963
|
+
]).optional() });
|
|
86964
|
+
discriminatedUnion("kind", [
|
|
86965
|
+
ScalarOverrideDraftSchema,
|
|
86966
|
+
KeyedArrayOverrideDraftSchema,
|
|
86967
|
+
PulseOverrideDraftSchema,
|
|
86968
|
+
object({
|
|
86969
|
+
kind: literal("span"),
|
|
86970
|
+
cap: string().min(1),
|
|
86971
|
+
targetId: string().min(1),
|
|
86972
|
+
timeoutMs: number().nonnegative(),
|
|
86973
|
+
cooldownMs: number().nonnegative().optional(),
|
|
86974
|
+
sources: array(SpanSourceDraftSchema)
|
|
86975
|
+
})
|
|
86976
|
+
]);
|
|
86977
|
+
object({
|
|
86978
|
+
targetId: string().min(1),
|
|
86979
|
+
configured: boolean(),
|
|
86980
|
+
source: _enum(["native", "assigned"]),
|
|
86981
|
+
state: _enum([
|
|
86982
|
+
"active",
|
|
86983
|
+
"stale",
|
|
86984
|
+
"released",
|
|
86985
|
+
"unavailable"
|
|
86986
|
+
]),
|
|
86987
|
+
reason: string().nullable()
|
|
86988
|
+
});
|
|
84138
86989
|
var G711_SCALE_CORRECTION_DB = {
|
|
84139
86990
|
PCMU: 20 * Math.log10(4),
|
|
84140
86991
|
PCMA: 20 * Math.log10(8)
|
|
@@ -84507,7 +87358,7 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
84507
87358
|
{
|
|
84508
87359
|
name: "summaryStreams",
|
|
84509
87360
|
label: "Summary: streams offline",
|
|
84510
|
-
example: "
|
|
87361
|
+
example: "Front door (high) — since 06:40",
|
|
84511
87362
|
kinds: ["stream-offline", "stream-online"]
|
|
84512
87363
|
},
|
|
84513
87364
|
{
|
|
@@ -84525,13 +87376,13 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
84525
87376
|
{
|
|
84526
87377
|
name: "summaryDetection",
|
|
84527
87378
|
label: "Summary: cameras detecting nothing",
|
|
84528
|
-
example: "
|
|
87379
|
+
example: "Front door — since 05:10",
|
|
84529
87380
|
kinds: ["detection-blind"]
|
|
84530
87381
|
},
|
|
84531
87382
|
{
|
|
84532
87383
|
name: "summaryNodes",
|
|
84533
87384
|
label: "Summary: nodes",
|
|
84534
|
-
example: "
|
|
87385
|
+
example: "agent-a — offline since 03:00",
|
|
84535
87386
|
kinds: [
|
|
84536
87387
|
"node-offline",
|
|
84537
87388
|
"node-online",
|
|
@@ -85365,6 +88216,12 @@ Object.defineProperty(exports, "EventCategory", {
|
|
|
85365
88216
|
return EventCategory;
|
|
85366
88217
|
}
|
|
85367
88218
|
});
|
|
88219
|
+
Object.defineProperty(exports, "RUNNING_STATE_COLD", {
|
|
88220
|
+
enumerable: true,
|
|
88221
|
+
get: function() {
|
|
88222
|
+
return RUNNING_STATE_COLD;
|
|
88223
|
+
}
|
|
88224
|
+
});
|
|
85368
88225
|
Object.defineProperty(exports, "_enum", {
|
|
85369
88226
|
enumerable: true,
|
|
85370
88227
|
get: function() {
|