@camstack/addon-provider-dreame 0.2.153 → 0.2.155
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +3022 -190
- package/dist/addon.mjs +3022 -190
- package/package.json +7 -2
package/dist/addon.mjs
CHANGED
|
@@ -41,7 +41,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
41
41
|
var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
42
42
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
43
43
|
//#endregion
|
|
44
|
-
//#region ../types/dist/event-category-
|
|
44
|
+
//#region ../types/dist/event-category-DHXxB8t9.mjs
|
|
45
45
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
46
46
|
EventCategory["SystemBoot"] = "system.boot";
|
|
47
47
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -337,7 +337,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
337
337
|
* TRANSITION into that state (never per dispatch), and the node is dropped
|
|
338
338
|
* from the placement candidate set for as long as it holds.
|
|
339
339
|
*
|
|
340
|
-
* This exists because the state was previously invisible:
|
|
340
|
+
* This exists because the state was previously invisible: agent-a
|
|
341
341
|
* absorbed 283k inference errors in a day while still being handed cameras,
|
|
342
342
|
* and nothing in the system said so.
|
|
343
343
|
*
|
|
@@ -5476,7 +5476,7 @@ var ZodIssueCode$1 = {
|
|
|
5476
5476
|
var ZodFirstPartyTypeKind$1;
|
|
5477
5477
|
ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
|
|
5478
5478
|
//#endregion
|
|
5479
|
-
//#region ../types/dist/sleep-
|
|
5479
|
+
//#region ../types/dist/sleep-BErAxhul.mjs
|
|
5480
5480
|
/**
|
|
5481
5481
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5482
5482
|
* window to float samples (D455).
|
|
@@ -8499,6 +8499,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
|
|
|
8499
8499
|
kind: "mutation",
|
|
8500
8500
|
auth: "admin"
|
|
8501
8501
|
}), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
|
|
8502
|
+
Object.freeze({ "doorbell": "lastPressedAt" });
|
|
8503
|
+
/** Every capability name, so addon code can check a name without the schema graph. */
|
|
8504
|
+
var CAP_NAMES = Object.freeze([
|
|
8505
|
+
"accessories",
|
|
8506
|
+
"addon-pages",
|
|
8507
|
+
"addon-pages-source",
|
|
8508
|
+
"addon-routes",
|
|
8509
|
+
"addon-settings",
|
|
8510
|
+
"addon-widgets",
|
|
8511
|
+
"addon-widgets-source",
|
|
8512
|
+
"addons",
|
|
8513
|
+
"admin-ui",
|
|
8514
|
+
"air-quality-sensor",
|
|
8515
|
+
"alarm-panel",
|
|
8516
|
+
"alerts",
|
|
8517
|
+
"ambient-light-sensor",
|
|
8518
|
+
"audio-analysis",
|
|
8519
|
+
"audio-analyzer",
|
|
8520
|
+
"audio-codec",
|
|
8521
|
+
"audio-metrics",
|
|
8522
|
+
"auth-provider",
|
|
8523
|
+
"automation-control",
|
|
8524
|
+
"backup",
|
|
8525
|
+
"battery",
|
|
8526
|
+
"binary",
|
|
8527
|
+
"brightness",
|
|
8528
|
+
"broker",
|
|
8529
|
+
"button",
|
|
8530
|
+
"calendar-source",
|
|
8531
|
+
"calendars",
|
|
8532
|
+
"camera-credentials",
|
|
8533
|
+
"camera-grid-layout",
|
|
8534
|
+
"camera-pipeline-config",
|
|
8535
|
+
"camera-streams",
|
|
8536
|
+
"carbon-monoxide",
|
|
8537
|
+
"climate-control",
|
|
8538
|
+
"color",
|
|
8539
|
+
"composer",
|
|
8540
|
+
"connection-test",
|
|
8541
|
+
"connectivity",
|
|
8542
|
+
"consumables",
|
|
8543
|
+
"contact",
|
|
8544
|
+
"control",
|
|
8545
|
+
"core-blocks",
|
|
8546
|
+
"cover",
|
|
8547
|
+
"custom-model-registry",
|
|
8548
|
+
"data-store-provider",
|
|
8549
|
+
"database-snapshot",
|
|
8550
|
+
"day-night",
|
|
8551
|
+
"decoder",
|
|
8552
|
+
"detection-pipeline",
|
|
8553
|
+
"device-admin-link",
|
|
8554
|
+
"device-adoption",
|
|
8555
|
+
"device-credentials",
|
|
8556
|
+
"device-discovery",
|
|
8557
|
+
"device-export",
|
|
8558
|
+
"device-extension",
|
|
8559
|
+
"device-history",
|
|
8560
|
+
"device-manager",
|
|
8561
|
+
"device-ops",
|
|
8562
|
+
"device-provider",
|
|
8563
|
+
"device-removal-hook",
|
|
8564
|
+
"device-state",
|
|
8565
|
+
"device-status",
|
|
8566
|
+
"dishwasher",
|
|
8567
|
+
"display-palette",
|
|
8568
|
+
"doorbell",
|
|
8569
|
+
"embedding-encoder",
|
|
8570
|
+
"enum-sensor",
|
|
8571
|
+
"event-emitter",
|
|
8572
|
+
"face-gallery",
|
|
8573
|
+
"failure-contribution",
|
|
8574
|
+
"fan-control",
|
|
8575
|
+
"feature-probe",
|
|
8576
|
+
"filesystem-browse",
|
|
8577
|
+
"flood",
|
|
8578
|
+
"gas",
|
|
8579
|
+
"heating-valve",
|
|
8580
|
+
"humidifier",
|
|
8581
|
+
"humidity-sensor",
|
|
8582
|
+
"image",
|
|
8583
|
+
"image-settings",
|
|
8584
|
+
"integrations",
|
|
8585
|
+
"intercom",
|
|
8586
|
+
"keychain",
|
|
8587
|
+
"keychain-admin",
|
|
8588
|
+
"lawn-mower-control",
|
|
8589
|
+
"llm",
|
|
8590
|
+
"llm-runtime",
|
|
8591
|
+
"load-contribution",
|
|
8592
|
+
"local-network",
|
|
8593
|
+
"lock-control",
|
|
8594
|
+
"log-channels",
|
|
8595
|
+
"log-destination",
|
|
8596
|
+
"login-method",
|
|
8597
|
+
"media-player",
|
|
8598
|
+
"mesh-network",
|
|
8599
|
+
"metrics-provider",
|
|
8600
|
+
"model-convert",
|
|
8601
|
+
"model-distributor",
|
|
8602
|
+
"motion",
|
|
8603
|
+
"motion-detection",
|
|
8604
|
+
"motion-trigger",
|
|
8605
|
+
"motion-zones",
|
|
8606
|
+
"mqtt-broker",
|
|
8607
|
+
"native-object-detection",
|
|
8608
|
+
"navigation",
|
|
8609
|
+
"network-access",
|
|
8610
|
+
"network-link",
|
|
8611
|
+
"network-quality",
|
|
8612
|
+
"node-certificates",
|
|
8613
|
+
"nodes",
|
|
8614
|
+
"notification-output",
|
|
8615
|
+
"notification-rules",
|
|
8616
|
+
"notifier",
|
|
8617
|
+
"numeric-sensor",
|
|
8618
|
+
"oauth-integration",
|
|
8619
|
+
"oidc-connections",
|
|
8620
|
+
"osd",
|
|
8621
|
+
"osd-manager",
|
|
8622
|
+
"pet-feeder",
|
|
8623
|
+
"pipeline-analytics",
|
|
8624
|
+
"pipeline-executor",
|
|
8625
|
+
"pipeline-orchestrator",
|
|
8626
|
+
"pipeline-runner",
|
|
8627
|
+
"plate-gallery",
|
|
8628
|
+
"platform-probe",
|
|
8629
|
+
"power-meter",
|
|
8630
|
+
"presence",
|
|
8631
|
+
"pressure-sensor",
|
|
8632
|
+
"privacy-mask",
|
|
8633
|
+
"ptz",
|
|
8634
|
+
"ptz-autotrack",
|
|
8635
|
+
"reboot",
|
|
8636
|
+
"record-entries",
|
|
8637
|
+
"recording",
|
|
8638
|
+
"recording-archive",
|
|
8639
|
+
"recording-export",
|
|
8640
|
+
"recording-onboard",
|
|
8641
|
+
"recording-signal",
|
|
8642
|
+
"records",
|
|
8643
|
+
"running-state",
|
|
8644
|
+
"scene-monitor",
|
|
8645
|
+
"script-runner",
|
|
8646
|
+
"server-management",
|
|
8647
|
+
"settings-store",
|
|
8648
|
+
"smoke",
|
|
8649
|
+
"smtp-provider",
|
|
8650
|
+
"snapshot",
|
|
8651
|
+
"sso-bridge",
|
|
8652
|
+
"storage",
|
|
8653
|
+
"storage-admin",
|
|
8654
|
+
"storage-evictable",
|
|
8655
|
+
"storage-migration",
|
|
8656
|
+
"storage-occupancy",
|
|
8657
|
+
"storage-provider",
|
|
8658
|
+
"stream-broker",
|
|
8659
|
+
"stream-catalog",
|
|
8660
|
+
"stream-params",
|
|
8661
|
+
"stream-signals",
|
|
8662
|
+
"switch",
|
|
8663
|
+
"system",
|
|
8664
|
+
"tamper",
|
|
8665
|
+
"temperature-sensor",
|
|
8666
|
+
"terminal-session",
|
|
8667
|
+
"toast",
|
|
8668
|
+
"training",
|
|
8669
|
+
"training-provider",
|
|
8670
|
+
"turn-provider",
|
|
8671
|
+
"update",
|
|
8672
|
+
"user-management",
|
|
8673
|
+
"user-passkeys",
|
|
8674
|
+
"vacuum-control",
|
|
8675
|
+
"valve",
|
|
8676
|
+
"vector-store",
|
|
8677
|
+
"vibration",
|
|
8678
|
+
"videoclips",
|
|
8679
|
+
"viewer-ui",
|
|
8680
|
+
"water-heater",
|
|
8681
|
+
"weather",
|
|
8682
|
+
"webrtc-session",
|
|
8683
|
+
"zone-analytics",
|
|
8684
|
+
"zone-rules",
|
|
8685
|
+
"zones"
|
|
8686
|
+
]);
|
|
8687
|
+
Object.freeze({
|
|
8688
|
+
"air-quality-sensor": [
|
|
8689
|
+
{
|
|
8690
|
+
"path": "co2Ppm",
|
|
8691
|
+
"valueType": "number"
|
|
8692
|
+
},
|
|
8693
|
+
{
|
|
8694
|
+
"path": "vocPpb",
|
|
8695
|
+
"valueType": "number"
|
|
8696
|
+
},
|
|
8697
|
+
{
|
|
8698
|
+
"path": "pm25",
|
|
8699
|
+
"valueType": "number"
|
|
8700
|
+
},
|
|
8701
|
+
{
|
|
8702
|
+
"path": "pm10",
|
|
8703
|
+
"valueType": "number"
|
|
8704
|
+
},
|
|
8705
|
+
{
|
|
8706
|
+
"path": "aqi",
|
|
8707
|
+
"valueType": "number"
|
|
8708
|
+
},
|
|
8709
|
+
{
|
|
8710
|
+
"path": "unit",
|
|
8711
|
+
"valueType": "string"
|
|
8712
|
+
},
|
|
8713
|
+
{
|
|
8714
|
+
"path": "precision",
|
|
8715
|
+
"valueType": "number"
|
|
8716
|
+
}
|
|
8717
|
+
],
|
|
8718
|
+
"alarm-panel": [
|
|
8719
|
+
{
|
|
8720
|
+
"path": "state",
|
|
8721
|
+
"valueType": "enum",
|
|
8722
|
+
"enumValues": [
|
|
8723
|
+
"disarmed",
|
|
8724
|
+
"armed_home",
|
|
8725
|
+
"armed_away",
|
|
8726
|
+
"armed_night",
|
|
8727
|
+
"armed_vacation",
|
|
8728
|
+
"armed_custom_bypass",
|
|
8729
|
+
"arming",
|
|
8730
|
+
"disarming",
|
|
8731
|
+
"pending",
|
|
8732
|
+
"triggered"
|
|
8733
|
+
]
|
|
8734
|
+
},
|
|
8735
|
+
{
|
|
8736
|
+
"path": "targetMode",
|
|
8737
|
+
"valueType": "enum",
|
|
8738
|
+
"enumValues": [
|
|
8739
|
+
"home",
|
|
8740
|
+
"away",
|
|
8741
|
+
"night",
|
|
8742
|
+
"vacation",
|
|
8743
|
+
"custom_bypass"
|
|
8744
|
+
]
|
|
8745
|
+
},
|
|
8746
|
+
{
|
|
8747
|
+
"path": "requiresCode",
|
|
8748
|
+
"valueType": "boolean"
|
|
8749
|
+
}
|
|
8750
|
+
],
|
|
8751
|
+
"ambient-light-sensor": [
|
|
8752
|
+
{
|
|
8753
|
+
"path": "lux",
|
|
8754
|
+
"valueType": "number"
|
|
8755
|
+
},
|
|
8756
|
+
{
|
|
8757
|
+
"path": "unit",
|
|
8758
|
+
"valueType": "string"
|
|
8759
|
+
},
|
|
8760
|
+
{
|
|
8761
|
+
"path": "precision",
|
|
8762
|
+
"valueType": "number"
|
|
8763
|
+
}
|
|
8764
|
+
],
|
|
8765
|
+
"audio-metrics": [
|
|
8766
|
+
{
|
|
8767
|
+
"path": "ts",
|
|
8768
|
+
"valueType": "number"
|
|
8769
|
+
},
|
|
8770
|
+
{
|
|
8771
|
+
"path": "windowSec",
|
|
8772
|
+
"valueType": "number"
|
|
8773
|
+
},
|
|
8774
|
+
{
|
|
8775
|
+
"path": "level.rms",
|
|
8776
|
+
"valueType": "number"
|
|
8777
|
+
},
|
|
8778
|
+
{
|
|
8779
|
+
"path": "level.dbfs",
|
|
8780
|
+
"valueType": "number"
|
|
8781
|
+
},
|
|
8782
|
+
{
|
|
8783
|
+
"path": "peakDbfs",
|
|
8784
|
+
"valueType": "number"
|
|
8785
|
+
},
|
|
8786
|
+
{
|
|
8787
|
+
"path": "avgDbfs",
|
|
8788
|
+
"valueType": "number"
|
|
8789
|
+
},
|
|
8790
|
+
{
|
|
8791
|
+
"path": "current.className",
|
|
8792
|
+
"valueType": "string"
|
|
8793
|
+
},
|
|
8794
|
+
{
|
|
8795
|
+
"path": "current.score",
|
|
8796
|
+
"valueType": "number"
|
|
8797
|
+
},
|
|
8798
|
+
{
|
|
8799
|
+
"path": "current.timestamp",
|
|
8800
|
+
"valueType": "number"
|
|
8801
|
+
}
|
|
8802
|
+
],
|
|
8803
|
+
"automation-control": [
|
|
8804
|
+
{
|
|
8805
|
+
"path": "enabled",
|
|
8806
|
+
"valueType": "boolean"
|
|
8807
|
+
},
|
|
8808
|
+
{
|
|
8809
|
+
"path": "isRunning",
|
|
8810
|
+
"valueType": "boolean"
|
|
8811
|
+
},
|
|
8812
|
+
{
|
|
8813
|
+
"path": "lastTriggeredAt",
|
|
8814
|
+
"valueType": "number"
|
|
8815
|
+
},
|
|
8816
|
+
{
|
|
8817
|
+
"path": "lastError",
|
|
8818
|
+
"valueType": "string"
|
|
8819
|
+
}
|
|
8820
|
+
],
|
|
8821
|
+
"battery": [
|
|
8822
|
+
{
|
|
8823
|
+
"path": "percentage",
|
|
8824
|
+
"valueType": "number"
|
|
8825
|
+
},
|
|
8826
|
+
{
|
|
8827
|
+
"path": "charging",
|
|
8828
|
+
"valueType": "enum",
|
|
8829
|
+
"enumValues": [
|
|
8830
|
+
"dc",
|
|
8831
|
+
"solar",
|
|
8832
|
+
"none",
|
|
8833
|
+
"unknown"
|
|
8834
|
+
]
|
|
8835
|
+
},
|
|
8836
|
+
{
|
|
8837
|
+
"path": "sleeping",
|
|
8838
|
+
"valueType": "boolean"
|
|
8839
|
+
},
|
|
8840
|
+
{
|
|
8841
|
+
"path": "lastUpdated",
|
|
8842
|
+
"valueType": "number"
|
|
8843
|
+
},
|
|
8844
|
+
{
|
|
8845
|
+
"path": "lastContactAt",
|
|
8846
|
+
"valueType": "number"
|
|
8847
|
+
},
|
|
8848
|
+
{
|
|
8849
|
+
"path": "lastFullRefreshAt",
|
|
8850
|
+
"valueType": "number"
|
|
8851
|
+
},
|
|
8852
|
+
{
|
|
8853
|
+
"path": "binary",
|
|
8854
|
+
"valueType": "boolean"
|
|
8855
|
+
}
|
|
8856
|
+
],
|
|
8857
|
+
"binary": [{
|
|
8858
|
+
"path": "on",
|
|
8859
|
+
"valueType": "boolean"
|
|
8860
|
+
}],
|
|
8861
|
+
"brightness": [{
|
|
8862
|
+
"path": "percentage",
|
|
8863
|
+
"valueType": "number"
|
|
8864
|
+
}],
|
|
8865
|
+
"broker": [{
|
|
8866
|
+
"path": "brokerCount",
|
|
8867
|
+
"valueType": "number"
|
|
8868
|
+
}, {
|
|
8869
|
+
"path": "connectedCount",
|
|
8870
|
+
"valueType": "number"
|
|
8871
|
+
}],
|
|
8872
|
+
"camera-credentials": [
|
|
8873
|
+
{
|
|
8874
|
+
"path": "host",
|
|
8875
|
+
"valueType": "string"
|
|
8876
|
+
},
|
|
8877
|
+
{
|
|
8878
|
+
"path": "port",
|
|
8879
|
+
"valueType": "number"
|
|
8880
|
+
},
|
|
8881
|
+
{
|
|
8882
|
+
"path": "onvifPort",
|
|
8883
|
+
"valueType": "number"
|
|
8884
|
+
},
|
|
8885
|
+
{
|
|
8886
|
+
"path": "rtspPort",
|
|
8887
|
+
"valueType": "number"
|
|
8888
|
+
},
|
|
8889
|
+
{
|
|
8890
|
+
"path": "https",
|
|
8891
|
+
"valueType": "boolean"
|
|
8892
|
+
},
|
|
8893
|
+
{
|
|
8894
|
+
"path": "hasUsername",
|
|
8895
|
+
"valueType": "boolean"
|
|
8896
|
+
},
|
|
8897
|
+
{
|
|
8898
|
+
"path": "hasPassword",
|
|
8899
|
+
"valueType": "boolean"
|
|
8900
|
+
},
|
|
8901
|
+
{
|
|
8902
|
+
"path": "onvifProfile",
|
|
8903
|
+
"valueType": "string"
|
|
8904
|
+
}
|
|
8905
|
+
],
|
|
8906
|
+
"camera-streams": [
|
|
8907
|
+
{
|
|
8908
|
+
"path": "online",
|
|
8909
|
+
"valueType": "boolean"
|
|
8910
|
+
},
|
|
8911
|
+
{
|
|
8912
|
+
"path": "slotStatuses.high",
|
|
8913
|
+
"valueType": "enum",
|
|
8914
|
+
"enumValues": [
|
|
8915
|
+
"unassigned",
|
|
8916
|
+
"idle",
|
|
8917
|
+
"connecting",
|
|
8918
|
+
"streaming",
|
|
8919
|
+
"error"
|
|
8920
|
+
]
|
|
8921
|
+
},
|
|
8922
|
+
{
|
|
8923
|
+
"path": "slotStatuses.mid",
|
|
8924
|
+
"valueType": "enum",
|
|
8925
|
+
"enumValues": [
|
|
8926
|
+
"unassigned",
|
|
8927
|
+
"idle",
|
|
8928
|
+
"connecting",
|
|
8929
|
+
"streaming",
|
|
8930
|
+
"error"
|
|
8931
|
+
]
|
|
8932
|
+
},
|
|
8933
|
+
{
|
|
8934
|
+
"path": "slotStatuses.low",
|
|
8935
|
+
"valueType": "enum",
|
|
8936
|
+
"enumValues": [
|
|
8937
|
+
"unassigned",
|
|
8938
|
+
"idle",
|
|
8939
|
+
"connecting",
|
|
8940
|
+
"streaming",
|
|
8941
|
+
"error"
|
|
8942
|
+
]
|
|
8943
|
+
},
|
|
8944
|
+
{
|
|
8945
|
+
"path": "slotErrors.high",
|
|
8946
|
+
"valueType": "string"
|
|
8947
|
+
},
|
|
8948
|
+
{
|
|
8949
|
+
"path": "slotErrors.mid",
|
|
8950
|
+
"valueType": "string"
|
|
8951
|
+
},
|
|
8952
|
+
{
|
|
8953
|
+
"path": "slotErrors.low",
|
|
8954
|
+
"valueType": "string"
|
|
8955
|
+
}
|
|
8956
|
+
],
|
|
8957
|
+
"carbon-monoxide": [{
|
|
8958
|
+
"path": "detected",
|
|
8959
|
+
"valueType": "boolean"
|
|
8960
|
+
}],
|
|
8961
|
+
"climate-control": [
|
|
8962
|
+
{
|
|
8963
|
+
"path": "mode",
|
|
8964
|
+
"valueType": "enum",
|
|
8965
|
+
"enumValues": [
|
|
8966
|
+
"off",
|
|
8967
|
+
"heat",
|
|
8968
|
+
"cool",
|
|
8969
|
+
"auto",
|
|
8970
|
+
"heat_cool",
|
|
8971
|
+
"fan_only",
|
|
8972
|
+
"dry"
|
|
8973
|
+
]
|
|
8974
|
+
},
|
|
8975
|
+
{
|
|
8976
|
+
"path": "fanMode",
|
|
8977
|
+
"valueType": "string"
|
|
8978
|
+
},
|
|
8979
|
+
{
|
|
8980
|
+
"path": "preset",
|
|
8981
|
+
"valueType": "string"
|
|
8982
|
+
},
|
|
8983
|
+
{
|
|
8984
|
+
"path": "target",
|
|
8985
|
+
"valueType": "number"
|
|
8986
|
+
},
|
|
8987
|
+
{
|
|
8988
|
+
"path": "targetHigh",
|
|
8989
|
+
"valueType": "number"
|
|
8990
|
+
},
|
|
8991
|
+
{
|
|
8992
|
+
"path": "targetLow",
|
|
8993
|
+
"valueType": "number"
|
|
8994
|
+
},
|
|
8995
|
+
{
|
|
8996
|
+
"path": "targetHumidity",
|
|
8997
|
+
"valueType": "number"
|
|
8998
|
+
},
|
|
8999
|
+
{
|
|
9000
|
+
"path": "currentTemp",
|
|
9001
|
+
"valueType": "number"
|
|
9002
|
+
},
|
|
9003
|
+
{
|
|
9004
|
+
"path": "currentHumidity",
|
|
9005
|
+
"valueType": "number"
|
|
9006
|
+
},
|
|
9007
|
+
{
|
|
9008
|
+
"path": "swingVertical",
|
|
9009
|
+
"valueType": "boolean"
|
|
9010
|
+
},
|
|
9011
|
+
{
|
|
9012
|
+
"path": "swingHorizontal",
|
|
9013
|
+
"valueType": "boolean"
|
|
9014
|
+
},
|
|
9015
|
+
{
|
|
9016
|
+
"path": "minTemp",
|
|
9017
|
+
"valueType": "number"
|
|
9018
|
+
},
|
|
9019
|
+
{
|
|
9020
|
+
"path": "maxTemp",
|
|
9021
|
+
"valueType": "number"
|
|
9022
|
+
},
|
|
9023
|
+
{
|
|
9024
|
+
"path": "tempStep",
|
|
9025
|
+
"valueType": "number"
|
|
9026
|
+
}
|
|
9027
|
+
],
|
|
9028
|
+
"color": [
|
|
9029
|
+
{
|
|
9030
|
+
"path": "mode",
|
|
9031
|
+
"valueType": "enum",
|
|
9032
|
+
"enumValues": [
|
|
9033
|
+
"rgb",
|
|
9034
|
+
"hsv",
|
|
9035
|
+
"mired"
|
|
9036
|
+
]
|
|
9037
|
+
},
|
|
9038
|
+
{
|
|
9039
|
+
"path": "rgb.r",
|
|
9040
|
+
"valueType": "number"
|
|
9041
|
+
},
|
|
9042
|
+
{
|
|
9043
|
+
"path": "rgb.g",
|
|
9044
|
+
"valueType": "number"
|
|
9045
|
+
},
|
|
9046
|
+
{
|
|
9047
|
+
"path": "rgb.b",
|
|
9048
|
+
"valueType": "number"
|
|
9049
|
+
},
|
|
9050
|
+
{
|
|
9051
|
+
"path": "hsv.h",
|
|
9052
|
+
"valueType": "number"
|
|
9053
|
+
},
|
|
9054
|
+
{
|
|
9055
|
+
"path": "hsv.s",
|
|
9056
|
+
"valueType": "number"
|
|
9057
|
+
},
|
|
9058
|
+
{
|
|
9059
|
+
"path": "hsv.v",
|
|
9060
|
+
"valueType": "number"
|
|
9061
|
+
},
|
|
9062
|
+
{
|
|
9063
|
+
"path": "mireds",
|
|
9064
|
+
"valueType": "number"
|
|
9065
|
+
}
|
|
9066
|
+
],
|
|
9067
|
+
"connectivity": [{
|
|
9068
|
+
"path": "connected",
|
|
9069
|
+
"valueType": "boolean"
|
|
9070
|
+
}],
|
|
9071
|
+
"contact": [{
|
|
9072
|
+
"path": "entryOpen",
|
|
9073
|
+
"valueType": "boolean"
|
|
9074
|
+
}],
|
|
9075
|
+
"control": [
|
|
9076
|
+
{
|
|
9077
|
+
"path": "kind",
|
|
9078
|
+
"valueType": "enum",
|
|
9079
|
+
"enumValues": [
|
|
9080
|
+
"numeric",
|
|
9081
|
+
"select",
|
|
9082
|
+
"text",
|
|
9083
|
+
"datetime"
|
|
9084
|
+
]
|
|
9085
|
+
},
|
|
9086
|
+
{
|
|
9087
|
+
"path": "unit",
|
|
9088
|
+
"valueType": "string"
|
|
9089
|
+
},
|
|
9090
|
+
{
|
|
9091
|
+
"path": "min",
|
|
9092
|
+
"valueType": "number"
|
|
9093
|
+
},
|
|
9094
|
+
{
|
|
9095
|
+
"path": "max",
|
|
9096
|
+
"valueType": "number"
|
|
9097
|
+
},
|
|
9098
|
+
{
|
|
9099
|
+
"path": "step",
|
|
9100
|
+
"valueType": "number"
|
|
9101
|
+
},
|
|
9102
|
+
{
|
|
9103
|
+
"path": "precision",
|
|
9104
|
+
"valueType": "number"
|
|
9105
|
+
},
|
|
9106
|
+
{
|
|
9107
|
+
"path": "format",
|
|
9108
|
+
"valueType": "enum",
|
|
9109
|
+
"enumValues": [
|
|
9110
|
+
"date",
|
|
9111
|
+
"time",
|
|
9112
|
+
"datetime"
|
|
9113
|
+
]
|
|
9114
|
+
}
|
|
9115
|
+
],
|
|
9116
|
+
"cover": [
|
|
9117
|
+
{
|
|
9118
|
+
"path": "state",
|
|
9119
|
+
"valueType": "enum",
|
|
9120
|
+
"enumValues": [
|
|
9121
|
+
"open",
|
|
9122
|
+
"opening",
|
|
9123
|
+
"closing",
|
|
9124
|
+
"closed",
|
|
9125
|
+
"stopped"
|
|
9126
|
+
]
|
|
9127
|
+
},
|
|
9128
|
+
{
|
|
9129
|
+
"path": "position",
|
|
9130
|
+
"valueType": "number"
|
|
9131
|
+
},
|
|
9132
|
+
{
|
|
9133
|
+
"path": "tiltPosition",
|
|
9134
|
+
"valueType": "number"
|
|
9135
|
+
}
|
|
9136
|
+
],
|
|
9137
|
+
"day-night": [
|
|
9138
|
+
{
|
|
9139
|
+
"path": "mode",
|
|
9140
|
+
"valueType": "enum",
|
|
9141
|
+
"enumValues": [
|
|
9142
|
+
"auto",
|
|
9143
|
+
"day",
|
|
9144
|
+
"night",
|
|
9145
|
+
"schedule"
|
|
9146
|
+
]
|
|
9147
|
+
},
|
|
9148
|
+
{
|
|
9149
|
+
"path": "sensitivity",
|
|
9150
|
+
"valueType": "number"
|
|
9151
|
+
},
|
|
9152
|
+
{
|
|
9153
|
+
"path": "switchDelaySec",
|
|
9154
|
+
"valueType": "number"
|
|
9155
|
+
}
|
|
9156
|
+
],
|
|
9157
|
+
"device-adoption": [
|
|
9158
|
+
{
|
|
9159
|
+
"path": "lastDiscoveryAt",
|
|
9160
|
+
"valueType": "number"
|
|
9161
|
+
},
|
|
9162
|
+
{
|
|
9163
|
+
"path": "candidateCount",
|
|
9164
|
+
"valueType": "number"
|
|
9165
|
+
},
|
|
9166
|
+
{
|
|
9167
|
+
"path": "adoptedCount",
|
|
9168
|
+
"valueType": "number"
|
|
9169
|
+
},
|
|
9170
|
+
{
|
|
9171
|
+
"path": "lastError",
|
|
9172
|
+
"valueType": "string"
|
|
9173
|
+
}
|
|
9174
|
+
],
|
|
9175
|
+
"device-discovery": [{
|
|
9176
|
+
"path": "lastDiscoveryAt",
|
|
9177
|
+
"valueType": "number"
|
|
9178
|
+
}, {
|
|
9179
|
+
"path": "lastError",
|
|
9180
|
+
"valueType": "string"
|
|
9181
|
+
}],
|
|
9182
|
+
"device-export": [
|
|
9183
|
+
{
|
|
9184
|
+
"path": "linkState",
|
|
9185
|
+
"valueType": "enum",
|
|
9186
|
+
"enumValues": [
|
|
9187
|
+
"unlinked",
|
|
9188
|
+
"linked",
|
|
9189
|
+
"error"
|
|
9190
|
+
]
|
|
9191
|
+
},
|
|
9192
|
+
{
|
|
9193
|
+
"path": "exposedDeviceCount",
|
|
9194
|
+
"valueType": "number"
|
|
9195
|
+
},
|
|
9196
|
+
{
|
|
9197
|
+
"path": "error",
|
|
9198
|
+
"valueType": "string"
|
|
9199
|
+
},
|
|
9200
|
+
{
|
|
9201
|
+
"path": "setup.qr",
|
|
9202
|
+
"valueType": "string"
|
|
9203
|
+
},
|
|
9204
|
+
{
|
|
9205
|
+
"path": "setup.note",
|
|
9206
|
+
"valueType": "string"
|
|
9207
|
+
}
|
|
9208
|
+
],
|
|
9209
|
+
"device-status": [{
|
|
9210
|
+
"path": "online",
|
|
9211
|
+
"valueType": "boolean"
|
|
9212
|
+
}],
|
|
9213
|
+
"dishwasher": [
|
|
9214
|
+
{
|
|
9215
|
+
"path": "availability",
|
|
9216
|
+
"valueType": "enum",
|
|
9217
|
+
"enumValues": [
|
|
9218
|
+
"available",
|
|
9219
|
+
"offline",
|
|
9220
|
+
"description-missing"
|
|
9221
|
+
]
|
|
9222
|
+
},
|
|
9223
|
+
{
|
|
9224
|
+
"path": "state",
|
|
9225
|
+
"valueType": "enum",
|
|
9226
|
+
"enumValues": [
|
|
9227
|
+
"idle",
|
|
9228
|
+
"running",
|
|
9229
|
+
"paused",
|
|
9230
|
+
"finished",
|
|
9231
|
+
"error",
|
|
9232
|
+
"unavailable"
|
|
9233
|
+
]
|
|
9234
|
+
},
|
|
9235
|
+
{
|
|
9236
|
+
"path": "operationState",
|
|
9237
|
+
"valueType": "enum",
|
|
9238
|
+
"enumValues": [
|
|
9239
|
+
"Inactive",
|
|
9240
|
+
"Ready",
|
|
9241
|
+
"DelayedStart",
|
|
9242
|
+
"Run",
|
|
9243
|
+
"Pause",
|
|
9244
|
+
"ActionRequired",
|
|
9245
|
+
"Finished",
|
|
9246
|
+
"Error",
|
|
9247
|
+
"Aborting"
|
|
9248
|
+
]
|
|
9249
|
+
},
|
|
9250
|
+
{
|
|
9251
|
+
"path": "program",
|
|
9252
|
+
"valueType": "string"
|
|
9253
|
+
},
|
|
9254
|
+
{
|
|
9255
|
+
"path": "selectedProgram",
|
|
9256
|
+
"valueType": "string"
|
|
9257
|
+
},
|
|
9258
|
+
{
|
|
9259
|
+
"path": "remainingSeconds",
|
|
9260
|
+
"valueType": "number"
|
|
9261
|
+
},
|
|
9262
|
+
{
|
|
9263
|
+
"path": "delayedStartSeconds",
|
|
9264
|
+
"valueType": "number"
|
|
9265
|
+
},
|
|
9266
|
+
{
|
|
9267
|
+
"path": "progressPercent",
|
|
9268
|
+
"valueType": "number"
|
|
9269
|
+
},
|
|
9270
|
+
{
|
|
9271
|
+
"path": "doorOpen",
|
|
9272
|
+
"valueType": "boolean"
|
|
9273
|
+
},
|
|
9274
|
+
{
|
|
9275
|
+
"path": "doorLocked",
|
|
9276
|
+
"valueType": "boolean"
|
|
9277
|
+
},
|
|
9278
|
+
{
|
|
9279
|
+
"path": "remoteStartAllowed",
|
|
9280
|
+
"valueType": "boolean"
|
|
9281
|
+
},
|
|
9282
|
+
{
|
|
9283
|
+
"path": "remoteControlActive",
|
|
9284
|
+
"valueType": "boolean"
|
|
9285
|
+
},
|
|
9286
|
+
{
|
|
9287
|
+
"path": "localControlActive",
|
|
9288
|
+
"valueType": "boolean"
|
|
9289
|
+
},
|
|
9290
|
+
{
|
|
9291
|
+
"path": "powerOn",
|
|
9292
|
+
"valueType": "boolean"
|
|
9293
|
+
},
|
|
9294
|
+
{
|
|
9295
|
+
"path": "powerState",
|
|
9296
|
+
"valueType": "string"
|
|
9297
|
+
},
|
|
9298
|
+
{
|
|
9299
|
+
"path": "filterCleaningDue",
|
|
9300
|
+
"valueType": "boolean"
|
|
9301
|
+
},
|
|
9302
|
+
{
|
|
9303
|
+
"path": "machineCareDue",
|
|
9304
|
+
"valueType": "boolean"
|
|
9305
|
+
},
|
|
9306
|
+
{
|
|
9307
|
+
"path": "machineCareRemainingRuns",
|
|
9308
|
+
"valueType": "number"
|
|
9309
|
+
},
|
|
9310
|
+
{
|
|
9311
|
+
"path": "halfLoad",
|
|
9312
|
+
"valueType": "boolean"
|
|
9313
|
+
},
|
|
9314
|
+
{
|
|
9315
|
+
"path": "hygienePlus",
|
|
9316
|
+
"valueType": "boolean"
|
|
9317
|
+
},
|
|
9318
|
+
{
|
|
9319
|
+
"path": "extraDry",
|
|
9320
|
+
"valueType": "boolean"
|
|
9321
|
+
},
|
|
9322
|
+
{
|
|
9323
|
+
"path": "intensiveZone",
|
|
9324
|
+
"valueType": "boolean"
|
|
9325
|
+
},
|
|
9326
|
+
{
|
|
9327
|
+
"path": "varioSpeedPlus",
|
|
9328
|
+
"valueType": "boolean"
|
|
9329
|
+
},
|
|
9330
|
+
{
|
|
9331
|
+
"path": "childLock",
|
|
9332
|
+
"valueType": "boolean"
|
|
9333
|
+
},
|
|
9334
|
+
{
|
|
9335
|
+
"path": "errorCode",
|
|
9336
|
+
"valueType": "number"
|
|
9337
|
+
},
|
|
9338
|
+
{
|
|
9339
|
+
"path": "errorLabel",
|
|
9340
|
+
"valueType": "string"
|
|
9341
|
+
}
|
|
9342
|
+
],
|
|
9343
|
+
"doorbell": [{
|
|
9344
|
+
"path": "lastPressedAt",
|
|
9345
|
+
"valueType": "number"
|
|
9346
|
+
}, {
|
|
9347
|
+
"path": "pressCountSinceStart",
|
|
9348
|
+
"valueType": "number"
|
|
9349
|
+
}],
|
|
9350
|
+
"enum-sensor": [{
|
|
9351
|
+
"path": "value",
|
|
9352
|
+
"valueType": "string"
|
|
9353
|
+
}, {
|
|
9354
|
+
"path": "format",
|
|
9355
|
+
"valueType": "enum",
|
|
9356
|
+
"enumValues": [
|
|
9357
|
+
"date",
|
|
9358
|
+
"time",
|
|
9359
|
+
"datetime"
|
|
9360
|
+
]
|
|
9361
|
+
}],
|
|
9362
|
+
"event-emitter": [
|
|
9363
|
+
{
|
|
9364
|
+
"path": "lastEvent.deviceId",
|
|
9365
|
+
"valueType": "number"
|
|
9366
|
+
},
|
|
9367
|
+
{
|
|
9368
|
+
"path": "lastEvent.eventType",
|
|
9369
|
+
"valueType": "string"
|
|
9370
|
+
},
|
|
9371
|
+
{
|
|
9372
|
+
"path": "lastEvent.timestamp",
|
|
9373
|
+
"valueType": "number"
|
|
9374
|
+
},
|
|
9375
|
+
{
|
|
9376
|
+
"path": "lastEvent.seq",
|
|
9377
|
+
"valueType": "number"
|
|
9378
|
+
},
|
|
9379
|
+
{
|
|
9380
|
+
"path": "eventCountSinceStart",
|
|
9381
|
+
"valueType": "number"
|
|
9382
|
+
}
|
|
9383
|
+
],
|
|
9384
|
+
"fan-control": [
|
|
9385
|
+
{
|
|
9386
|
+
"path": "percentage",
|
|
9387
|
+
"valueType": "number"
|
|
9388
|
+
},
|
|
9389
|
+
{
|
|
9390
|
+
"path": "percentageStep",
|
|
9391
|
+
"valueType": "number"
|
|
9392
|
+
},
|
|
9393
|
+
{
|
|
9394
|
+
"path": "preset",
|
|
9395
|
+
"valueType": "string"
|
|
9396
|
+
},
|
|
9397
|
+
{
|
|
9398
|
+
"path": "direction",
|
|
9399
|
+
"valueType": "enum",
|
|
9400
|
+
"enumValues": ["forward", "reverse"]
|
|
9401
|
+
},
|
|
9402
|
+
{
|
|
9403
|
+
"path": "oscillating",
|
|
9404
|
+
"valueType": "boolean"
|
|
9405
|
+
}
|
|
9406
|
+
],
|
|
9407
|
+
"feature-probe": [
|
|
9408
|
+
{
|
|
9409
|
+
"path": "deviceType",
|
|
9410
|
+
"valueType": "string"
|
|
9411
|
+
},
|
|
9412
|
+
{
|
|
9413
|
+
"path": "model",
|
|
9414
|
+
"valueType": "string"
|
|
9415
|
+
},
|
|
9416
|
+
{
|
|
9417
|
+
"path": "channelCount",
|
|
9418
|
+
"valueType": "number"
|
|
9419
|
+
},
|
|
9420
|
+
{
|
|
9421
|
+
"path": "lastProbedAt",
|
|
9422
|
+
"valueType": "number"
|
|
9423
|
+
}
|
|
9424
|
+
],
|
|
9425
|
+
"flood": [{
|
|
9426
|
+
"path": "flooded",
|
|
9427
|
+
"valueType": "boolean"
|
|
9428
|
+
}],
|
|
9429
|
+
"gas": [{
|
|
9430
|
+
"path": "detected",
|
|
9431
|
+
"valueType": "boolean"
|
|
9432
|
+
}],
|
|
9433
|
+
"heating-valve": [{
|
|
9434
|
+
"path": "position",
|
|
9435
|
+
"valueType": "number"
|
|
9436
|
+
}],
|
|
9437
|
+
"humidifier": [
|
|
9438
|
+
{
|
|
9439
|
+
"path": "on",
|
|
9440
|
+
"valueType": "boolean"
|
|
9441
|
+
},
|
|
9442
|
+
{
|
|
9443
|
+
"path": "currentHumidity",
|
|
9444
|
+
"valueType": "number"
|
|
9445
|
+
},
|
|
9446
|
+
{
|
|
9447
|
+
"path": "targetHumidity",
|
|
9448
|
+
"valueType": "number"
|
|
9449
|
+
},
|
|
9450
|
+
{
|
|
9451
|
+
"path": "mode",
|
|
9452
|
+
"valueType": "string"
|
|
9453
|
+
},
|
|
9454
|
+
{
|
|
9455
|
+
"path": "action",
|
|
9456
|
+
"valueType": "string"
|
|
9457
|
+
},
|
|
9458
|
+
{
|
|
9459
|
+
"path": "minHumidity",
|
|
9460
|
+
"valueType": "number"
|
|
9461
|
+
},
|
|
9462
|
+
{
|
|
9463
|
+
"path": "maxHumidity",
|
|
9464
|
+
"valueType": "number"
|
|
9465
|
+
}
|
|
9466
|
+
],
|
|
9467
|
+
"humidity-sensor": [
|
|
9468
|
+
{
|
|
9469
|
+
"path": "percent",
|
|
9470
|
+
"valueType": "number"
|
|
9471
|
+
},
|
|
9472
|
+
{
|
|
9473
|
+
"path": "unit",
|
|
9474
|
+
"valueType": "string"
|
|
9475
|
+
},
|
|
9476
|
+
{
|
|
9477
|
+
"path": "precision",
|
|
9478
|
+
"valueType": "number"
|
|
9479
|
+
}
|
|
9480
|
+
],
|
|
9481
|
+
"image": [{
|
|
9482
|
+
"path": "url",
|
|
9483
|
+
"valueType": "string"
|
|
9484
|
+
}, {
|
|
9485
|
+
"path": "lastUpdated",
|
|
9486
|
+
"valueType": "number"
|
|
9487
|
+
}],
|
|
9488
|
+
"image-settings": [
|
|
9489
|
+
{
|
|
9490
|
+
"path": "brightness",
|
|
9491
|
+
"valueType": "number"
|
|
9492
|
+
},
|
|
9493
|
+
{
|
|
9494
|
+
"path": "contrast",
|
|
9495
|
+
"valueType": "number"
|
|
9496
|
+
},
|
|
9497
|
+
{
|
|
9498
|
+
"path": "saturation",
|
|
9499
|
+
"valueType": "number"
|
|
9500
|
+
},
|
|
9501
|
+
{
|
|
9502
|
+
"path": "sharpness",
|
|
9503
|
+
"valueType": "number"
|
|
9504
|
+
},
|
|
9505
|
+
{
|
|
9506
|
+
"path": "mirror",
|
|
9507
|
+
"valueType": "boolean"
|
|
9508
|
+
},
|
|
9509
|
+
{
|
|
9510
|
+
"path": "flip",
|
|
9511
|
+
"valueType": "boolean"
|
|
9512
|
+
},
|
|
9513
|
+
{
|
|
9514
|
+
"path": "rotate",
|
|
9515
|
+
"valueType": "enum",
|
|
9516
|
+
"enumValues": [
|
|
9517
|
+
"0",
|
|
9518
|
+
"90",
|
|
9519
|
+
"180",
|
|
9520
|
+
"270"
|
|
9521
|
+
]
|
|
9522
|
+
},
|
|
9523
|
+
{
|
|
9524
|
+
"path": "whiteBalance",
|
|
9525
|
+
"valueType": "enum",
|
|
9526
|
+
"enumValues": ["auto", "manual"]
|
|
9527
|
+
},
|
|
9528
|
+
{
|
|
9529
|
+
"path": "warmth",
|
|
9530
|
+
"valueType": "number"
|
|
9531
|
+
},
|
|
9532
|
+
{
|
|
9533
|
+
"path": "exposureMode",
|
|
9534
|
+
"valueType": "enum",
|
|
9535
|
+
"enumValues": ["auto", "manual"]
|
|
9536
|
+
},
|
|
9537
|
+
{
|
|
9538
|
+
"path": "backlightMode",
|
|
9539
|
+
"valueType": "enum",
|
|
9540
|
+
"enumValues": [
|
|
9541
|
+
"off",
|
|
9542
|
+
"blc",
|
|
9543
|
+
"wdr",
|
|
9544
|
+
"hlc"
|
|
9545
|
+
]
|
|
9546
|
+
}
|
|
9547
|
+
],
|
|
9548
|
+
"intercom": [
|
|
9549
|
+
{
|
|
9550
|
+
"path": "talking",
|
|
9551
|
+
"valueType": "boolean"
|
|
9552
|
+
},
|
|
9553
|
+
{
|
|
9554
|
+
"path": "lastSessionAt",
|
|
9555
|
+
"valueType": "number"
|
|
9556
|
+
},
|
|
9557
|
+
{
|
|
9558
|
+
"path": "ability.sampleRate",
|
|
9559
|
+
"valueType": "number"
|
|
9560
|
+
},
|
|
9561
|
+
{
|
|
9562
|
+
"path": "ability.duplex",
|
|
9563
|
+
"valueType": "enum",
|
|
9564
|
+
"enumValues": ["half", "full"]
|
|
9565
|
+
},
|
|
9566
|
+
{
|
|
9567
|
+
"path": "ability.maxBacklogMs",
|
|
9568
|
+
"valueType": "number"
|
|
9569
|
+
}
|
|
9570
|
+
],
|
|
9571
|
+
"lawn-mower-control": [
|
|
9572
|
+
{
|
|
9573
|
+
"path": "activity",
|
|
9574
|
+
"valueType": "enum",
|
|
9575
|
+
"enumValues": [
|
|
9576
|
+
"idle",
|
|
9577
|
+
"mowing",
|
|
9578
|
+
"paused",
|
|
9579
|
+
"docked",
|
|
9580
|
+
"error"
|
|
9581
|
+
]
|
|
9582
|
+
},
|
|
9583
|
+
{
|
|
9584
|
+
"path": "batteryLevel",
|
|
9585
|
+
"valueType": "number"
|
|
9586
|
+
},
|
|
9587
|
+
{
|
|
9588
|
+
"path": "progressPercent",
|
|
9589
|
+
"valueType": "number"
|
|
9590
|
+
},
|
|
9591
|
+
{
|
|
9592
|
+
"path": "currentCode",
|
|
9593
|
+
"valueType": "number"
|
|
9594
|
+
},
|
|
9595
|
+
{
|
|
9596
|
+
"path": "currentCodeLabel",
|
|
9597
|
+
"valueType": "string"
|
|
9598
|
+
},
|
|
9599
|
+
{
|
|
9600
|
+
"path": "severity",
|
|
9601
|
+
"valueType": "enum",
|
|
9602
|
+
"enumValues": [
|
|
9603
|
+
"info",
|
|
9604
|
+
"warning",
|
|
9605
|
+
"error"
|
|
9606
|
+
]
|
|
9607
|
+
}
|
|
9608
|
+
],
|
|
9609
|
+
"lock-control": [{
|
|
9610
|
+
"path": "state",
|
|
9611
|
+
"valueType": "enum",
|
|
9612
|
+
"enumValues": [
|
|
9613
|
+
"locked",
|
|
9614
|
+
"unlocked",
|
|
9615
|
+
"locking",
|
|
9616
|
+
"unlocking",
|
|
9617
|
+
"jammed"
|
|
9618
|
+
]
|
|
9619
|
+
}],
|
|
9620
|
+
"media-player": [
|
|
9621
|
+
{
|
|
9622
|
+
"path": "state",
|
|
9623
|
+
"valueType": "enum",
|
|
9624
|
+
"enumValues": [
|
|
9625
|
+
"off",
|
|
9626
|
+
"on",
|
|
9627
|
+
"idle",
|
|
9628
|
+
"playing",
|
|
9629
|
+
"paused",
|
|
9630
|
+
"buffering",
|
|
9631
|
+
"standby"
|
|
9632
|
+
]
|
|
9633
|
+
},
|
|
9634
|
+
{
|
|
9635
|
+
"path": "volumeLevel",
|
|
9636
|
+
"valueType": "number"
|
|
9637
|
+
},
|
|
9638
|
+
{
|
|
9639
|
+
"path": "isMuted",
|
|
9640
|
+
"valueType": "boolean"
|
|
9641
|
+
},
|
|
9642
|
+
{
|
|
9643
|
+
"path": "source",
|
|
9644
|
+
"valueType": "string"
|
|
9645
|
+
},
|
|
9646
|
+
{
|
|
9647
|
+
"path": "currentMedia.type",
|
|
9648
|
+
"valueType": "string"
|
|
9649
|
+
},
|
|
9650
|
+
{
|
|
9651
|
+
"path": "currentMedia.title",
|
|
9652
|
+
"valueType": "string"
|
|
9653
|
+
},
|
|
9654
|
+
{
|
|
9655
|
+
"path": "currentMedia.artist",
|
|
9656
|
+
"valueType": "string"
|
|
9657
|
+
},
|
|
9658
|
+
{
|
|
9659
|
+
"path": "currentMedia.album",
|
|
9660
|
+
"valueType": "string"
|
|
9661
|
+
},
|
|
9662
|
+
{
|
|
9663
|
+
"path": "currentMedia.imageUrl",
|
|
9664
|
+
"valueType": "string"
|
|
9665
|
+
},
|
|
9666
|
+
{
|
|
9667
|
+
"path": "positionMs",
|
|
9668
|
+
"valueType": "number"
|
|
9669
|
+
},
|
|
9670
|
+
{
|
|
9671
|
+
"path": "durationMs",
|
|
9672
|
+
"valueType": "number"
|
|
9673
|
+
},
|
|
9674
|
+
{
|
|
9675
|
+
"path": "shuffle",
|
|
9676
|
+
"valueType": "boolean"
|
|
9677
|
+
},
|
|
9678
|
+
{
|
|
9679
|
+
"path": "repeat",
|
|
9680
|
+
"valueType": "enum",
|
|
9681
|
+
"enumValues": [
|
|
9682
|
+
"off",
|
|
9683
|
+
"all",
|
|
9684
|
+
"one"
|
|
9685
|
+
]
|
|
9686
|
+
}
|
|
9687
|
+
],
|
|
9688
|
+
"motion": [
|
|
9689
|
+
{
|
|
9690
|
+
"path": "detected",
|
|
9691
|
+
"valueType": "boolean"
|
|
9692
|
+
},
|
|
9693
|
+
{
|
|
9694
|
+
"path": "lastDetectedAt",
|
|
9695
|
+
"valueType": "number"
|
|
9696
|
+
},
|
|
9697
|
+
{
|
|
9698
|
+
"path": "autoClearAfterMs",
|
|
9699
|
+
"valueType": "number"
|
|
9700
|
+
}
|
|
9701
|
+
],
|
|
9702
|
+
"motion-trigger": [{
|
|
9703
|
+
"path": "enabled",
|
|
9704
|
+
"valueType": "boolean"
|
|
9705
|
+
}],
|
|
9706
|
+
"motion-zones": [{
|
|
9707
|
+
"path": "enabled",
|
|
9708
|
+
"valueType": "boolean"
|
|
9709
|
+
}, {
|
|
9710
|
+
"path": "sensitivity",
|
|
9711
|
+
"valueType": "number"
|
|
9712
|
+
}],
|
|
9713
|
+
"mqtt-broker": [{
|
|
9714
|
+
"path": "brokerCount",
|
|
9715
|
+
"valueType": "number"
|
|
9716
|
+
}, {
|
|
9717
|
+
"path": "embeddedRunning",
|
|
9718
|
+
"valueType": "boolean"
|
|
9719
|
+
}],
|
|
9720
|
+
"native-object-detection": [{
|
|
9721
|
+
"path": "enabled",
|
|
9722
|
+
"valueType": "boolean"
|
|
9723
|
+
}],
|
|
9724
|
+
"navigation": [
|
|
9725
|
+
{
|
|
9726
|
+
"path": "mode",
|
|
9727
|
+
"valueType": "enum",
|
|
9728
|
+
"enumValues": [
|
|
9729
|
+
"idle",
|
|
9730
|
+
"cleaning",
|
|
9731
|
+
"spot",
|
|
9732
|
+
"following",
|
|
9733
|
+
"goto",
|
|
9734
|
+
"returning",
|
|
9735
|
+
"paused",
|
|
9736
|
+
"unknown"
|
|
9737
|
+
]
|
|
9738
|
+
},
|
|
9739
|
+
{
|
|
9740
|
+
"path": "following",
|
|
9741
|
+
"valueType": "boolean"
|
|
9742
|
+
},
|
|
9743
|
+
{
|
|
9744
|
+
"path": "flash",
|
|
9745
|
+
"valueType": "boolean"
|
|
9746
|
+
},
|
|
9747
|
+
{
|
|
9748
|
+
"path": "lightMode",
|
|
9749
|
+
"valueType": "enum",
|
|
9750
|
+
"enumValues": ["auto", "manual"]
|
|
9751
|
+
},
|
|
9752
|
+
{
|
|
9753
|
+
"path": "lightLevel",
|
|
9754
|
+
"valueType": "number"
|
|
9755
|
+
}
|
|
9756
|
+
],
|
|
9757
|
+
"network-link": [
|
|
9758
|
+
{
|
|
9759
|
+
"path": "type",
|
|
9760
|
+
"valueType": "enum",
|
|
9761
|
+
"enumValues": [
|
|
9762
|
+
"wifi",
|
|
9763
|
+
"ethernet",
|
|
9764
|
+
"cellular",
|
|
9765
|
+
"unknown"
|
|
9766
|
+
]
|
|
9767
|
+
},
|
|
9768
|
+
{
|
|
9769
|
+
"path": "signalPercent",
|
|
9770
|
+
"valueType": "number"
|
|
9771
|
+
},
|
|
9772
|
+
{
|
|
9773
|
+
"path": "rssiDbm",
|
|
9774
|
+
"valueType": "number"
|
|
9775
|
+
},
|
|
9776
|
+
{
|
|
9777
|
+
"path": "ssid",
|
|
9778
|
+
"valueType": "string"
|
|
9779
|
+
},
|
|
9780
|
+
{
|
|
9781
|
+
"path": "lastUpdated",
|
|
9782
|
+
"valueType": "number"
|
|
9783
|
+
}
|
|
9784
|
+
],
|
|
9785
|
+
"notifier": [
|
|
9786
|
+
{
|
|
9787
|
+
"path": "lastSentAt",
|
|
9788
|
+
"valueType": "number"
|
|
9789
|
+
},
|
|
9790
|
+
{
|
|
9791
|
+
"path": "lastError",
|
|
9792
|
+
"valueType": "string"
|
|
9793
|
+
},
|
|
9794
|
+
{
|
|
9795
|
+
"path": "queueDepth",
|
|
9796
|
+
"valueType": "number"
|
|
9797
|
+
},
|
|
9798
|
+
{
|
|
9799
|
+
"path": "supports.image",
|
|
9800
|
+
"valueType": "boolean"
|
|
9801
|
+
},
|
|
9802
|
+
{
|
|
9803
|
+
"path": "supports.priority",
|
|
9804
|
+
"valueType": "boolean"
|
|
9805
|
+
},
|
|
9806
|
+
{
|
|
9807
|
+
"path": "supports.data",
|
|
9808
|
+
"valueType": "boolean"
|
|
9809
|
+
},
|
|
9810
|
+
{
|
|
9811
|
+
"path": "supports.actions",
|
|
9812
|
+
"valueType": "boolean"
|
|
9813
|
+
},
|
|
9814
|
+
{
|
|
9815
|
+
"path": "supports.recipients",
|
|
9816
|
+
"valueType": "boolean"
|
|
9817
|
+
}
|
|
9818
|
+
],
|
|
9819
|
+
"numeric-sensor": [
|
|
9820
|
+
{
|
|
9821
|
+
"path": "value",
|
|
9822
|
+
"valueType": "number"
|
|
9823
|
+
},
|
|
9824
|
+
{
|
|
9825
|
+
"path": "unit",
|
|
9826
|
+
"valueType": "string"
|
|
9827
|
+
},
|
|
9828
|
+
{
|
|
9829
|
+
"path": "precision",
|
|
9830
|
+
"valueType": "number"
|
|
9831
|
+
}
|
|
9832
|
+
],
|
|
9833
|
+
"pet-feeder": [
|
|
9834
|
+
{
|
|
9835
|
+
"path": "foodLevel",
|
|
9836
|
+
"valueType": "number"
|
|
9837
|
+
},
|
|
9838
|
+
{
|
|
9839
|
+
"path": "food1",
|
|
9840
|
+
"valueType": "number"
|
|
9841
|
+
},
|
|
9842
|
+
{
|
|
9843
|
+
"path": "food2",
|
|
9844
|
+
"valueType": "number"
|
|
9845
|
+
},
|
|
9846
|
+
{
|
|
9847
|
+
"path": "lowFood",
|
|
9848
|
+
"valueType": "boolean"
|
|
9849
|
+
},
|
|
9850
|
+
{
|
|
9851
|
+
"path": "batteryPower",
|
|
9852
|
+
"valueType": "number"
|
|
9853
|
+
},
|
|
9854
|
+
{
|
|
9855
|
+
"path": "desiccantLeftDays",
|
|
9856
|
+
"valueType": "number"
|
|
9857
|
+
},
|
|
9858
|
+
{
|
|
9859
|
+
"path": "feeding",
|
|
9860
|
+
"valueType": "boolean"
|
|
9861
|
+
},
|
|
9862
|
+
{
|
|
9863
|
+
"path": "status",
|
|
9864
|
+
"valueType": "enum",
|
|
9865
|
+
"enumValues": [
|
|
9866
|
+
"normal",
|
|
9867
|
+
"offline",
|
|
9868
|
+
"on_batteries"
|
|
9869
|
+
]
|
|
9870
|
+
},
|
|
9871
|
+
{
|
|
9872
|
+
"path": "error",
|
|
9873
|
+
"valueType": "string"
|
|
9874
|
+
},
|
|
9875
|
+
{
|
|
9876
|
+
"path": "errorCode",
|
|
9877
|
+
"valueType": "number"
|
|
9878
|
+
},
|
|
9879
|
+
{
|
|
9880
|
+
"path": "isDualHopper",
|
|
9881
|
+
"valueType": "boolean"
|
|
9882
|
+
},
|
|
9883
|
+
{
|
|
9884
|
+
"path": "childLock",
|
|
9885
|
+
"valueType": "boolean"
|
|
9886
|
+
},
|
|
9887
|
+
{
|
|
9888
|
+
"path": "indicatorLight",
|
|
9889
|
+
"valueType": "boolean"
|
|
9890
|
+
},
|
|
9891
|
+
{
|
|
9892
|
+
"path": "feedSound",
|
|
9893
|
+
"valueType": "boolean"
|
|
9894
|
+
},
|
|
9895
|
+
{
|
|
9896
|
+
"path": "volume",
|
|
9897
|
+
"valueType": "number"
|
|
9898
|
+
}
|
|
9899
|
+
],
|
|
9900
|
+
"power-meter": [
|
|
9901
|
+
{
|
|
9902
|
+
"path": "watts",
|
|
9903
|
+
"valueType": "number"
|
|
9904
|
+
},
|
|
9905
|
+
{
|
|
9906
|
+
"path": "kwhTotal",
|
|
9907
|
+
"valueType": "number"
|
|
9908
|
+
},
|
|
9909
|
+
{
|
|
9910
|
+
"path": "volts",
|
|
9911
|
+
"valueType": "number"
|
|
9912
|
+
},
|
|
9913
|
+
{
|
|
9914
|
+
"path": "amps",
|
|
9915
|
+
"valueType": "number"
|
|
9916
|
+
},
|
|
9917
|
+
{
|
|
9918
|
+
"path": "va",
|
|
9919
|
+
"valueType": "number"
|
|
9920
|
+
},
|
|
9921
|
+
{
|
|
9922
|
+
"path": "powerFactor",
|
|
9923
|
+
"valueType": "number"
|
|
9924
|
+
},
|
|
9925
|
+
{
|
|
9926
|
+
"path": "unit",
|
|
9927
|
+
"valueType": "string"
|
|
9928
|
+
},
|
|
9929
|
+
{
|
|
9930
|
+
"path": "precision",
|
|
9931
|
+
"valueType": "number"
|
|
9932
|
+
}
|
|
9933
|
+
],
|
|
9934
|
+
"presence": [
|
|
9935
|
+
{
|
|
9936
|
+
"path": "state",
|
|
9937
|
+
"valueType": "string"
|
|
9938
|
+
},
|
|
9939
|
+
{
|
|
9940
|
+
"path": "location",
|
|
9941
|
+
"valueType": "string"
|
|
9942
|
+
},
|
|
9943
|
+
{
|
|
9944
|
+
"path": "gps.latitude",
|
|
9945
|
+
"valueType": "number"
|
|
9946
|
+
},
|
|
9947
|
+
{
|
|
9948
|
+
"path": "gps.longitude",
|
|
9949
|
+
"valueType": "number"
|
|
9950
|
+
},
|
|
9951
|
+
{
|
|
9952
|
+
"path": "gps.accuracyMeters",
|
|
9953
|
+
"valueType": "number"
|
|
9954
|
+
},
|
|
9955
|
+
{
|
|
9956
|
+
"path": "batteryPercent",
|
|
9957
|
+
"valueType": "number"
|
|
9958
|
+
}
|
|
9959
|
+
],
|
|
9960
|
+
"pressure-sensor": [
|
|
9961
|
+
{
|
|
9962
|
+
"path": "hpa",
|
|
9963
|
+
"valueType": "number"
|
|
9964
|
+
},
|
|
9965
|
+
{
|
|
9966
|
+
"path": "unit",
|
|
9967
|
+
"valueType": "string"
|
|
9968
|
+
},
|
|
9969
|
+
{
|
|
9970
|
+
"path": "precision",
|
|
9971
|
+
"valueType": "number"
|
|
9972
|
+
}
|
|
9973
|
+
],
|
|
9974
|
+
"privacy-mask": [{
|
|
9975
|
+
"path": "enabled",
|
|
9976
|
+
"valueType": "boolean"
|
|
9977
|
+
}, {
|
|
9978
|
+
"path": "audioEnabled",
|
|
9979
|
+
"valueType": "boolean"
|
|
9980
|
+
}],
|
|
9981
|
+
"ptz": [
|
|
9982
|
+
{
|
|
9983
|
+
"path": "pan",
|
|
9984
|
+
"valueType": "number"
|
|
9985
|
+
},
|
|
9986
|
+
{
|
|
9987
|
+
"path": "tilt",
|
|
9988
|
+
"valueType": "number"
|
|
9989
|
+
},
|
|
9990
|
+
{
|
|
9991
|
+
"path": "zoom",
|
|
9992
|
+
"valueType": "number"
|
|
9993
|
+
},
|
|
9994
|
+
{
|
|
9995
|
+
"path": "autofocus",
|
|
9996
|
+
"valueType": "boolean"
|
|
9997
|
+
}
|
|
9998
|
+
],
|
|
9999
|
+
"ptz-autotrack": [
|
|
10000
|
+
{
|
|
10001
|
+
"path": "enabled",
|
|
10002
|
+
"valueType": "boolean"
|
|
10003
|
+
},
|
|
10004
|
+
{
|
|
10005
|
+
"path": "currentSettings.targetType",
|
|
10006
|
+
"valueType": "string"
|
|
10007
|
+
},
|
|
10008
|
+
{
|
|
10009
|
+
"path": "currentSettings.stopDelaySeconds",
|
|
10010
|
+
"valueType": "number"
|
|
10011
|
+
},
|
|
10012
|
+
{
|
|
10013
|
+
"path": "currentSettings.disappearDelaySeconds",
|
|
10014
|
+
"valueType": "number"
|
|
10015
|
+
}
|
|
10016
|
+
],
|
|
10017
|
+
"recording-archive": [
|
|
10018
|
+
{
|
|
10019
|
+
"path": "deviceId",
|
|
10020
|
+
"valueType": "number"
|
|
10021
|
+
},
|
|
10022
|
+
{
|
|
10023
|
+
"path": "enabled",
|
|
10024
|
+
"valueType": "boolean"
|
|
10025
|
+
},
|
|
10026
|
+
{
|
|
10027
|
+
"path": "activeMode",
|
|
10028
|
+
"valueType": "enum",
|
|
10029
|
+
"enumValues": [
|
|
10030
|
+
"off",
|
|
10031
|
+
"events",
|
|
10032
|
+
"continuous",
|
|
10033
|
+
"on-device-decision"
|
|
10034
|
+
]
|
|
10035
|
+
},
|
|
10036
|
+
{
|
|
10037
|
+
"path": "nodeId",
|
|
10038
|
+
"valueType": "string"
|
|
10039
|
+
},
|
|
10040
|
+
{
|
|
10041
|
+
"path": "storageBytes",
|
|
10042
|
+
"valueType": "number"
|
|
10043
|
+
}
|
|
10044
|
+
],
|
|
10045
|
+
"recording-onboard": [
|
|
10046
|
+
{
|
|
10047
|
+
"path": "primaryTrackId",
|
|
10048
|
+
"valueType": "string"
|
|
10049
|
+
},
|
|
10050
|
+
{
|
|
10051
|
+
"path": "enabled",
|
|
10052
|
+
"valueType": "boolean"
|
|
10053
|
+
},
|
|
10054
|
+
{
|
|
10055
|
+
"path": "overwriteWhenFull",
|
|
10056
|
+
"valueType": "boolean"
|
|
10057
|
+
},
|
|
10058
|
+
{
|
|
10059
|
+
"path": "preRecordSec",
|
|
10060
|
+
"valueType": "number"
|
|
10061
|
+
},
|
|
10062
|
+
{
|
|
10063
|
+
"path": "postRecordSec",
|
|
10064
|
+
"valueType": "number"
|
|
10065
|
+
},
|
|
10066
|
+
{
|
|
10067
|
+
"path": "segmentMinutes",
|
|
10068
|
+
"valueType": "number"
|
|
10069
|
+
},
|
|
10070
|
+
{
|
|
10071
|
+
"path": "unreadableWindows",
|
|
10072
|
+
"valueType": "number"
|
|
10073
|
+
},
|
|
10074
|
+
{
|
|
10075
|
+
"path": "recordingToNowhere",
|
|
10076
|
+
"valueType": "boolean"
|
|
10077
|
+
}
|
|
10078
|
+
],
|
|
10079
|
+
"recording-signal": [{
|
|
10080
|
+
"path": "active",
|
|
10081
|
+
"valueType": "boolean"
|
|
10082
|
+
}, {
|
|
10083
|
+
"path": "reason",
|
|
10084
|
+
"valueType": "string"
|
|
10085
|
+
}],
|
|
10086
|
+
"running-state": [
|
|
10087
|
+
{
|
|
10088
|
+
"path": "running",
|
|
10089
|
+
"valueType": "boolean"
|
|
10090
|
+
},
|
|
10091
|
+
{
|
|
10092
|
+
"path": "since",
|
|
10093
|
+
"valueType": "number"
|
|
10094
|
+
},
|
|
10095
|
+
{
|
|
10096
|
+
"path": "source",
|
|
10097
|
+
"valueType": "enum",
|
|
10098
|
+
"enumValues": ["native", "assigned"]
|
|
10099
|
+
},
|
|
10100
|
+
{
|
|
10101
|
+
"path": "phase",
|
|
10102
|
+
"valueType": "string"
|
|
10103
|
+
}
|
|
10104
|
+
],
|
|
10105
|
+
"script-runner": [
|
|
10106
|
+
{
|
|
10107
|
+
"path": "isRunning",
|
|
10108
|
+
"valueType": "boolean"
|
|
10109
|
+
},
|
|
10110
|
+
{
|
|
10111
|
+
"path": "lastRunAt",
|
|
10112
|
+
"valueType": "number"
|
|
10113
|
+
},
|
|
10114
|
+
{
|
|
10115
|
+
"path": "lastRunSuccess",
|
|
10116
|
+
"valueType": "boolean"
|
|
10117
|
+
},
|
|
10118
|
+
{
|
|
10119
|
+
"path": "lastError",
|
|
10120
|
+
"valueType": "string"
|
|
10121
|
+
}
|
|
10122
|
+
],
|
|
10123
|
+
"smoke": [{
|
|
10124
|
+
"path": "detected",
|
|
10125
|
+
"valueType": "boolean"
|
|
10126
|
+
}],
|
|
10127
|
+
"snapshot": [
|
|
10128
|
+
{
|
|
10129
|
+
"path": "lastCapturedAt",
|
|
10130
|
+
"valueType": "number"
|
|
10131
|
+
},
|
|
10132
|
+
{
|
|
10133
|
+
"path": "cacheAgeMs",
|
|
10134
|
+
"valueType": "number"
|
|
10135
|
+
},
|
|
10136
|
+
{
|
|
10137
|
+
"path": "lastBytes",
|
|
10138
|
+
"valueType": "number"
|
|
10139
|
+
},
|
|
10140
|
+
{
|
|
10141
|
+
"path": "lastStreamId",
|
|
10142
|
+
"valueType": "string"
|
|
10143
|
+
}
|
|
10144
|
+
],
|
|
10145
|
+
"stream-params": [
|
|
10146
|
+
{
|
|
10147
|
+
"path": "main.width",
|
|
10148
|
+
"valueType": "number"
|
|
10149
|
+
},
|
|
10150
|
+
{
|
|
10151
|
+
"path": "main.height",
|
|
10152
|
+
"valueType": "number"
|
|
10153
|
+
},
|
|
10154
|
+
{
|
|
10155
|
+
"path": "main.codec",
|
|
10156
|
+
"valueType": "enum",
|
|
10157
|
+
"enumValues": ["h264", "h265"]
|
|
10158
|
+
},
|
|
10159
|
+
{
|
|
10160
|
+
"path": "main.framerate",
|
|
10161
|
+
"valueType": "number"
|
|
10162
|
+
},
|
|
10163
|
+
{
|
|
10164
|
+
"path": "main.bitrate",
|
|
10165
|
+
"valueType": "number"
|
|
10166
|
+
},
|
|
10167
|
+
{
|
|
10168
|
+
"path": "main.bitrateMode",
|
|
10169
|
+
"valueType": "enum",
|
|
10170
|
+
"enumValues": ["vbr", "cbr"]
|
|
10171
|
+
},
|
|
10172
|
+
{
|
|
10173
|
+
"path": "main.encoderProfile",
|
|
10174
|
+
"valueType": "enum",
|
|
10175
|
+
"enumValues": [
|
|
10176
|
+
"high",
|
|
10177
|
+
"main",
|
|
10178
|
+
"baseline"
|
|
10179
|
+
]
|
|
10180
|
+
},
|
|
10181
|
+
{
|
|
10182
|
+
"path": "main.gop",
|
|
10183
|
+
"valueType": "number"
|
|
10184
|
+
},
|
|
10185
|
+
{
|
|
10186
|
+
"path": "main.audio",
|
|
10187
|
+
"valueType": "boolean"
|
|
10188
|
+
},
|
|
10189
|
+
{
|
|
10190
|
+
"path": "sub.width",
|
|
10191
|
+
"valueType": "number"
|
|
10192
|
+
},
|
|
10193
|
+
{
|
|
10194
|
+
"path": "sub.height",
|
|
10195
|
+
"valueType": "number"
|
|
10196
|
+
},
|
|
10197
|
+
{
|
|
10198
|
+
"path": "sub.codec",
|
|
10199
|
+
"valueType": "enum",
|
|
10200
|
+
"enumValues": ["h264", "h265"]
|
|
10201
|
+
},
|
|
10202
|
+
{
|
|
10203
|
+
"path": "sub.framerate",
|
|
10204
|
+
"valueType": "number"
|
|
10205
|
+
},
|
|
10206
|
+
{
|
|
10207
|
+
"path": "sub.bitrate",
|
|
10208
|
+
"valueType": "number"
|
|
10209
|
+
},
|
|
10210
|
+
{
|
|
10211
|
+
"path": "sub.bitrateMode",
|
|
10212
|
+
"valueType": "enum",
|
|
10213
|
+
"enumValues": ["vbr", "cbr"]
|
|
10214
|
+
},
|
|
10215
|
+
{
|
|
10216
|
+
"path": "sub.encoderProfile",
|
|
10217
|
+
"valueType": "enum",
|
|
10218
|
+
"enumValues": [
|
|
10219
|
+
"high",
|
|
10220
|
+
"main",
|
|
10221
|
+
"baseline"
|
|
10222
|
+
]
|
|
10223
|
+
},
|
|
10224
|
+
{
|
|
10225
|
+
"path": "sub.gop",
|
|
10226
|
+
"valueType": "number"
|
|
10227
|
+
},
|
|
10228
|
+
{
|
|
10229
|
+
"path": "sub.audio",
|
|
10230
|
+
"valueType": "boolean"
|
|
10231
|
+
},
|
|
10232
|
+
{
|
|
10233
|
+
"path": "ext.width",
|
|
10234
|
+
"valueType": "number"
|
|
10235
|
+
},
|
|
10236
|
+
{
|
|
10237
|
+
"path": "ext.height",
|
|
10238
|
+
"valueType": "number"
|
|
10239
|
+
},
|
|
10240
|
+
{
|
|
10241
|
+
"path": "ext.codec",
|
|
10242
|
+
"valueType": "enum",
|
|
10243
|
+
"enumValues": ["h264", "h265"]
|
|
10244
|
+
},
|
|
10245
|
+
{
|
|
10246
|
+
"path": "ext.framerate",
|
|
10247
|
+
"valueType": "number"
|
|
10248
|
+
},
|
|
10249
|
+
{
|
|
10250
|
+
"path": "ext.bitrate",
|
|
10251
|
+
"valueType": "number"
|
|
10252
|
+
},
|
|
10253
|
+
{
|
|
10254
|
+
"path": "ext.bitrateMode",
|
|
10255
|
+
"valueType": "enum",
|
|
10256
|
+
"enumValues": ["vbr", "cbr"]
|
|
10257
|
+
},
|
|
10258
|
+
{
|
|
10259
|
+
"path": "ext.encoderProfile",
|
|
10260
|
+
"valueType": "enum",
|
|
10261
|
+
"enumValues": [
|
|
10262
|
+
"high",
|
|
10263
|
+
"main",
|
|
10264
|
+
"baseline"
|
|
10265
|
+
]
|
|
10266
|
+
},
|
|
10267
|
+
{
|
|
10268
|
+
"path": "ext.gop",
|
|
10269
|
+
"valueType": "number"
|
|
10270
|
+
},
|
|
10271
|
+
{
|
|
10272
|
+
"path": "ext.audio",
|
|
10273
|
+
"valueType": "boolean"
|
|
10274
|
+
}
|
|
10275
|
+
],
|
|
10276
|
+
"switch": [{
|
|
10277
|
+
"path": "on",
|
|
10278
|
+
"valueType": "boolean"
|
|
10279
|
+
}],
|
|
10280
|
+
"tamper": [{
|
|
10281
|
+
"path": "tampered",
|
|
10282
|
+
"valueType": "boolean"
|
|
10283
|
+
}],
|
|
10284
|
+
"temperature-sensor": [
|
|
10285
|
+
{
|
|
10286
|
+
"path": "celsius",
|
|
10287
|
+
"valueType": "number"
|
|
10288
|
+
},
|
|
10289
|
+
{
|
|
10290
|
+
"path": "unit",
|
|
10291
|
+
"valueType": "string"
|
|
10292
|
+
},
|
|
10293
|
+
{
|
|
10294
|
+
"path": "precision",
|
|
10295
|
+
"valueType": "number"
|
|
10296
|
+
}
|
|
10297
|
+
],
|
|
10298
|
+
"update": [
|
|
10299
|
+
{
|
|
10300
|
+
"path": "currentVersion",
|
|
10301
|
+
"valueType": "string"
|
|
10302
|
+
},
|
|
10303
|
+
{
|
|
10304
|
+
"path": "availableVersion",
|
|
10305
|
+
"valueType": "string"
|
|
10306
|
+
},
|
|
10307
|
+
{
|
|
10308
|
+
"path": "updatable",
|
|
10309
|
+
"valueType": "boolean"
|
|
10310
|
+
},
|
|
10311
|
+
{
|
|
10312
|
+
"path": "state",
|
|
10313
|
+
"valueType": "string"
|
|
10314
|
+
},
|
|
10315
|
+
{
|
|
10316
|
+
"path": "inProgress",
|
|
10317
|
+
"valueType": "boolean"
|
|
10318
|
+
}
|
|
10319
|
+
],
|
|
10320
|
+
"vacuum-control": [
|
|
10321
|
+
{
|
|
10322
|
+
"path": "state",
|
|
10323
|
+
"valueType": "enum",
|
|
10324
|
+
"enumValues": [
|
|
10325
|
+
"idle",
|
|
10326
|
+
"cleaning",
|
|
10327
|
+
"paused",
|
|
10328
|
+
"returning",
|
|
10329
|
+
"docked",
|
|
10330
|
+
"drying",
|
|
10331
|
+
"error"
|
|
10332
|
+
]
|
|
10333
|
+
},
|
|
10334
|
+
{
|
|
10335
|
+
"path": "batteryLevel",
|
|
10336
|
+
"valueType": "number"
|
|
10337
|
+
},
|
|
10338
|
+
{
|
|
10339
|
+
"path": "fanSpeed",
|
|
10340
|
+
"valueType": "string"
|
|
10341
|
+
},
|
|
10342
|
+
{
|
|
10343
|
+
"path": "progressPercent",
|
|
10344
|
+
"valueType": "number"
|
|
10345
|
+
},
|
|
10346
|
+
{
|
|
10347
|
+
"path": "errorCode",
|
|
10348
|
+
"valueType": "number"
|
|
10349
|
+
},
|
|
10350
|
+
{
|
|
10351
|
+
"path": "errorLabel",
|
|
10352
|
+
"valueType": "string"
|
|
10353
|
+
}
|
|
10354
|
+
],
|
|
10355
|
+
"valve": [{
|
|
10356
|
+
"path": "state",
|
|
10357
|
+
"valueType": "enum",
|
|
10358
|
+
"enumValues": [
|
|
10359
|
+
"open",
|
|
10360
|
+
"opening",
|
|
10361
|
+
"closing",
|
|
10362
|
+
"closed",
|
|
10363
|
+
"stopped"
|
|
10364
|
+
]
|
|
10365
|
+
}, {
|
|
10366
|
+
"path": "position",
|
|
10367
|
+
"valueType": "number"
|
|
10368
|
+
}],
|
|
10369
|
+
"vibration": [{
|
|
10370
|
+
"path": "detected",
|
|
10371
|
+
"valueType": "boolean"
|
|
10372
|
+
}],
|
|
10373
|
+
"water-heater": [
|
|
10374
|
+
{
|
|
10375
|
+
"path": "currentTemp",
|
|
10376
|
+
"valueType": "number"
|
|
10377
|
+
},
|
|
10378
|
+
{
|
|
10379
|
+
"path": "targetTemp",
|
|
10380
|
+
"valueType": "number"
|
|
10381
|
+
},
|
|
10382
|
+
{
|
|
10383
|
+
"path": "operationMode",
|
|
10384
|
+
"valueType": "string"
|
|
10385
|
+
},
|
|
10386
|
+
{
|
|
10387
|
+
"path": "away",
|
|
10388
|
+
"valueType": "boolean"
|
|
10389
|
+
},
|
|
10390
|
+
{
|
|
10391
|
+
"path": "minTemp",
|
|
10392
|
+
"valueType": "number"
|
|
10393
|
+
},
|
|
10394
|
+
{
|
|
10395
|
+
"path": "maxTemp",
|
|
10396
|
+
"valueType": "number"
|
|
10397
|
+
}
|
|
10398
|
+
],
|
|
10399
|
+
"weather": [
|
|
10400
|
+
{
|
|
10401
|
+
"path": "condition",
|
|
10402
|
+
"valueType": "string"
|
|
10403
|
+
},
|
|
10404
|
+
{
|
|
10405
|
+
"path": "temperature",
|
|
10406
|
+
"valueType": "number"
|
|
10407
|
+
},
|
|
10408
|
+
{
|
|
10409
|
+
"path": "temperatureUnit",
|
|
10410
|
+
"valueType": "string"
|
|
10411
|
+
},
|
|
10412
|
+
{
|
|
10413
|
+
"path": "humidity",
|
|
10414
|
+
"valueType": "number"
|
|
10415
|
+
},
|
|
10416
|
+
{
|
|
10417
|
+
"path": "pressure",
|
|
10418
|
+
"valueType": "number"
|
|
10419
|
+
},
|
|
10420
|
+
{
|
|
10421
|
+
"path": "pressureUnit",
|
|
10422
|
+
"valueType": "string"
|
|
10423
|
+
},
|
|
10424
|
+
{
|
|
10425
|
+
"path": "windSpeed",
|
|
10426
|
+
"valueType": "number"
|
|
10427
|
+
},
|
|
10428
|
+
{
|
|
10429
|
+
"path": "windSpeedUnit",
|
|
10430
|
+
"valueType": "string"
|
|
10431
|
+
},
|
|
10432
|
+
{
|
|
10433
|
+
"path": "windBearing",
|
|
10434
|
+
"valueType": "number"
|
|
10435
|
+
}
|
|
10436
|
+
],
|
|
10437
|
+
"zone-analytics": [
|
|
10438
|
+
{
|
|
10439
|
+
"path": "ts",
|
|
10440
|
+
"valueType": "number"
|
|
10441
|
+
},
|
|
10442
|
+
{
|
|
10443
|
+
"path": "frameWidth",
|
|
10444
|
+
"valueType": "number"
|
|
10445
|
+
},
|
|
10446
|
+
{
|
|
10447
|
+
"path": "frameHeight",
|
|
10448
|
+
"valueType": "number"
|
|
10449
|
+
},
|
|
10450
|
+
{
|
|
10451
|
+
"path": "frame.totalObjects",
|
|
10452
|
+
"valueType": "number"
|
|
10453
|
+
},
|
|
10454
|
+
{
|
|
10455
|
+
"path": "frame.standingObjects",
|
|
10456
|
+
"valueType": "number"
|
|
10457
|
+
},
|
|
10458
|
+
{
|
|
10459
|
+
"path": "frame.transientObjects",
|
|
10460
|
+
"valueType": "number"
|
|
10461
|
+
},
|
|
10462
|
+
{
|
|
10463
|
+
"path": "unzoned.totalObjects",
|
|
10464
|
+
"valueType": "number"
|
|
10465
|
+
},
|
|
10466
|
+
{
|
|
10467
|
+
"path": "unzoned.standingObjects",
|
|
10468
|
+
"valueType": "number"
|
|
10469
|
+
},
|
|
10470
|
+
{
|
|
10471
|
+
"path": "unzoned.transientObjects",
|
|
10472
|
+
"valueType": "number"
|
|
10473
|
+
}
|
|
10474
|
+
]
|
|
10475
|
+
});
|
|
8502
10476
|
object({
|
|
8503
10477
|
code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
|
|
8504
10478
|
params: record(string(), union([string(), number()])).optional()
|
|
@@ -8871,7 +10845,7 @@ function errMsg(err) {
|
|
|
8871
10845
|
return String(err);
|
|
8872
10846
|
}
|
|
8873
10847
|
//#endregion
|
|
8874
|
-
//#region ../types/dist/composition-
|
|
10848
|
+
//#region ../types/dist/composition-kEl9mevu.mjs
|
|
8875
10849
|
/**
|
|
8876
10850
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
8877
10851
|
*
|
|
@@ -8931,7 +10905,7 @@ portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac
|
|
|
8931
10905
|
* ONE table for everyone who asks "is this device HIGH?": the
|
|
8932
10906
|
* recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
|
|
8933
10907
|
* sensor markers, the orchestrator's camera-sensors bridge and
|
|
8934
|
-
* the sources of a
|
|
10908
|
+
* the sources of a pulse (`compilePulseOverride`, D936).
|
|
8935
10909
|
* A second copy would diverge at the first cap added, and the symptom — "the
|
|
8936
10910
|
* sensor rings the doorbell but does not record" — is exactly D62.
|
|
8937
10911
|
*
|
|
@@ -12086,7 +14060,7 @@ var LogChannelDescriptorSchema = object({
|
|
|
12086
14060
|
* `true` is a PROMISE with two halves, and both must hold: the gate is
|
|
12087
14061
|
* consulted with the numeric device id, AND every line the channel admits
|
|
12088
14062
|
* carries `tags: { deviceId }` with that same numeric id. The second half is
|
|
12089
|
-
* what makes `| json | deviceId="
|
|
14063
|
+
* what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
|
|
12090
14064
|
* keeps `deviceId` out of the stream labels for cardinality, so the tag in
|
|
12091
14065
|
* the body is the only way to filter.
|
|
12092
14066
|
*
|
|
@@ -12274,7 +14248,7 @@ var ModelVariantGroupSchema = object({
|
|
|
12274
14248
|
precision: _enum(["fp32", "int8"]).optional(),
|
|
12275
14249
|
/**
|
|
12276
14250
|
* Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
|
|
12277
|
-
* an alternate training of the same family (
|
|
14251
|
+
* an alternate training of the same family (plugin catalog `relu_test`); chip
|
|
12278
14252
|
* label is "Test".
|
|
12279
14253
|
*/
|
|
12280
14254
|
optimization: _enum(["standard", "test"]).optional(),
|
|
@@ -12526,8 +14500,8 @@ var ModelCatalogEntrySchema = object({
|
|
|
12526
14500
|
provider: ModelProviderIdSchema.optional(),
|
|
12527
14501
|
/**
|
|
12528
14502
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
12529
|
-
* applies (
|
|
12530
|
-
* labels already ARE the CamStack macros (
|
|
14503
|
+
* applies (plus catalog / COCO public catalog). Set on a custom model whose raw
|
|
14504
|
+
* labels already ARE the CamStack macros (plugin catalog identity map).
|
|
12531
14505
|
*/
|
|
12532
14506
|
classMap: DetectionCatalogClassMapSchema.optional(),
|
|
12533
14507
|
/**
|
|
@@ -15496,7 +17470,7 @@ method(object({
|
|
|
15496
17470
|
* `1` is real time and is the ONLY value that allows the copy branch —
|
|
15497
17471
|
* anything else forces `libx264` over the window. That was priced
|
|
15498
17472
|
* before it was chosen: a per-event burst measured at 0.23 s and 254 KB
|
|
15499
|
-
* on a real
|
|
17473
|
+
* on a real 101 720p cut, against 922 KB for the copy it replaces. A
|
|
15500
17474
|
* re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
|
|
15501
17475
|
* once the decode is forced the width stops being free.
|
|
15502
17476
|
*/
|
|
@@ -16022,6 +17996,7 @@ var CompositionRunStatusSchema = _enum([
|
|
|
16022
17996
|
"starting",
|
|
16023
17997
|
"running",
|
|
16024
17998
|
"degraded",
|
|
17999
|
+
"incomplete",
|
|
16025
18000
|
"failed"
|
|
16026
18001
|
]);
|
|
16027
18002
|
var CompositionFieldStateKindSchema = _enum([
|
|
@@ -16071,6 +18046,13 @@ var ComposerUnreadableBlockSchema = object({
|
|
|
16071
18046
|
/** The parse error, in the operator's words. */
|
|
16072
18047
|
error: string()
|
|
16073
18048
|
});
|
|
18049
|
+
/** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
|
|
18050
|
+
var UnreleasedClaimSchema = object({
|
|
18051
|
+
deviceId: number().int(),
|
|
18052
|
+
capName: string(),
|
|
18053
|
+
owner: string(),
|
|
18054
|
+
error: string()
|
|
18055
|
+
});
|
|
16074
18056
|
method(object({
|
|
16075
18057
|
/** The shared Blocks integration; null until `core-blocks` has reconciled it. */
|
|
16076
18058
|
integrationId: string().nullable(),
|
|
@@ -16080,7 +18062,13 @@ method(object({
|
|
|
16080
18062
|
/** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
|
|
16081
18063
|
restartBlockIds: array(string()),
|
|
16082
18064
|
/** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
|
|
16083
|
-
unreadableBlocks: array(ComposerUnreadableBlockSchema)
|
|
18065
|
+
unreadableBlocks: array(ComposerUnreadableBlockSchema),
|
|
18066
|
+
/**
|
|
18067
|
+
* Operator-confirmed deletions. Their claims are released on this apply,
|
|
18068
|
+
* before any replacement block claims. A block that merely vanished from the
|
|
18069
|
+
* snapshot is not listed here and still waits for two applies (D49).
|
|
18070
|
+
*/
|
|
18071
|
+
retiredBlockIds: array(string()).optional()
|
|
16084
18072
|
}), object({
|
|
16085
18073
|
blocks: array(object({
|
|
16086
18074
|
blockId: string(),
|
|
@@ -16092,7 +18080,13 @@ method(object({
|
|
|
16092
18080
|
* integration unknown, its own rows unread or read empty once). An empty
|
|
16093
18081
|
* apply the caller owes is paid off only by one the composer acted on (D49).
|
|
16094
18082
|
*/
|
|
16095
|
-
acted: boolean()
|
|
18083
|
+
acted: boolean(),
|
|
18084
|
+
/**
|
|
18085
|
+
* Confirmed releases this apply tried and the hub did not accept. Empty when
|
|
18086
|
+
* every one landed (or there was nothing to hand back). Absent on a result
|
|
18087
|
+
* that never got that far.
|
|
18088
|
+
*/
|
|
18089
|
+
unreleasedClaims: array(UnreleasedClaimSchema).optional()
|
|
16096
18090
|
}), {
|
|
16097
18091
|
kind: "mutation",
|
|
16098
18092
|
auth: "admin"
|
|
@@ -16216,6 +18210,7 @@ var CoreBlockStatusSchema = _enum([
|
|
|
16216
18210
|
"starting",
|
|
16217
18211
|
"running",
|
|
16218
18212
|
"degraded",
|
|
18213
|
+
"incomplete",
|
|
16219
18214
|
"failed"
|
|
16220
18215
|
]);
|
|
16221
18216
|
/** path → TypeScript source for a multi-file block. */
|
|
@@ -38267,7 +40262,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
|
|
|
38267
40262
|
* `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
|
|
38268
40263
|
* operator's casing. The registry matches labels trimmed + case-insensitively
|
|
38269
40264
|
* everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
|
|
38270
|
-
* case-only rename (`
|
|
40265
|
+
* case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
|
|
38271
40266
|
* map keyed on the displayed casing would orphan its entry on exactly that
|
|
38272
40267
|
* edit. Consumers join by keying their own label through `locationIconKey`.
|
|
38273
40268
|
*/
|
|
@@ -38292,7 +40287,7 @@ var LocationDescriptionAssignmentSchema = object({
|
|
|
38292
40287
|
/**
|
|
38293
40288
|
* A SITE ZONE — a named part of the property that several locations belong to.
|
|
38294
40289
|
*
|
|
38295
|
-
* "
|
|
40290
|
+
* "Night zone" holds every bedroom; "Zona giorno" the living room and the
|
|
38296
40291
|
* kitchen. A camera belongs to exactly one location, and a location to at most
|
|
38297
40292
|
* one zone, so a camera's zone is derived and never stored on the device: the
|
|
38298
40293
|
* whole point of this entity is that grouping rooms touches no device row.
|
|
@@ -38321,7 +40316,7 @@ var LocationDescriptionAssignmentSchema = object({
|
|
|
38321
40316
|
* the locations inside it.
|
|
38322
40317
|
*
|
|
38323
40318
|
* The LABEL is carried alongside the key because the key is lossy on purpose —
|
|
38324
|
-
* a surface must show "
|
|
40319
|
+
* a surface must show "Night zone", not "night zone". Locations are carried
|
|
38325
40320
|
* here, rather than left to a second call, because every consumer wants both
|
|
38326
40321
|
* at once and a viewer that asked twice could render a zone whose membership
|
|
38327
40322
|
* it has not fetched yet.
|
|
@@ -40527,8 +42522,8 @@ var LoadContributionSchema = object({
|
|
|
40527
42522
|
"unattributable"
|
|
40528
42523
|
]),
|
|
40529
42524
|
/**
|
|
40530
|
-
* What ONE entry is, in the contributor's own words — `
|
|
40531
|
-
* `
|
|
42525
|
+
* What ONE entry is, in the contributor's own words — `101/high`,
|
|
42526
|
+
* `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
|
|
40532
42527
|
* family and inventing a common one would lose the only information that
|
|
40533
42528
|
* makes two entries for the same camera distinguishable.
|
|
40534
42529
|
*/
|
|
@@ -42176,6 +44171,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
|
|
|
42176
44171
|
for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
|
|
42177
44172
|
for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
|
|
42178
44173
|
/**
|
|
44174
|
+
* Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
|
|
44175
|
+
* not entries. `heatmapScrub` is a mark, not an event kind.
|
|
44176
|
+
*/
|
|
44177
|
+
var PALETTE_ENTRY_IDS = [
|
|
44178
|
+
"motion",
|
|
44179
|
+
"audio",
|
|
44180
|
+
"recording",
|
|
44181
|
+
"live",
|
|
44182
|
+
"heatmapScrub",
|
|
44183
|
+
"person",
|
|
44184
|
+
"vehicle",
|
|
44185
|
+
"animal",
|
|
44186
|
+
"package",
|
|
44187
|
+
"sensor",
|
|
44188
|
+
"control",
|
|
44189
|
+
"face",
|
|
44190
|
+
"plate",
|
|
44191
|
+
"car",
|
|
44192
|
+
"truck",
|
|
44193
|
+
"bus",
|
|
44194
|
+
"motorcycle",
|
|
44195
|
+
"bicycle",
|
|
44196
|
+
"airplane",
|
|
44197
|
+
"boat",
|
|
44198
|
+
"train",
|
|
44199
|
+
"bird",
|
|
44200
|
+
"dog",
|
|
44201
|
+
"cat",
|
|
44202
|
+
"horse",
|
|
44203
|
+
"sheep",
|
|
44204
|
+
"cow",
|
|
44205
|
+
"elephant",
|
|
44206
|
+
"bear",
|
|
44207
|
+
"zebra",
|
|
44208
|
+
"giraffe",
|
|
44209
|
+
"package-delivered",
|
|
44210
|
+
"package-picked-up",
|
|
44211
|
+
"suitcase",
|
|
44212
|
+
"backpack",
|
|
44213
|
+
"handbag",
|
|
44214
|
+
"contact",
|
|
44215
|
+
"motion-sensor",
|
|
44216
|
+
"smoke",
|
|
44217
|
+
"flood",
|
|
44218
|
+
"gas",
|
|
44219
|
+
"carbon-monoxide",
|
|
44220
|
+
"vibration",
|
|
44221
|
+
"tamper",
|
|
44222
|
+
"presence",
|
|
44223
|
+
"enum-sensor",
|
|
44224
|
+
"device-event",
|
|
44225
|
+
"lock",
|
|
44226
|
+
"cover",
|
|
44227
|
+
"switch",
|
|
44228
|
+
"siren",
|
|
44229
|
+
"button",
|
|
44230
|
+
"doorbell"
|
|
44231
|
+
];
|
|
44232
|
+
var AUDIO_ENTRY_ID = "audio";
|
|
44233
|
+
/** Six rungs, quiet → loud. The opaque end is the entry's hex. */
|
|
44234
|
+
var AUDIO_GRADIENT_ALPHAS = [
|
|
44235
|
+
.3,
|
|
44236
|
+
.42,
|
|
44237
|
+
.55,
|
|
44238
|
+
.7,
|
|
44239
|
+
.85,
|
|
44240
|
+
1
|
|
44241
|
+
];
|
|
44242
|
+
var PALETTE_PRESET_IDS = [
|
|
44243
|
+
"camstack",
|
|
44244
|
+
"high-contrast",
|
|
44245
|
+
"okabe-ito"
|
|
44246
|
+
];
|
|
44247
|
+
/** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
|
|
44248
|
+
var CAMSTACK_HEX = {
|
|
44249
|
+
motion: "#d946ef",
|
|
44250
|
+
audio: "#059eb8",
|
|
44251
|
+
recording: "#ef4444",
|
|
44252
|
+
live: "#8d7a00",
|
|
44253
|
+
heatmapScrub: "#4b32ff",
|
|
44254
|
+
person: "#11a64c",
|
|
44255
|
+
vehicle: "#3b82f6",
|
|
44256
|
+
animal: "#ea6a09",
|
|
44257
|
+
package: "#924667",
|
|
44258
|
+
sensor: "#624bbc",
|
|
44259
|
+
control: "#944d24",
|
|
44260
|
+
face: "#ed4f8d",
|
|
44261
|
+
plate: "#4b7027",
|
|
44262
|
+
car: "#9684cf",
|
|
44263
|
+
truck: "#0f9b89",
|
|
44264
|
+
bus: "#a734a9",
|
|
44265
|
+
motorcycle: "#c1133a",
|
|
44266
|
+
bicycle: "#0e6a9b",
|
|
44267
|
+
airplane: "#7c9928",
|
|
44268
|
+
boat: "#b17933",
|
|
44269
|
+
train: "#ad6ca3",
|
|
44270
|
+
bird: "#0f7c55",
|
|
44271
|
+
dog: "#c82700",
|
|
44272
|
+
cat: "#7268f2",
|
|
44273
|
+
horse: "#cb795e",
|
|
44274
|
+
sheep: "#b8636b",
|
|
44275
|
+
cow: "#cb2969",
|
|
44276
|
+
elephant: "#1158d2",
|
|
44277
|
+
bear: "#8d5e00",
|
|
44278
|
+
zebra: "#0097d6",
|
|
44279
|
+
giraffe: "#8f61bb",
|
|
44280
|
+
"package-delivered": "#cd3f9b",
|
|
44281
|
+
"package-picked-up": "#388a08",
|
|
44282
|
+
suitcase: "#666800",
|
|
44283
|
+
backpack: "#ec5022",
|
|
44284
|
+
handbag: "#a76ef8",
|
|
44285
|
+
contact: "#ab5a49",
|
|
44286
|
+
"motion-sensor": "#b95d1a",
|
|
44287
|
+
smoke: "#dd3858",
|
|
44288
|
+
flood: "#b31e7d",
|
|
44289
|
+
gas: "#5b70b5",
|
|
44290
|
+
"carbon-monoxide": "#7b4e8e",
|
|
44291
|
+
vibration: "#e65bba",
|
|
44292
|
+
tamper: "#98464b",
|
|
44293
|
+
presence: "#3a9468",
|
|
44294
|
+
"enum-sensor": "#7885f8",
|
|
44295
|
+
"device-event": "#8c43c8",
|
|
44296
|
+
lock: "#649653",
|
|
44297
|
+
cover: "#c67597",
|
|
44298
|
+
switch: "#7a812a",
|
|
44299
|
+
siren: "#ac5d7f",
|
|
44300
|
+
button: "#b276cd",
|
|
44301
|
+
doorbell: "#0087ab"
|
|
44302
|
+
};
|
|
44303
|
+
var CAMSTACK_FALLBACK = [
|
|
44304
|
+
"#b34dc7",
|
|
44305
|
+
"#1d7d34",
|
|
44306
|
+
"#db6b6c",
|
|
44307
|
+
"#a43d29",
|
|
44308
|
+
"#0e6ee6",
|
|
44309
|
+
"#29a10b",
|
|
44310
|
+
"#a98731",
|
|
44311
|
+
"#0181c6"
|
|
44312
|
+
];
|
|
44313
|
+
var HIGH_CONTRAST_HEX = {
|
|
44314
|
+
motion: "#964360",
|
|
44315
|
+
audio: "#23a132",
|
|
44316
|
+
recording: "#2494ca",
|
|
44317
|
+
live: "#bd7e2b",
|
|
44318
|
+
heatmapScrub: "#ad6eea",
|
|
44319
|
+
person: "#62611e",
|
|
44320
|
+
vehicle: "#f4534c",
|
|
44321
|
+
animal: "#1556cd",
|
|
44322
|
+
package: "#9c4415",
|
|
44323
|
+
sensor: "#066c48",
|
|
44324
|
+
control: "#f2479f",
|
|
44325
|
+
face: "#139d8a",
|
|
44326
|
+
plate: "#909024",
|
|
44327
|
+
car: "#8e35ab",
|
|
44328
|
+
truck: "#bd0b2b",
|
|
44329
|
+
bus: "#7a88ca",
|
|
44330
|
+
motorcycle: "#e26725",
|
|
44331
|
+
bicycle: "#a6679b",
|
|
44332
|
+
airplane: "#7c5720",
|
|
44333
|
+
boat: "#467a1b",
|
|
44334
|
+
train: "#6f65a4",
|
|
44335
|
+
bird: "#cb717f",
|
|
44336
|
+
dog: "#c62490",
|
|
44337
|
+
cat: "#b36850",
|
|
44338
|
+
horse: "#1872ac",
|
|
44339
|
+
sheep: "#927939",
|
|
44340
|
+
cow: "#428a5c",
|
|
44341
|
+
elephant: "#d41160",
|
|
44342
|
+
bear: "#799453",
|
|
44343
|
+
zebra: "#a85455",
|
|
44344
|
+
giraffe: "#746be8",
|
|
44345
|
+
"package-delivered": "#824a80",
|
|
44346
|
+
"package-picked-up": "#614ac1",
|
|
44347
|
+
suitcase: "#2f77f3",
|
|
44348
|
+
backpack: "#fa476d",
|
|
44349
|
+
handbag: "#c14cbe",
|
|
44350
|
+
contact: "#c83921",
|
|
44351
|
+
"motion-sensor": "#a07ebd",
|
|
44352
|
+
smoke: "#a25b13",
|
|
44353
|
+
flood: "#526bab",
|
|
44354
|
+
gas: "#924938",
|
|
44355
|
+
"carbon-monoxide": "#bb7e53",
|
|
44356
|
+
vibration: "#b66182",
|
|
44357
|
+
tamper: "#3c6931",
|
|
44358
|
+
presence: "#6c851d",
|
|
44359
|
+
"enum-sensor": "#ad2d48",
|
|
44360
|
+
"device-event": "#5e9b04",
|
|
44361
|
+
lock: "#00a062",
|
|
44362
|
+
cover: "#ad8624",
|
|
44363
|
+
switch: "#d05259",
|
|
44364
|
+
siren: "#cd67b3",
|
|
44365
|
+
button: "#c9746a",
|
|
44366
|
+
doorbell: "#338eeb"
|
|
44367
|
+
};
|
|
44368
|
+
var HIGH_CONTRAST_FALLBACK = [
|
|
44369
|
+
"#817f3b",
|
|
44370
|
+
"#a0733e",
|
|
44371
|
+
"#8658b2",
|
|
44372
|
+
"#956301",
|
|
44373
|
+
"#bc652d",
|
|
44374
|
+
"#647331",
|
|
44375
|
+
"#a14c9e",
|
|
44376
|
+
"#d14e71"
|
|
44377
|
+
];
|
|
44378
|
+
var OKABE_ITO_HEX = {
|
|
44379
|
+
motion: "#b88128",
|
|
44380
|
+
audio: "#1096c8",
|
|
44381
|
+
recording: "#009e73",
|
|
44382
|
+
live: "#9c8c22",
|
|
44383
|
+
heatmapScrub: "#0072b2",
|
|
44384
|
+
person: "#d55e00",
|
|
44385
|
+
vehicle: "#c0739f",
|
|
44386
|
+
animal: "#226d18",
|
|
44387
|
+
package: "#91446c",
|
|
44388
|
+
sensor: "#217b56",
|
|
44389
|
+
control: "#648647",
|
|
44390
|
+
face: "#c22998",
|
|
44391
|
+
plate: "#fa4575",
|
|
44392
|
+
car: "#956301",
|
|
44393
|
+
truck: "#2f77f3",
|
|
44394
|
+
bus: "#7a4e86",
|
|
44395
|
+
motorcycle: "#f54597",
|
|
44396
|
+
bicycle: "#bb3e75",
|
|
44397
|
+
airplane: "#e054c0",
|
|
44398
|
+
boat: "#457942",
|
|
44399
|
+
train: "#867afa",
|
|
44400
|
+
bird: "#88914c",
|
|
44401
|
+
dog: "#1556cd",
|
|
44402
|
+
cat: "#71702c",
|
|
44403
|
+
horse: "#9b4fa4",
|
|
44404
|
+
sheep: "#c0559d",
|
|
44405
|
+
cow: "#d14f65",
|
|
44406
|
+
elephant: "#98470f",
|
|
44407
|
+
bear: "#595896",
|
|
44408
|
+
zebra: "#96790e",
|
|
44409
|
+
giraffe: "#cb717b",
|
|
44410
|
+
"package-delivered": "#139d8a",
|
|
44411
|
+
"package-picked-up": "#906ead",
|
|
44412
|
+
suitcase: "#d02939",
|
|
44413
|
+
backpack: "#d41160",
|
|
44414
|
+
handbag: "#f64f54",
|
|
44415
|
+
contact: "#7258d2",
|
|
44416
|
+
"motion-sensor": "#b66182",
|
|
44417
|
+
smoke: "#627abb",
|
|
44418
|
+
flood: "#b86ae4",
|
|
44419
|
+
gas: "#a95261",
|
|
44420
|
+
"carbon-monoxide": "#c65d3c",
|
|
44421
|
+
vibration: "#7a40b7",
|
|
44422
|
+
tamper: "#914b34",
|
|
44423
|
+
presence: "#9481c3",
|
|
44424
|
+
"enum-sensor": "#ac6d47",
|
|
44425
|
+
"device-event": "#7b6fce",
|
|
44426
|
+
lock: "#c67662",
|
|
44427
|
+
cover: "#a6564d",
|
|
44428
|
+
switch: "#ad2c4e",
|
|
44429
|
+
siren: "#348e08",
|
|
44430
|
+
button: "#d27303",
|
|
44431
|
+
doorbell: "#55770f"
|
|
44432
|
+
};
|
|
44433
|
+
var OKABE_ITO_FALLBACK = [
|
|
44434
|
+
"#9a3784",
|
|
44435
|
+
"#a7392c",
|
|
44436
|
+
"#409d50",
|
|
44437
|
+
"#6987e7",
|
|
44438
|
+
"#ee5b3d",
|
|
44439
|
+
"#c0430d",
|
|
44440
|
+
"#af79b3",
|
|
44441
|
+
"#4b6628"
|
|
44442
|
+
];
|
|
44443
|
+
/**
|
|
44444
|
+
* The display palette (D939). One table of colours, three presets, one
|
|
44445
|
+
* validator. Taxonomy colours and every consumer read this — there is no
|
|
44446
|
+
* second hex table.
|
|
44447
|
+
*/
|
|
44448
|
+
var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
|
|
44449
|
+
var paletteSwatchSchema = discriminatedUnion("form", [object({
|
|
44450
|
+
form: literal("solid"),
|
|
44451
|
+
hex: paletteHexSchema
|
|
44452
|
+
}), object({
|
|
44453
|
+
form: literal("gradient"),
|
|
44454
|
+
hex: paletteHexSchema,
|
|
44455
|
+
alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
|
|
44456
|
+
})]);
|
|
44457
|
+
var paletteReadySchema = object({
|
|
44458
|
+
status: literal("ready"),
|
|
44459
|
+
presetId: _enum(PALETTE_PRESET_IDS),
|
|
44460
|
+
customized: boolean(),
|
|
44461
|
+
source: _enum(["stored", "unconfigured"]),
|
|
44462
|
+
swatches: record(string(), paletteSwatchSchema),
|
|
44463
|
+
fallbacks: array(paletteHexSchema).length(8)
|
|
44464
|
+
});
|
|
44465
|
+
var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
|
|
44466
|
+
status: literal("unknown"),
|
|
44467
|
+
reason: string()
|
|
44468
|
+
})]);
|
|
44469
|
+
var setPaletteInputSchema = union([object({ presetId: string() }), object({
|
|
44470
|
+
presetId: string(),
|
|
44471
|
+
overrides: record(string(), paletteSwatchSchema)
|
|
44472
|
+
})]);
|
|
44473
|
+
object({
|
|
44474
|
+
presetId: string(),
|
|
44475
|
+
overrides: record(string(), paletteSwatchSchema)
|
|
44476
|
+
});
|
|
44477
|
+
function solid(hex) {
|
|
44478
|
+
return {
|
|
44479
|
+
form: "solid",
|
|
44480
|
+
hex
|
|
44481
|
+
};
|
|
44482
|
+
}
|
|
44483
|
+
function audioGradient(hex) {
|
|
44484
|
+
return {
|
|
44485
|
+
form: "gradient",
|
|
44486
|
+
hex,
|
|
44487
|
+
alphas: [...AUDIO_GRADIENT_ALPHAS]
|
|
44488
|
+
};
|
|
44489
|
+
}
|
|
44490
|
+
function swatchesFrom(hexes) {
|
|
44491
|
+
const out = {};
|
|
44492
|
+
for (const id of PALETTE_ENTRY_IDS) {
|
|
44493
|
+
const hex = hexes[id];
|
|
44494
|
+
if (hex === void 0) throw new Error(`palette table missing ${id}`);
|
|
44495
|
+
out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
|
|
44496
|
+
}
|
|
44497
|
+
return out;
|
|
44498
|
+
}
|
|
44499
|
+
function preset(id, name, hexes, fallbacks) {
|
|
44500
|
+
return {
|
|
44501
|
+
id,
|
|
44502
|
+
name,
|
|
44503
|
+
swatches: swatchesFrom(hexes),
|
|
44504
|
+
fallbacks
|
|
44505
|
+
};
|
|
44506
|
+
}
|
|
44507
|
+
var DISPLAY_PRESETS = [
|
|
44508
|
+
preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
|
|
44509
|
+
preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
|
|
44510
|
+
preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
|
|
44511
|
+
];
|
|
44512
|
+
function presetById(id) {
|
|
44513
|
+
return DISPLAY_PRESETS.find((item) => item.id === id);
|
|
44514
|
+
}
|
|
44515
|
+
function bundledCamstack() {
|
|
44516
|
+
const presetRow = presetById("camstack");
|
|
44517
|
+
if (presetRow === void 0) throw new Error("CamStack preset missing");
|
|
44518
|
+
return readyOf(presetRow, "unconfigured", false);
|
|
44519
|
+
}
|
|
44520
|
+
function readyOf(row, source, customized) {
|
|
44521
|
+
return {
|
|
44522
|
+
status: "ready",
|
|
44523
|
+
presetId: row.id,
|
|
44524
|
+
customized,
|
|
44525
|
+
source,
|
|
44526
|
+
swatches: row.swatches,
|
|
44527
|
+
fallbacks: [...row.fallbacks]
|
|
44528
|
+
};
|
|
44529
|
+
}
|
|
44530
|
+
function hashFallback(kind, fallbacks) {
|
|
44531
|
+
let hash = 0;
|
|
44532
|
+
for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
|
|
44533
|
+
const hex = fallbacks[hash % fallbacks.length];
|
|
44534
|
+
if (hex === void 0) throw new Error("display palette has no fallback colour");
|
|
44535
|
+
return hex;
|
|
44536
|
+
}
|
|
44537
|
+
/** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
|
|
44538
|
+
function paintHex(swatches, fallbacks, kind) {
|
|
44539
|
+
const key = kind.trim().toLowerCase();
|
|
44540
|
+
if (key.startsWith("audio-")) {
|
|
44541
|
+
const audio = swatches[AUDIO_ENTRY_ID];
|
|
44542
|
+
return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
|
|
44543
|
+
}
|
|
44544
|
+
const direct = swatches[key];
|
|
44545
|
+
if (direct !== void 0) return direct.hex;
|
|
44546
|
+
return hashFallback(key, fallbacks);
|
|
44547
|
+
}
|
|
44548
|
+
/**
|
|
42179
44549
|
* Unified event-kind taxonomy — THE single source of truth for
|
|
42180
44550
|
* `kind → { parentKind, category, level, color, iconId, labelKey, label,
|
|
42181
44551
|
* icon }`.
|
|
@@ -42189,109 +44559,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
|
|
|
42189
44559
|
* - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
|
|
42190
44560
|
* - the COCO / audio class maps (macro ↔ sub relationships)
|
|
42191
44561
|
*
|
|
42192
|
-
* The DATA (serializable —
|
|
42193
|
-
* `@camstack/types`.
|
|
42194
|
-
*
|
|
42195
|
-
*
|
|
42196
|
-
*
|
|
44562
|
+
* The DATA (serializable — parentKind / iconId / labelKey) lives here in
|
|
44563
|
+
* `@camstack/types`. Colour is NOT a second table: each entry's `color` is
|
|
44564
|
+
* the bundled CamStack display palette (D939). The effective cluster palette
|
|
44565
|
+
* is the `display-palette` capability. The UI-side mapping `iconId → lucide
|
|
44566
|
+
* component` and `labelKey → t()` lives in `@camstack/ui-library`.
|
|
42197
44567
|
*
|
|
42198
44568
|
* Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
|
|
42199
44569
|
*/
|
|
42200
|
-
var
|
|
42201
|
-
|
|
42202
|
-
|
|
42203
|
-
|
|
42204
|
-
|
|
42205
|
-
|
|
42206
|
-
|
|
42207
|
-
|
|
42208
|
-
|
|
42209
|
-
|
|
42210
|
-
};
|
|
42211
|
-
var DETECTION_SUB_COLORS = {
|
|
42212
|
-
car: "#f59e0b",
|
|
42213
|
-
truck: "#d97706",
|
|
42214
|
-
bus: "#b45309",
|
|
42215
|
-
motorcycle: "#eab308",
|
|
42216
|
-
bicycle: "#ca8a04",
|
|
42217
|
-
airplane: "#60a5fa",
|
|
42218
|
-
boat: "#2563eb",
|
|
42219
|
-
train: "#1d4ed8",
|
|
42220
|
-
bird: "#14b8a6",
|
|
42221
|
-
dog: "#84cc16",
|
|
42222
|
-
cat: "#f97316",
|
|
42223
|
-
horse: "#a16207",
|
|
42224
|
-
sheep: "#a3a3a3",
|
|
42225
|
-
cow: "#78716c",
|
|
42226
|
-
elephant: "#6b7280",
|
|
42227
|
-
bear: "#7c2d12",
|
|
42228
|
-
zebra: "#404040",
|
|
42229
|
-
giraffe: "#d4a373"
|
|
42230
|
-
};
|
|
44570
|
+
var BUNDLED_PALETTE = bundledCamstack();
|
|
44571
|
+
function kindColor(kind) {
|
|
44572
|
+
return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
|
|
44573
|
+
}
|
|
44574
|
+
function firstFallback(fallbacks) {
|
|
44575
|
+
const hex = fallbacks[0];
|
|
44576
|
+
if (hex === void 0) throw new Error("display palette has no fallback colour");
|
|
44577
|
+
return hex;
|
|
44578
|
+
}
|
|
44579
|
+
firstFallback(BUNDLED_PALETTE.fallbacks);
|
|
42231
44580
|
function titleCase(id) {
|
|
42232
44581
|
return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
|
|
42233
44582
|
}
|
|
42234
44583
|
var entries = /* @__PURE__ */ new Map();
|
|
42235
|
-
function macro(kind, category,
|
|
44584
|
+
function macro(kind, category, iconId, label) {
|
|
42236
44585
|
entries.set(kind, {
|
|
42237
44586
|
kind,
|
|
42238
44587
|
parentKind: null,
|
|
42239
44588
|
level: "macro",
|
|
42240
44589
|
category,
|
|
42241
|
-
color,
|
|
44590
|
+
color: kindColor(kind),
|
|
42242
44591
|
iconId,
|
|
42243
44592
|
labelKey: `eventKind.${kind}`,
|
|
42244
44593
|
label
|
|
42245
44594
|
});
|
|
42246
44595
|
}
|
|
42247
|
-
function sub(kind, parentKind, category,
|
|
44596
|
+
function sub(kind, parentKind, category, iconId, label) {
|
|
42248
44597
|
entries.set(kind, {
|
|
42249
44598
|
kind,
|
|
42250
44599
|
parentKind,
|
|
42251
44600
|
level: "sub",
|
|
42252
44601
|
category,
|
|
42253
|
-
color,
|
|
44602
|
+
color: kindColor(kind),
|
|
42254
44603
|
iconId,
|
|
42255
44604
|
labelKey: `eventKind.${kind}`,
|
|
42256
44605
|
label
|
|
42257
44606
|
});
|
|
42258
44607
|
}
|
|
42259
|
-
macro("motion", "motion",
|
|
42260
|
-
macro("audio", "audio",
|
|
42261
|
-
macro("person", "detection",
|
|
42262
|
-
macro("vehicle", "detection",
|
|
42263
|
-
macro("animal", "detection",
|
|
42264
|
-
macro("package", "package",
|
|
42265
|
-
macro("sensor", "sensor",
|
|
42266
|
-
macro("control", "control",
|
|
44608
|
+
macro("motion", "motion", "motion", "Motion");
|
|
44609
|
+
macro("audio", "audio", "audio", "Audio");
|
|
44610
|
+
macro("person", "detection", "person", "Person");
|
|
44611
|
+
macro("vehicle", "detection", "vehicle", "Vehicle");
|
|
44612
|
+
macro("animal", "detection", "animal", "Animal");
|
|
44613
|
+
macro("package", "package", "package", "Package");
|
|
44614
|
+
macro("sensor", "sensor", "sensor", "Sensor");
|
|
44615
|
+
macro("control", "control", "control", "Control");
|
|
42267
44616
|
for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
|
|
42268
44617
|
if (macroClass !== "vehicle" && macroClass !== "animal") continue;
|
|
42269
44618
|
if (entries.has(cocoClass)) continue;
|
|
42270
|
-
sub(cocoClass, macroClass, "detection",
|
|
42271
|
-
}
|
|
42272
|
-
sub("package-delivered", "package", "package",
|
|
42273
|
-
sub("package-picked-up", "package", "package",
|
|
42274
|
-
sub("contact", "sensor", "sensor", "
|
|
42275
|
-
sub("motion-sensor", "sensor", "sensor",
|
|
42276
|
-
sub("smoke", "sensor", "sensor", "
|
|
42277
|
-
sub("flood", "sensor", "sensor", "
|
|
42278
|
-
sub("gas", "sensor", "sensor", "
|
|
42279
|
-
sub("carbon-monoxide", "sensor", "sensor", "
|
|
42280
|
-
sub("vibration", "sensor", "sensor", "
|
|
42281
|
-
sub("tamper", "sensor", "sensor", "
|
|
42282
|
-
sub("presence", "sensor", "sensor", "
|
|
42283
|
-
sub("enum-sensor", "sensor", "sensor",
|
|
42284
|
-
sub("device-event", "sensor", "sensor", "
|
|
42285
|
-
sub("lock", "control", "control", "
|
|
42286
|
-
sub("cover", "control", "control", "
|
|
42287
|
-
sub("switch", "control", "control",
|
|
42288
|
-
sub("siren", "control", "control", "
|
|
42289
|
-
sub("button", "control", "control", "
|
|
42290
|
-
sub("doorbell", "control", "control", "
|
|
44619
|
+
sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
|
|
44620
|
+
}
|
|
44621
|
+
sub("package-delivered", "package", "package", "package", "Package delivered");
|
|
44622
|
+
sub("package-picked-up", "package", "package", "package", "Package picked up");
|
|
44623
|
+
sub("contact", "sensor", "sensor", "door", "Contact");
|
|
44624
|
+
sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
|
|
44625
|
+
sub("smoke", "sensor", "sensor", "smoke", "Smoke");
|
|
44626
|
+
sub("flood", "sensor", "sensor", "water", "Water leak");
|
|
44627
|
+
sub("gas", "sensor", "sensor", "gas", "Gas");
|
|
44628
|
+
sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
|
|
44629
|
+
sub("vibration", "sensor", "sensor", "vibration", "Vibration");
|
|
44630
|
+
sub("tamper", "sensor", "sensor", "tamper", "Tamper");
|
|
44631
|
+
sub("presence", "sensor", "sensor", "presence", "Presence");
|
|
44632
|
+
sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
|
|
44633
|
+
sub("device-event", "sensor", "sensor", "button", "Device event");
|
|
44634
|
+
sub("lock", "control", "control", "lock", "Lock");
|
|
44635
|
+
sub("cover", "control", "control", "door", "Cover");
|
|
44636
|
+
sub("switch", "control", "control", "switch", "Switch");
|
|
44637
|
+
sub("siren", "control", "control", "siren", "Siren");
|
|
44638
|
+
sub("button", "control", "control", "button", "Button");
|
|
44639
|
+
sub("doorbell", "control", "control", "doorbell", "Doorbell");
|
|
42291
44640
|
for (const l of AUDIO_MACRO_LABELS) {
|
|
42292
44641
|
const kind = `audio-${l.id}`;
|
|
42293
44642
|
if (entries.has(kind)) continue;
|
|
42294
|
-
sub(kind, "audio", "audio",
|
|
44643
|
+
sub(kind, "audio", "audio", kind, l.name);
|
|
42295
44644
|
}
|
|
42296
44645
|
/** The complete taxonomy dictionary, keyed by kind. */
|
|
42297
44646
|
var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
|
|
@@ -43178,7 +45527,7 @@ var NcConditionsSchema = object({
|
|
|
43178
45527
|
* with the list under it is worse than no switch (D62).
|
|
43179
45528
|
*
|
|
43180
45529
|
* MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
|
|
43181
|
-
* renameable, and a rule authored on "
|
|
45530
|
+
* renameable, and a rule authored on "Alice" went silently dark the moment
|
|
43182
45531
|
* the operator fixed the spelling. The id reaches the record on
|
|
43183
45532
|
* `LabelAttribution.identityId`; the name is what the editor shows and what
|
|
43184
45533
|
* `{{label}}` renders.
|
|
@@ -43729,7 +46078,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
|
|
|
43729
46078
|
* A rule scoped to one camera and one zone silently became a rule that
|
|
43730
46079
|
* matches EVERY event on EVERY camera, and lost its `media` policy
|
|
43731
46080
|
* (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
|
|
43732
|
-
* live on 2026-08-12: a rule scoped to device
|
|
46081
|
+
* live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
|
|
43733
46082
|
* within a minute of a two-field patch.
|
|
43734
46083
|
*
|
|
43735
46084
|
* So every defaulted field is re-declared here WITHOUT its default. The
|
|
@@ -45542,7 +47891,7 @@ var LabelAttributionSchema = object({
|
|
|
45542
47891
|
* `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
|
|
45543
47892
|
*
|
|
45544
47893
|
* The text alone is a DISPLAY NAME, and a display name is renameable: a
|
|
45545
|
-
* notification rule authored on "
|
|
47894
|
+
* notification rule authored on "Alice" stopped matching the moment the
|
|
45546
47895
|
* operator fixed the spelling in the gallery, and nothing said so. The id is
|
|
45547
47896
|
* the thing that does not move, so it is what a rule matches on
|
|
45548
47897
|
* (`NcConditions.identities`) and the text is what a human is shown.
|
|
@@ -48081,7 +50430,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
48081
50430
|
/**
|
|
48082
50431
|
* Root-supplied detections for the tree's ROOT step (D730). Set by
|
|
48083
50432
|
* `runDetailSubtree` when the camera's root model supplies a crop-kind
|
|
48084
|
-
* step (a
|
|
50433
|
+
* step (a plus catalog `license_plate` for `plate-detection`): the step is
|
|
48085
50434
|
* NOT inferred, these boxes are its output, and its children (the plate
|
|
48086
50435
|
* reader) run on them through their own crop policy. Boxes are in the
|
|
48087
50436
|
* PIXELS of the image this call carries. Absent ⇒ the root step runs.
|
|
@@ -49758,7 +52107,7 @@ var RunnerCameraConfigSchema = object({
|
|
|
49758
52107
|
* detection session that asks for history. What shipped was a last-moment
|
|
49759
52108
|
* discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
|
|
49760
52109
|
* arriving inside a few hundred ms of wall clock looks to it like one frame's
|
|
49761
|
-
* worth. Device
|
|
52110
|
+
* worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
|
|
49762
52111
|
* recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
|
|
49763
52112
|
* 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
|
|
49764
52113
|
* was decoded, and was freed.
|
|
@@ -51788,7 +54137,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
|
|
|
51788
54137
|
* The signals a device can emit to WAKE its own stream.
|
|
51789
54138
|
*
|
|
51790
54139
|
* A camera whose stream is built on demand sleeps until something asks for it,
|
|
51791
|
-
* and "something" cannot be a consumer that is merely attached — a
|
|
54140
|
+
* and "something" cannot be a consumer that is merely attached — a external-catalog
|
|
51792
54141
|
* puller holds a session open for ever, and treating that as demand would keep
|
|
51793
54142
|
* a battery camera awake for ever, which is the whole thing the battery is for
|
|
51794
54143
|
* (D173). So the wake has to come from the CAMERA: an event it noticed by
|
|
@@ -52508,7 +54857,7 @@ var ClipSchema = object({
|
|
|
52508
54857
|
* {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
|
|
52509
54858
|
*
|
|
52510
54859
|
* Bounded because it is not a payload the surface pages through: one visit on
|
|
52511
|
-
* device
|
|
54860
|
+
* device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
|
|
52512
54861
|
* camera-day. Read {@link eventCount} for the true total.
|
|
52513
54862
|
*/
|
|
52514
54863
|
eventIds: array(string()).optional(),
|
|
@@ -52653,7 +55002,7 @@ var ClipPlaybackSchema = object({
|
|
|
52653
55002
|
* camera has no recordings", which is the defect this whole line of work is
|
|
52654
55003
|
* about: a battery camera nobody woke (`sleeping`), a camera that could not be
|
|
52655
55004
|
* reached at all (`unreachable`, also what a provider that THREW reports), a
|
|
52656
|
-
* camera whose SD card is not mounted (`no-storage`, measured on
|
|
55005
|
+
* camera whose SD card is not mounted (`no-storage`, measured on 106 —
|
|
52657
55006
|
* `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
|
|
52658
55007
|
* camera whose OWN index disagrees with its OWN calendar (`index-empty`,
|
|
52659
55008
|
* measured on 618: the calendar marks 3–20 September, days 6–20 list zero
|
|
@@ -52918,7 +55267,7 @@ DeviceType.Camera, method(object({
|
|
|
52918
55267
|
*
|
|
52919
55268
|
* It was optional, documented as "absent means the device's BOUND
|
|
52920
55269
|
* provider, which is CamStack on every camera". No code implemented
|
|
52921
|
-
* that. Measured on the live hub 2026-09-20 — device
|
|
55270
|
+
* that. Measured on the live hub 2026-09-20 — device 107, bound to
|
|
52922
55271
|
* `recorder` AND `provider-reolink` — a bare call with `limit: 3`
|
|
52923
55272
|
* answered SIX rows, three from each source, merged newest-first:
|
|
52924
55273
|
* `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
|
|
@@ -54061,7 +56410,10 @@ var airQualitySensorCapability = {
|
|
|
54061
56410
|
*/
|
|
54062
56411
|
var AmbientLightSensorStatusSchema = object({
|
|
54063
56412
|
/** Current illuminance in lux (lx). */
|
|
54064
|
-
lux: number().min(0)
|
|
56413
|
+
lux: number().min(0).meta({
|
|
56414
|
+
unit: "lx",
|
|
56415
|
+
label: "Illuminance"
|
|
56416
|
+
}),
|
|
54065
56417
|
/** Ms epoch when the slice was last updated. */
|
|
54066
56418
|
lastFetchedAt: number(),
|
|
54067
56419
|
/** Live display unit from the upstream source (e.g. HA
|
|
@@ -54104,7 +56456,12 @@ var ambientLightSensorCapability = {
|
|
|
54104
56456
|
} } },
|
|
54105
56457
|
/** Clock fields: written, but excluded from the compare that decides
|
|
54106
56458
|
* whether persisting is worth a SQLite commit. */
|
|
54107
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
56459
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
56460
|
+
customize: {
|
|
56461
|
+
version: 1,
|
|
56462
|
+
advanced: "derive",
|
|
56463
|
+
targets: []
|
|
56464
|
+
}
|
|
54108
56465
|
};
|
|
54109
56466
|
/**
|
|
54110
56467
|
* Per-class audio metrics aggregated over a sliding window.
|
|
@@ -54331,7 +56688,10 @@ var BatteryStatusSchema = object({
|
|
|
54331
56688
|
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
54332
56689
|
* declines to band a non-finite reading, which is the correct shape.
|
|
54333
56690
|
*/
|
|
54334
|
-
percentage: number().min(0).max(100).nullable()
|
|
56691
|
+
percentage: number().min(0).max(100).nullable().meta({
|
|
56692
|
+
unit: "%",
|
|
56693
|
+
label: "Charge"
|
|
56694
|
+
}),
|
|
54335
56695
|
/**
|
|
54336
56696
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
54337
56697
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
|
@@ -54350,13 +56710,13 @@ var BatteryStatusSchema = object({
|
|
|
54350
56710
|
"solar",
|
|
54351
56711
|
"none",
|
|
54352
56712
|
"unknown"
|
|
54353
|
-
]),
|
|
56713
|
+
]).meta({ label: "Charging source" }),
|
|
54354
56714
|
/**
|
|
54355
56715
|
* True when the camera firmware has gone into low-power mode. Battery
|
|
54356
56716
|
* providers MUST avoid polling during sleep — reading the battery
|
|
54357
56717
|
* wakes the camera up and drains charge.
|
|
54358
56718
|
*/
|
|
54359
|
-
sleeping: boolean(),
|
|
56719
|
+
sleeping: boolean().meta({ label: "Sleeping" }),
|
|
54360
56720
|
/** Ms epoch of the last observation. Lets consumers reason about freshness. */
|
|
54361
56721
|
lastUpdated: number(),
|
|
54362
56722
|
/**
|
|
@@ -54396,22 +56756,71 @@ var BatteryStatusSchema = object({
|
|
|
54396
56756
|
* sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
|
|
54397
56757
|
* misleading exact percentage. Absent/false → genuine 0–100 % reading.
|
|
54398
56758
|
*/
|
|
54399
|
-
binary: boolean().optional()
|
|
56759
|
+
binary: boolean().optional().meta({ label: "Binary indicator" })
|
|
54400
56760
|
});
|
|
56761
|
+
var BATTERY_DEVICE_TYPES = [
|
|
56762
|
+
DeviceType.Camera,
|
|
56763
|
+
DeviceType.Sensor,
|
|
56764
|
+
DeviceType.Button,
|
|
56765
|
+
DeviceType.Switch,
|
|
56766
|
+
DeviceType.PetFeeder,
|
|
56767
|
+
DeviceType.Container,
|
|
56768
|
+
DeviceType.Thermostat
|
|
56769
|
+
];
|
|
56770
|
+
/** Generic Customize target for the percentage reading (D936). */
|
|
56771
|
+
var batteryCustomize = {
|
|
56772
|
+
version: 1,
|
|
56773
|
+
advanced: "derive",
|
|
56774
|
+
targets: [{
|
|
56775
|
+
id: "percentage",
|
|
56776
|
+
cardinality: "scalar",
|
|
56777
|
+
vocabulary: {
|
|
56778
|
+
cap: "battery",
|
|
56779
|
+
stateField: "percentage"
|
|
56780
|
+
},
|
|
56781
|
+
deviceTypes: BATTERY_DEVICE_TYPES,
|
|
56782
|
+
apply: "add-or-replace",
|
|
56783
|
+
path: "percentage",
|
|
56784
|
+
sources: [{
|
|
56785
|
+
kind: "field",
|
|
56786
|
+
valueKinds: ["number", "string"],
|
|
56787
|
+
transforms: [{ kind: "identity" }, {
|
|
56788
|
+
kind: "linear",
|
|
56789
|
+
defaultScale: 1,
|
|
56790
|
+
defaultOffset: 0,
|
|
56791
|
+
clampMin: 0,
|
|
56792
|
+
clampMax: 100
|
|
56793
|
+
}]
|
|
56794
|
+
}],
|
|
56795
|
+
companions: [
|
|
56796
|
+
{
|
|
56797
|
+
kind: "constant",
|
|
56798
|
+
path: "charging",
|
|
56799
|
+
value: "unknown",
|
|
56800
|
+
when: "add"
|
|
56801
|
+
},
|
|
56802
|
+
{
|
|
56803
|
+
kind: "constant",
|
|
56804
|
+
path: "sleeping",
|
|
56805
|
+
value: false,
|
|
56806
|
+
when: "add"
|
|
56807
|
+
},
|
|
56808
|
+
{
|
|
56809
|
+
kind: "clock",
|
|
56810
|
+
path: "lastUpdated",
|
|
56811
|
+
when: "add"
|
|
56812
|
+
}
|
|
56813
|
+
],
|
|
56814
|
+
sourceReport: { status: "assignment-status" },
|
|
56815
|
+
advancedExpression: true
|
|
56816
|
+
}]
|
|
56817
|
+
};
|
|
54401
56818
|
var batteryCapability = {
|
|
54402
56819
|
name: "battery",
|
|
54403
56820
|
scope: "device",
|
|
54404
56821
|
deviceNative: true,
|
|
54405
56822
|
mode: "singleton",
|
|
54406
|
-
deviceTypes:
|
|
54407
|
-
DeviceType.Camera,
|
|
54408
|
-
DeviceType.Sensor,
|
|
54409
|
-
DeviceType.Button,
|
|
54410
|
-
DeviceType.Switch,
|
|
54411
|
-
DeviceType.PetFeeder,
|
|
54412
|
-
DeviceType.Container,
|
|
54413
|
-
DeviceType.Thermostat
|
|
54414
|
-
],
|
|
56823
|
+
deviceTypes: BATTERY_DEVICE_TYPES,
|
|
54415
56824
|
methods: {
|
|
54416
56825
|
/**
|
|
54417
56826
|
* Explicitly wake the camera from low-power sleep ahead of a
|
|
@@ -54495,6 +56904,7 @@ onStatusChanged: { data: object({
|
|
|
54495
56904
|
kind: "gauge",
|
|
54496
56905
|
unit: "%"
|
|
54497
56906
|
} } },
|
|
56907
|
+
customize: batteryCustomize,
|
|
54498
56908
|
/** Clock fields: written, but excluded from the compare that decides
|
|
54499
56909
|
* whether persisting is worth a SQLite commit. */
|
|
54500
56910
|
volatileStateFields: ["lastUpdated"]
|
|
@@ -54511,7 +56921,7 @@ onStatusChanged: { data: object({
|
|
|
54511
56921
|
* with the right HomeKit / Alexa display category.
|
|
54512
56922
|
*/
|
|
54513
56923
|
var BinaryStatusSchema = object({
|
|
54514
|
-
on: boolean(),
|
|
56924
|
+
on: boolean().meta({ label: "On" }),
|
|
54515
56925
|
/** Ms epoch of the last transition. 0 if never observed. */
|
|
54516
56926
|
lastChangedAt: number()
|
|
54517
56927
|
});
|
|
@@ -54540,7 +56950,12 @@ var binaryCapability = {
|
|
|
54540
56950
|
history: { fields: { on: { kind: "boolean" } } },
|
|
54541
56951
|
/** Clock fields: written, but excluded from the compare that decides
|
|
54542
56952
|
* whether persisting is worth a SQLite commit. */
|
|
54543
|
-
volatileStateFields: ["lastChangedAt"]
|
|
56953
|
+
volatileStateFields: ["lastChangedAt"],
|
|
56954
|
+
customize: {
|
|
56955
|
+
version: 1,
|
|
56956
|
+
advanced: "derive",
|
|
56957
|
+
targets: []
|
|
56958
|
+
}
|
|
54544
56959
|
};
|
|
54545
56960
|
/**
|
|
54546
56961
|
* Dimmable-light brightness control. Co-exists with `switch` on the
|
|
@@ -54863,7 +57278,7 @@ var GridLayoutCellSchema = object({
|
|
|
54863
57278
|
*
|
|
54864
57279
|
* A grid's `high` composes its sources' `high` and its `low` their `low`, so a
|
|
54865
57280
|
* profile is on offer only when EVERY source can serve it. The refusal NAMES
|
|
54866
|
-
* the sources, because "this grid has no low" is not a finding — "
|
|
57281
|
+
* the sources, because "this grid has no low" is not a finding — "101 has no
|
|
54867
57282
|
* low" is, and it is the one an operator can act on.
|
|
54868
57283
|
*/
|
|
54869
57284
|
var GridProfileOfferSchema = object({
|
|
@@ -55484,6 +57899,106 @@ var ConsumablesStatusSchema = object({
|
|
|
55484
57899
|
items: array(ConsumableItemSchema),
|
|
55485
57900
|
lastChangedAt: number()
|
|
55486
57901
|
});
|
|
57902
|
+
/** Synthesize seed for a link-built status (no native provider).
|
|
57903
|
+
*
|
|
57904
|
+
* ⚠ NO LIVE CALLER since 2026-08-08 (device-links deleted; see
|
|
57905
|
+
* `CapabilityStatusSchema.empty`). The wiring guidance below was written for
|
|
57906
|
+
* exactly the case the operator is asking about again — a Dreame's HA
|
|
57907
|
+
* consumable-life sensors — so it is kept for that conversation, not because
|
|
57908
|
+
* anything reads it today. */
|
|
57909
|
+
var EMPTY_STATUS = {
|
|
57910
|
+
items: [],
|
|
57911
|
+
lastChangedAt: 0
|
|
57912
|
+
};
|
|
57913
|
+
/** Seed for a NEW link-built consumable item. `key`/`label` are overwritten
|
|
57914
|
+
* with the link's `itemKey` (see `status.itemArray`), so the placeholder
|
|
57915
|
+
* empty strings never survive into a validated item. Link-built items are
|
|
57916
|
+
* not resettable — there is no native provider to receive `reset()`.
|
|
57917
|
+
*
|
|
57918
|
+
* Wiring guidance (HA vacuum consumable-life sensors):
|
|
57919
|
+
* - a percent-remaining source (`numeric-sensor`, unit '%') → `level` via
|
|
57920
|
+
* `identity` (or `linear` scale 1 offset 0 clamp [0,100] to be safe);
|
|
57921
|
+
* - an hours-remaining source (e.g. Dreame 'Main Brush Time Left', unit 'h')
|
|
57922
|
+
* → `level` via `linear` with scale = 100 / max-hours for that item
|
|
57923
|
+
* (e.g. main brush 300 h → scale 0.3333) + clamp [0,100];
|
|
57924
|
+
* - a discrete source (`enum-sensor`, e.g. mop pad 'installed') → `status`
|
|
57925
|
+
* via `enum-map` (e.g. { installed: 'ok', missing: 'replace' }).
|
|
57926
|
+
* A numeric→'replace' THRESHOLD (level < 10 → 'replace') is NOT expressible
|
|
57927
|
+
* with the current transform kinds — leave `status` null (valid) until the
|
|
57928
|
+
* expression transform lands. */
|
|
57929
|
+
/** Generic Customize target for one consumable item (D936). Native rows stay read-only. */
|
|
57930
|
+
var consumablesCustomize = {
|
|
57931
|
+
version: 1,
|
|
57932
|
+
targets: [{
|
|
57933
|
+
id: "items",
|
|
57934
|
+
cardinality: "keyedArray",
|
|
57935
|
+
vocabulary: { cap: "consumables" },
|
|
57936
|
+
deviceTypes: Object.values(DeviceType),
|
|
57937
|
+
apply: "add",
|
|
57938
|
+
path: "items",
|
|
57939
|
+
keyField: "key",
|
|
57940
|
+
labelField: "label",
|
|
57941
|
+
itemSchema: ConsumableItemSchema,
|
|
57942
|
+
nativeItems: "read-only",
|
|
57943
|
+
sourceReport: { status: "assignment-status" },
|
|
57944
|
+
fields: [
|
|
57945
|
+
{
|
|
57946
|
+
path: "level",
|
|
57947
|
+
sources: [{
|
|
57948
|
+
kind: "numeric",
|
|
57949
|
+
transforms: [{ kind: "identity" }, {
|
|
57950
|
+
kind: "linear",
|
|
57951
|
+
defaultScale: 1,
|
|
57952
|
+
defaultOffset: 0,
|
|
57953
|
+
clampMin: 0,
|
|
57954
|
+
clampMax: 100
|
|
57955
|
+
}]
|
|
57956
|
+
}]
|
|
57957
|
+
},
|
|
57958
|
+
{
|
|
57959
|
+
path: "remaining.value",
|
|
57960
|
+
sources: [{
|
|
57961
|
+
kind: "numeric",
|
|
57962
|
+
transforms: [{ kind: "identity" }]
|
|
57963
|
+
}],
|
|
57964
|
+
literals: [{
|
|
57965
|
+
path: "remaining.unit",
|
|
57966
|
+
values: [...ConsumableRemainingUnitSchema.options]
|
|
57967
|
+
}]
|
|
57968
|
+
},
|
|
57969
|
+
{
|
|
57970
|
+
path: "status",
|
|
57971
|
+
sources: [{
|
|
57972
|
+
kind: "enum",
|
|
57973
|
+
transforms: [{
|
|
57974
|
+
kind: "enum-map",
|
|
57975
|
+
outputValues: [...ConsumableStatusSchema.options],
|
|
57976
|
+
unmapped: null
|
|
57977
|
+
}]
|
|
57978
|
+
}]
|
|
57979
|
+
}
|
|
57980
|
+
],
|
|
57981
|
+
traits: [{
|
|
57982
|
+
path: "kind",
|
|
57983
|
+
values: [...ConsumableKindSchema.options],
|
|
57984
|
+
defaultValue: "wear"
|
|
57985
|
+
}, {
|
|
57986
|
+
path: "form",
|
|
57987
|
+
values: [...ConsumableFormSchema.options],
|
|
57988
|
+
defaultValue: "part"
|
|
57989
|
+
}],
|
|
57990
|
+
companions: [{
|
|
57991
|
+
kind: "clock",
|
|
57992
|
+
path: "lastChangedAt",
|
|
57993
|
+
when: "add"
|
|
57994
|
+
}, {
|
|
57995
|
+
kind: "clock",
|
|
57996
|
+
path: "lastFetchedAt",
|
|
57997
|
+
when: "add"
|
|
57998
|
+
}],
|
|
57999
|
+
advancedExpression: true
|
|
58000
|
+
}]
|
|
58001
|
+
};
|
|
55487
58002
|
var consumablesCapability = {
|
|
55488
58003
|
name: "consumables",
|
|
55489
58004
|
scope: "device",
|
|
@@ -55521,10 +58036,7 @@ reset: method(object({
|
|
|
55521
58036
|
status: {
|
|
55522
58037
|
schema: ConsumablesStatusSchema,
|
|
55523
58038
|
kind: "push",
|
|
55524
|
-
empty:
|
|
55525
|
-
items: [],
|
|
55526
|
-
lastChangedAt: 0
|
|
55527
|
-
},
|
|
58039
|
+
empty: EMPTY_STATUS,
|
|
55528
58040
|
itemArray: {
|
|
55529
58041
|
path: "items",
|
|
55530
58042
|
keyField: "key",
|
|
@@ -55560,6 +58072,7 @@ reset: method(object({
|
|
|
55560
58072
|
* brush's remaining life and a dishwasher's salt are each recorded the moment
|
|
55561
58073
|
* their provider reports them; an item that appears later gets its series.
|
|
55562
58074
|
*/
|
|
58075
|
+
customize: consumablesCustomize,
|
|
55563
58076
|
history: {
|
|
55564
58077
|
fields: {},
|
|
55565
58078
|
items: {
|
|
@@ -55939,6 +58452,30 @@ var dayNightCapability = {
|
|
|
55939
58452
|
volatileStateFields: ["lastFetchedAt"]
|
|
55940
58453
|
};
|
|
55941
58454
|
/**
|
|
58455
|
+
* display-palette — the cluster's one colour table (D939).
|
|
58456
|
+
*
|
|
58457
|
+
* Hub singleton. `getPalette` reports `unknown` when the settings store
|
|
58458
|
+
* cannot be read; it does not pretend the bundled preset was stored.
|
|
58459
|
+
* `setPalette` refuses a palette that fails the ΔE / contrast rule and names
|
|
58460
|
+
* the pairs.
|
|
58461
|
+
*/
|
|
58462
|
+
var presetSummarySchema = object({
|
|
58463
|
+
id: string(),
|
|
58464
|
+
name: string(),
|
|
58465
|
+
swatches: record(string(), paletteSwatchSchema),
|
|
58466
|
+
fallbacks: array(string())
|
|
58467
|
+
});
|
|
58468
|
+
method(_void(), paletteResultSchema, {
|
|
58469
|
+
auth: "protected",
|
|
58470
|
+
role: "viewer"
|
|
58471
|
+
}), method(_void(), array(presetSummarySchema).readonly(), {
|
|
58472
|
+
auth: "protected",
|
|
58473
|
+
role: "viewer"
|
|
58474
|
+
}), method(setPaletteInputSchema, paletteReadySchema, {
|
|
58475
|
+
kind: "mutation",
|
|
58476
|
+
auth: "admin"
|
|
58477
|
+
});
|
|
58478
|
+
/**
|
|
55942
58479
|
* Generic device-level status snapshot. Auto-registered by `BaseDevice`
|
|
55943
58480
|
* for every device, regardless of provider — the kernel needs a uniform
|
|
55944
58481
|
* cap-keyed slice for the basic device flags every consumer expects to
|
|
@@ -56302,6 +58839,37 @@ var dishwasherCapability = {
|
|
|
56302
58839
|
powerOn: { kind: "boolean" }
|
|
56303
58840
|
} }
|
|
56304
58841
|
};
|
|
58842
|
+
/** Pulse override: a rising edge advances `lastPressedAt` and the press count. */
|
|
58843
|
+
var doorbellCustomize = {
|
|
58844
|
+
version: 1,
|
|
58845
|
+
targets: [{
|
|
58846
|
+
id: "pressed",
|
|
58847
|
+
cardinality: "event",
|
|
58848
|
+
shape: "pulse",
|
|
58849
|
+
vocabulary: {
|
|
58850
|
+
cap: "doorbell",
|
|
58851
|
+
eventName: "onPressed"
|
|
58852
|
+
},
|
|
58853
|
+
deviceTypes: [DeviceType.Camera],
|
|
58854
|
+
apply: "add",
|
|
58855
|
+
applyAuthority: { kind: "composition-claim" },
|
|
58856
|
+
eventName: "onPressed",
|
|
58857
|
+
edges: ["rising"],
|
|
58858
|
+
defaultEdge: "rising",
|
|
58859
|
+
timestampPath: "lastPressedAt",
|
|
58860
|
+
counterPath: "pressCountSinceStart",
|
|
58861
|
+
highWater: "composer-advance",
|
|
58862
|
+
combine: "any",
|
|
58863
|
+
debounce: {
|
|
58864
|
+
kind: "rising-edge",
|
|
58865
|
+
defaultDebounceMs: 2e3,
|
|
58866
|
+
changedAtRequired: true
|
|
58867
|
+
},
|
|
58868
|
+
sources: [{ kind: "binary" }, { kind: "switch" }],
|
|
58869
|
+
sourceReport: { status: "assignment-status" },
|
|
58870
|
+
advancedExpression: true
|
|
58871
|
+
}]
|
|
58872
|
+
};
|
|
56305
58873
|
var DoorbellStatusSchema = object({
|
|
56306
58874
|
/** Ms epoch of the last press. null = never observed since this provider started. */
|
|
56307
58875
|
lastPressedAt: number().nullable(),
|
|
@@ -56368,7 +58936,8 @@ onPressed: {
|
|
|
56368
58936
|
/**
|
|
56369
58937
|
* History (D850): none — `pressCountSinceStart` resets with the addon, so it is not a monotonic meter; presses live in the events ledger.
|
|
56370
58938
|
*/
|
|
56371
|
-
history: "none"
|
|
58939
|
+
history: "none",
|
|
58940
|
+
customize: doorbellCustomize
|
|
56372
58941
|
};
|
|
56373
58942
|
/**
|
|
56374
58943
|
* Enum-state sensor — a string value picked from a finite option set.
|
|
@@ -57240,7 +59809,10 @@ var humidifierCapability = {
|
|
|
57240
59809
|
*/
|
|
57241
59810
|
var HumiditySensorStatusSchema = object({
|
|
57242
59811
|
/** Current relative humidity, 0..100. */
|
|
57243
|
-
percent: number().min(0).max(100)
|
|
59812
|
+
percent: number().min(0).max(100).meta({
|
|
59813
|
+
unit: "%",
|
|
59814
|
+
label: "Humidity"
|
|
59815
|
+
}),
|
|
57244
59816
|
/** Ms epoch when the slice was last updated. */
|
|
57245
59817
|
lastFetchedAt: number(),
|
|
57246
59818
|
/** Live display unit from the upstream source (e.g. HA
|
|
@@ -57282,7 +59854,12 @@ var humiditySensorCapability = {
|
|
|
57282
59854
|
} } },
|
|
57283
59855
|
/** Clock fields: written, but excluded from the compare that decides
|
|
57284
59856
|
* whether persisting is worth a SQLite commit. */
|
|
57285
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
59857
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
59858
|
+
customize: {
|
|
59859
|
+
version: 1,
|
|
59860
|
+
advanced: "derive",
|
|
59861
|
+
targets: []
|
|
59862
|
+
}
|
|
57286
59863
|
};
|
|
57287
59864
|
/**
|
|
57288
59865
|
* Image display cap. Models a single still image exposed by an integration —
|
|
@@ -58764,6 +61341,38 @@ authKey: string().optional() }), object({
|
|
|
58764
61341
|
/** Human-readable error when `ok: false`. */
|
|
58765
61342
|
error: string().optional()
|
|
58766
61343
|
}), { kind: "mutation" });
|
|
61344
|
+
/** Span override: start on a rising edge, end on a fall or this timeout. */
|
|
61345
|
+
var motionCustomize = {
|
|
61346
|
+
version: 1,
|
|
61347
|
+
targets: [{
|
|
61348
|
+
id: "detected",
|
|
61349
|
+
cardinality: "event",
|
|
61350
|
+
shape: "span",
|
|
61351
|
+
vocabulary: {
|
|
61352
|
+
cap: "motion",
|
|
61353
|
+
eventName: "onMotionChanged"
|
|
61354
|
+
},
|
|
61355
|
+
deviceTypes: [DeviceType.Camera],
|
|
61356
|
+
apply: "replace",
|
|
61357
|
+
applyAuthority: {
|
|
61358
|
+
kind: "camera-sensors",
|
|
61359
|
+
timeoutField: "motionCooldownMs"
|
|
61360
|
+
},
|
|
61361
|
+
eventName: "onMotionChanged",
|
|
61362
|
+
start: "rising-edge",
|
|
61363
|
+
end: "falling-edge-or-timeout",
|
|
61364
|
+
timeoutMs: 3e4,
|
|
61365
|
+
combine: "any",
|
|
61366
|
+
sourceModes: [
|
|
61367
|
+
"in-addition",
|
|
61368
|
+
"confirm",
|
|
61369
|
+
"replace"
|
|
61370
|
+
],
|
|
61371
|
+
sources: [{ kind: "binary" }, { kind: "switch" }],
|
|
61372
|
+
sourceReport: { status: "assignment-status" },
|
|
61373
|
+
advancedExpression: false
|
|
61374
|
+
}]
|
|
61375
|
+
};
|
|
58767
61376
|
var MotionStatusSchema = object({
|
|
58768
61377
|
detected: boolean(),
|
|
58769
61378
|
/** Ms epoch of the last detected-true observation. Null if never detected. */
|
|
@@ -58903,7 +61512,8 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
|
|
|
58903
61512
|
history: { fields: { detected: {
|
|
58904
61513
|
kind: "boolean",
|
|
58905
61514
|
excludeDeviceTypes: [DeviceType.Camera]
|
|
58906
|
-
} } }
|
|
61515
|
+
} } },
|
|
61516
|
+
customize: motionCustomize
|
|
58907
61517
|
};
|
|
58908
61518
|
/**
|
|
58909
61519
|
* Motion-trigger toggle for accessory devices.
|
|
@@ -61030,9 +63640,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
|
|
|
61030
63640
|
*/
|
|
61031
63641
|
var PowerMeterStatusSchema = object({
|
|
61032
63642
|
/** Instantaneous power draw in watts. */
|
|
61033
|
-
watts: number().optional()
|
|
63643
|
+
watts: number().optional().meta({
|
|
63644
|
+
unit: "W",
|
|
63645
|
+
label: "Power"
|
|
63646
|
+
}),
|
|
61034
63647
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
61035
|
-
kwhTotal: number().optional()
|
|
63648
|
+
kwhTotal: number().optional().meta({
|
|
63649
|
+
unit: "kWh",
|
|
63650
|
+
label: "Energy"
|
|
63651
|
+
}),
|
|
61036
63652
|
/** Voltage in volts. */
|
|
61037
63653
|
volts: number().optional(),
|
|
61038
63654
|
/** Current in amperes. */
|
|
@@ -61117,7 +63733,12 @@ var powerMeterCapability = {
|
|
|
61117
63733
|
} },
|
|
61118
63734
|
/** Clock fields: written, but excluded from the compare that decides
|
|
61119
63735
|
* whether persisting is worth a SQLite commit. */
|
|
61120
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
63736
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
63737
|
+
customize: {
|
|
63738
|
+
version: 1,
|
|
63739
|
+
advanced: "derive",
|
|
63740
|
+
targets: []
|
|
63741
|
+
}
|
|
61121
63742
|
};
|
|
61122
63743
|
/**
|
|
61123
63744
|
* Presence cap. Models HA `person.*` and `device_tracker.*` entities
|
|
@@ -61539,9 +64160,9 @@ var PtzOptionsSchema = object({
|
|
|
61539
64160
|
* Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
|
|
61540
64161
|
* not one of the three cameras honours its own:
|
|
61541
64162
|
*
|
|
61542
|
-
*
|
|
61543
|
-
* 1438
|
|
61544
|
-
* 3836
|
|
64163
|
+
* 107 Camera camera Carol (reolink) preset 0 holds "stanza"
|
|
64164
|
+
* 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
|
|
64165
|
+
* 3836 Camera studio (amcrest) preset 1 holds "Preset1"
|
|
61545
64166
|
*
|
|
61546
64167
|
* So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
|
|
61547
64168
|
* and two of the three swallowed the failure in a bare `catch`. For autotrack
|
|
@@ -61777,27 +64398,120 @@ var ptzAutotrackCapability = {
|
|
|
61777
64398
|
*/
|
|
61778
64399
|
history: "none"
|
|
61779
64400
|
};
|
|
64401
|
+
var RUNNING_POWER_START_DELAY_MS = 3e4;
|
|
64402
|
+
var RUNNING_POWER_STOP_DELAY_MS = 18e4;
|
|
64403
|
+
/** Before any provider reading — all fields unknown (D933). */
|
|
64404
|
+
var RUNNING_STATE_COLD = {
|
|
64405
|
+
running: null,
|
|
64406
|
+
since: null,
|
|
64407
|
+
source: "native",
|
|
64408
|
+
phase: null,
|
|
64409
|
+
lastFetchedAt: null
|
|
64410
|
+
};
|
|
61780
64411
|
var RunningStateSourceSchema = _enum(["native", "assigned"]);
|
|
61781
64412
|
var RunningStateStatusSchema = object({
|
|
61782
64413
|
/** null = unknown — never coerced to false (D393). */
|
|
61783
64414
|
running: boolean().nullable(),
|
|
61784
64415
|
/** Epoch ms the current boolean began; null while `running` is null. */
|
|
61785
64416
|
since: number().nullable(),
|
|
61786
|
-
source: RunningStateSourceSchema,
|
|
64417
|
+
source: RunningStateSourceSchema.meta({ label: "Source" }),
|
|
61787
64418
|
phase: string().nullable(),
|
|
61788
|
-
|
|
64419
|
+
/** null until a reading has been published (D393). */
|
|
64420
|
+
lastFetchedAt: number().nullable()
|
|
61789
64421
|
});
|
|
61790
64422
|
var RunningFlipEventDataSchema = object({
|
|
61791
64423
|
deviceId: number(),
|
|
61792
64424
|
since: number().nullable(),
|
|
61793
64425
|
phase: string().nullable()
|
|
61794
64426
|
});
|
|
64427
|
+
var RUNNING_DEVICE_TYPES = Object.values(DeviceType);
|
|
64428
|
+
/** Generic Customize target for the running boolean (D936). */
|
|
64429
|
+
var runningCustomize = {
|
|
64430
|
+
version: 1,
|
|
64431
|
+
advanced: "derive",
|
|
64432
|
+
targets: [{
|
|
64433
|
+
id: "running",
|
|
64434
|
+
cardinality: "scalar",
|
|
64435
|
+
vocabulary: {
|
|
64436
|
+
cap: "running-state",
|
|
64437
|
+
stateField: "running"
|
|
64438
|
+
},
|
|
64439
|
+
deviceTypes: [
|
|
64440
|
+
DeviceType.Dishwasher,
|
|
64441
|
+
DeviceType.Vacuum,
|
|
64442
|
+
DeviceType.LawnMower,
|
|
64443
|
+
DeviceType.MediaPlayer,
|
|
64444
|
+
DeviceType.WaterHeater,
|
|
64445
|
+
DeviceType.Humidifier,
|
|
64446
|
+
DeviceType.Fan,
|
|
64447
|
+
DeviceType.Climate,
|
|
64448
|
+
DeviceType.Thermostat,
|
|
64449
|
+
DeviceType.PetFeeder
|
|
64450
|
+
],
|
|
64451
|
+
apply: "add-or-replace",
|
|
64452
|
+
path: "running",
|
|
64453
|
+
sources: [
|
|
64454
|
+
{
|
|
64455
|
+
kind: "switch",
|
|
64456
|
+
transforms: [{ kind: "identity" }]
|
|
64457
|
+
},
|
|
64458
|
+
{
|
|
64459
|
+
kind: "binary",
|
|
64460
|
+
transforms: [{ kind: "identity" }, { kind: "invert" }]
|
|
64461
|
+
},
|
|
64462
|
+
{
|
|
64463
|
+
kind: "numeric",
|
|
64464
|
+
requiredUnit: "W",
|
|
64465
|
+
transforms: [{
|
|
64466
|
+
kind: "threshold",
|
|
64467
|
+
comparisons: ["gte", "lte"],
|
|
64468
|
+
comparison: "gte",
|
|
64469
|
+
defaultThreshold: 5,
|
|
64470
|
+
defaultStartDwellMs: RUNNING_POWER_START_DELAY_MS,
|
|
64471
|
+
defaultStopDwellMs: RUNNING_POWER_STOP_DELAY_MS,
|
|
64472
|
+
thresholdUnit: "W"
|
|
64473
|
+
}]
|
|
64474
|
+
}
|
|
64475
|
+
],
|
|
64476
|
+
companions: [
|
|
64477
|
+
{
|
|
64478
|
+
kind: "constant",
|
|
64479
|
+
path: "source",
|
|
64480
|
+
value: "assigned",
|
|
64481
|
+
when: "always"
|
|
64482
|
+
},
|
|
64483
|
+
{
|
|
64484
|
+
kind: "constant",
|
|
64485
|
+
path: "phase",
|
|
64486
|
+
value: null,
|
|
64487
|
+
when: "always"
|
|
64488
|
+
},
|
|
64489
|
+
{
|
|
64490
|
+
kind: "clock",
|
|
64491
|
+
path: "lastFetchedAt",
|
|
64492
|
+
when: "always"
|
|
64493
|
+
},
|
|
64494
|
+
{
|
|
64495
|
+
kind: "transition-time",
|
|
64496
|
+
path: "since",
|
|
64497
|
+
sourceChangedAt: "prefer"
|
|
64498
|
+
}
|
|
64499
|
+
],
|
|
64500
|
+
sourceReport: {
|
|
64501
|
+
status: "assignment-status",
|
|
64502
|
+
runtimeField: "source",
|
|
64503
|
+
nativeValue: "native",
|
|
64504
|
+
assignedValue: "assigned"
|
|
64505
|
+
},
|
|
64506
|
+
advancedExpression: true
|
|
64507
|
+
}]
|
|
64508
|
+
};
|
|
61795
64509
|
var runningStateCapability = {
|
|
61796
64510
|
name: "running-state",
|
|
61797
64511
|
scope: "device",
|
|
61798
64512
|
deviceNative: true,
|
|
61799
64513
|
mode: "singleton",
|
|
61800
|
-
deviceTypes:
|
|
64514
|
+
deviceTypes: RUNNING_DEVICE_TYPES,
|
|
61801
64515
|
methods: {},
|
|
61802
64516
|
events: {
|
|
61803
64517
|
onStarted: { data: RunningFlipEventDataSchema },
|
|
@@ -61810,7 +64524,8 @@ var runningStateCapability = {
|
|
|
61810
64524
|
runtimeState: RunningStateStatusSchema,
|
|
61811
64525
|
durability: "restored",
|
|
61812
64526
|
history: { fields: { running: { kind: "boolean" } } },
|
|
61813
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
64527
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
64528
|
+
customize: runningCustomize
|
|
61814
64529
|
};
|
|
61815
64530
|
DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
|
|
61816
64531
|
kind: "mutation",
|
|
@@ -61853,7 +64568,7 @@ var RecordingAvailabilitySchema = object({
|
|
|
61853
64568
|
* would look identical. But the answer used to say nothing about that, so a
|
|
61854
64569
|
* caller asking "what can I export?" read the single preferred profile as
|
|
61855
64570
|
* the only one that exists — on this deployment every camera records `high`
|
|
61856
|
-
* AND `low`, the low tree holding 14 GB for camera
|
|
64571
|
+
* AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
|
|
61857
64572
|
* UI could not see it.
|
|
61858
64573
|
*
|
|
61859
64574
|
* Cheap: it is the same shallow directory read the profile CHOICE already
|
|
@@ -61952,7 +64667,7 @@ var RecordingSourceOptionsSchema = object({
|
|
|
61952
64667
|
* `sparse` = gaps are the absence of one, and must be drawn as such.
|
|
61953
64668
|
*
|
|
61954
64669
|
* Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
|
|
61955
|
-
* of
|
|
64670
|
+
* of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
|
|
61956
64671
|
* pair, and ours answers it per camera from `deriveRecordingMode`. */
|
|
61957
64672
|
coverage: _enum(["continuous", "sparse"]),
|
|
61958
64673
|
/** Where the playhead may be put.
|
|
@@ -62028,7 +64743,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
|
|
|
62028
64743
|
* merely discouraged (D554 amended).
|
|
62029
64744
|
*
|
|
62030
64745
|
* It was learned the expensive way on `videoclips.listClips`: measured
|
|
62031
|
-
* on the live hub 2026-09-20, device
|
|
64746
|
+
* on the live hub 2026-09-20, device 107 bound to `recorder` AND
|
|
62032
64747
|
* `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
|
|
62033
64748
|
* three from each source, merged — `device-collection-dispatch.ts`
|
|
62034
64749
|
* leaves an unpinned fan-out un-narrowed, so absence buys the union the
|
|
@@ -62629,7 +65344,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
|
|
|
62629
65344
|
* on a 10 h window holding 29,393 s of footage every range landed late by the
|
|
62630
65345
|
* gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
|
|
62631
65346
|
* the video was a uniform timelapse, and the log line reported the five ranges
|
|
62632
|
-
* that had been ASKED for (2026-08-13, export `57d14363`, camera
|
|
65347
|
+
* that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
|
|
62633
65348
|
*
|
|
62634
65349
|
* Relative and not absolute epoch, because an absolute epoch would make every
|
|
62635
65350
|
* call site responsible for the same subtraction.
|
|
@@ -63340,7 +66055,7 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
|
|
|
63340
66055
|
* which put a "Scenes" tab on one camera's detail page. That is the wrong shape
|
|
63341
66056
|
* for the thing: a scene is a standing question about the property ("is the bin
|
|
63342
66057
|
* still out"), and the operator's question is "which of my scenes have tripped",
|
|
63343
|
-
* across every camera at once — not "what does camera
|
|
66058
|
+
* across every camera at once — not "what does camera 102 think". Buried one
|
|
63344
66059
|
* camera deep it also could not be found. The surface is now a top-level admin
|
|
63345
66060
|
* page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
|
|
63346
66061
|
* picks the camera inside the create flow, the same shape Events and Faces have.
|
|
@@ -64199,7 +66914,7 @@ var streamParamsCapability = {
|
|
|
64199
66914
|
* `getSettingsUISchema()` surface.
|
|
64200
66915
|
*/
|
|
64201
66916
|
var SwitchStatusSchema = object({
|
|
64202
|
-
on: boolean(),
|
|
66917
|
+
on: boolean().meta({ label: "On" }),
|
|
64203
66918
|
/** Ms epoch of the last state change. Useful for UI "X minutes ago". */
|
|
64204
66919
|
lastChangedAt: number()
|
|
64205
66920
|
});
|
|
@@ -64258,7 +66973,12 @@ var switchCapability = {
|
|
|
64258
66973
|
label: "On",
|
|
64259
66974
|
kind: "boolean"
|
|
64260
66975
|
}
|
|
64261
|
-
}] }
|
|
66976
|
+
}] },
|
|
66977
|
+
customize: {
|
|
66978
|
+
version: 1,
|
|
66979
|
+
advanced: "derive",
|
|
66980
|
+
targets: []
|
|
66981
|
+
}
|
|
64262
66982
|
};
|
|
64263
66983
|
/** C0 controls, DEL and the C1 range: none of them belongs in a name. */
|
|
64264
66984
|
function hasControlCharacter(value) {
|
|
@@ -64854,7 +67574,10 @@ var tamperCapability = {
|
|
|
64854
67574
|
*/
|
|
64855
67575
|
var TemperatureSensorStatusSchema = object({
|
|
64856
67576
|
/** Current temperature in Celsius. */
|
|
64857
|
-
celsius: number()
|
|
67577
|
+
celsius: number().meta({
|
|
67578
|
+
unit: "°C",
|
|
67579
|
+
label: "Temperature"
|
|
67580
|
+
}),
|
|
64858
67581
|
/** Ms epoch when the slice was last updated (push or poll). */
|
|
64859
67582
|
lastFetchedAt: number(),
|
|
64860
67583
|
/** Live display unit from the upstream source (e.g. HA
|
|
@@ -64897,7 +67620,12 @@ var temperatureSensorCapability = {
|
|
|
64897
67620
|
} } },
|
|
64898
67621
|
/** Clock fields: written, but excluded from the compare that decides
|
|
64899
67622
|
* whether persisting is worth a SQLite commit. */
|
|
64900
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
67623
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
67624
|
+
customize: {
|
|
67625
|
+
version: 1,
|
|
67626
|
+
advanced: "derive",
|
|
67627
|
+
targets: []
|
|
67628
|
+
}
|
|
64901
67629
|
};
|
|
64902
67630
|
/**
|
|
64903
67631
|
* toast — system-scoped singleton capability that streams toast
|
|
@@ -66442,33 +69170,41 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
|
|
|
66442
69170
|
kind: "mutation",
|
|
66443
69171
|
auth: "admin"
|
|
66444
69172
|
});
|
|
66445
|
-
function resolveSince(running, previous,
|
|
69173
|
+
function resolveSince(running, previous, transitionAtMs, bootstrapSinceMs) {
|
|
66446
69174
|
if (running === null) return null;
|
|
66447
|
-
|
|
66448
|
-
|
|
69175
|
+
const prevRunning = previous?.running ?? null;
|
|
69176
|
+
if (prevRunning === null) return bootstrapSinceMs;
|
|
69177
|
+
if (prevRunning !== running) return transitionAtMs;
|
|
69178
|
+
return previous?.since ?? null;
|
|
66449
69179
|
}
|
|
66450
|
-
function nativeSlice(running, phase, previous,
|
|
69180
|
+
function nativeSlice(running, phase, previous, transitionAtMs, fetchedAt, bootstrapSinceMs) {
|
|
66451
69181
|
return {
|
|
66452
69182
|
running,
|
|
66453
|
-
since: resolveSince(running, previous,
|
|
69183
|
+
since: resolveSince(running, previous, transitionAtMs, bootstrapSinceMs),
|
|
66454
69184
|
source: "native",
|
|
66455
69185
|
phase: running === null ? null : phase,
|
|
66456
|
-
lastFetchedAt:
|
|
69186
|
+
lastFetchedAt: fetchedAt
|
|
66457
69187
|
};
|
|
66458
69188
|
}
|
|
66459
|
-
function runningFromVacuumState(state, previous,
|
|
66460
|
-
|
|
66461
|
-
if (state ===
|
|
66462
|
-
if (state === "
|
|
66463
|
-
return nativeSlice(false,
|
|
69189
|
+
function runningFromVacuumState(state, previous, fetchedAt, transitionAt) {
|
|
69190
|
+
const transitionAtMs = transitionAt ?? fetchedAt;
|
|
69191
|
+
if (state === null) return nativeSlice(null, null, previous, transitionAtMs, fetchedAt, null);
|
|
69192
|
+
if (state === "cleaning" || state === "returning" || state === "drying") return nativeSlice(true, state, previous, transitionAtMs, fetchedAt, null);
|
|
69193
|
+
if (state === "paused") return nativeSlice(false, "paused", previous, transitionAtMs, fetchedAt, null);
|
|
69194
|
+
return nativeSlice(false, state, previous, transitionAtMs, fetchedAt, null);
|
|
66464
69195
|
}
|
|
66465
|
-
function runningFromLawnMower(activity, previous,
|
|
66466
|
-
|
|
66467
|
-
if (activity ===
|
|
66468
|
-
if (activity === "
|
|
66469
|
-
return nativeSlice(false,
|
|
69196
|
+
function runningFromLawnMower(activity, previous, fetchedAt, transitionAt) {
|
|
69197
|
+
const transitionAtMs = transitionAt ?? fetchedAt;
|
|
69198
|
+
if (activity === null) return nativeSlice(null, null, previous, transitionAtMs, fetchedAt, null);
|
|
69199
|
+
if (activity === "mowing") return nativeSlice(true, activity, previous, transitionAtMs, fetchedAt, null);
|
|
69200
|
+
if (activity === "paused") return nativeSlice(false, "paused", previous, transitionAtMs, fetchedAt, null);
|
|
69201
|
+
return nativeSlice(false, activity, previous, transitionAtMs, fetchedAt, null);
|
|
66470
69202
|
}
|
|
66471
69203
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
69204
|
+
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;
|
|
69205
|
+
String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
|
|
69206
|
+
DeviceRole.BinarySensor, DeviceRole.MotionSensor;
|
|
69207
|
+
new Set(CAP_NAMES);
|
|
66472
69208
|
Object.freeze({
|
|
66473
69209
|
person: .5,
|
|
66474
69210
|
vehicle: .5,
|
|
@@ -67718,7 +70454,7 @@ var BaseDeviceProvider = class extends BaseAddon {
|
|
|
67718
70454
|
* A top-level persisted row with NO configuration is a leftover, not a
|
|
67719
70455
|
* device — quarantine it instead of dialling it.
|
|
67720
70456
|
*
|
|
67721
|
-
* Device
|
|
70457
|
+
* Device 105 was deleted, resurrected as a config-less shell by a write
|
|
67722
70458
|
* already in flight (D376), and then dialled at every single boot: eight
|
|
67723
70459
|
* `Failed to restore device — bounded retry scheduled` lines in one day,
|
|
67724
70460
|
* each one the same Zod refusal on `host` and `password`. The bound was
|
|
@@ -71028,6 +73764,27 @@ Object.freeze({
|
|
|
71028
73764
|
access: "create",
|
|
71029
73765
|
role: "viewer"
|
|
71030
73766
|
},
|
|
73767
|
+
"displayPalette.getPalette": {
|
|
73768
|
+
capName: "display-palette",
|
|
73769
|
+
capScope: "system",
|
|
73770
|
+
addonId: null,
|
|
73771
|
+
access: "view",
|
|
73772
|
+
role: "viewer"
|
|
73773
|
+
},
|
|
73774
|
+
"displayPalette.listPresets": {
|
|
73775
|
+
capName: "display-palette",
|
|
73776
|
+
capScope: "system",
|
|
73777
|
+
addonId: null,
|
|
73778
|
+
access: "view",
|
|
73779
|
+
role: "viewer"
|
|
73780
|
+
},
|
|
73781
|
+
"displayPalette.setPalette": {
|
|
73782
|
+
capName: "display-palette",
|
|
73783
|
+
capScope: "system",
|
|
73784
|
+
addonId: null,
|
|
73785
|
+
access: "create",
|
|
73786
|
+
role: "admin"
|
|
73787
|
+
},
|
|
71031
73788
|
"doorbell.getStatus": {
|
|
71032
73789
|
capName: "doorbell",
|
|
71033
73790
|
capScope: "device",
|
|
@@ -80945,7 +83702,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
80945
83702
|
state: [{
|
|
80946
83703
|
kind: "boolean",
|
|
80947
83704
|
field: "on",
|
|
80948
|
-
label: t("
|
|
83705
|
+
label: t("On", "Acceso"),
|
|
80949
83706
|
whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
|
|
80950
83707
|
whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
|
|
80951
83708
|
icon: "toggle-right"
|
|
@@ -81484,6 +84241,7 @@ var SYSTEM_CAP_VOCABULARY = {
|
|
|
81484
84241
|
"device-provider": system(INTERNAL),
|
|
81485
84242
|
"device-removal-hook": system(INTERNAL),
|
|
81486
84243
|
"device-state": system("the runtime-state mirror every trigger already reads through"),
|
|
84244
|
+
"display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
|
|
81487
84245
|
"embedding-encoder": system(ML),
|
|
81488
84246
|
"face-gallery": system("the face gallery — curated on its own page"),
|
|
81489
84247
|
"failure-contribution": system(INTERNAL),
|
|
@@ -84368,6 +87126,99 @@ Object.freeze({
|
|
|
84368
87126
|
"smtp-provider": "email"
|
|
84369
87127
|
});
|
|
84370
87128
|
DeviceType.Camera;
|
|
87129
|
+
/**
|
|
87130
|
+
* A saved Customize assignment (D936). The schema is the type: callers use
|
|
87131
|
+
* `z.infer`, they do not restate the shape.
|
|
87132
|
+
*/
|
|
87133
|
+
var OverrideSourceSchema = object({
|
|
87134
|
+
addonId: string().min(1),
|
|
87135
|
+
stableId: string().min(1),
|
|
87136
|
+
cap: string().min(1),
|
|
87137
|
+
fieldPath: string().min(1)
|
|
87138
|
+
});
|
|
87139
|
+
var CustomizeTransformDraftSchema = discriminatedUnion("kind", [
|
|
87140
|
+
object({ kind: literal("identity") }),
|
|
87141
|
+
object({ kind: literal("invert") }),
|
|
87142
|
+
object({
|
|
87143
|
+
kind: literal("threshold"),
|
|
87144
|
+
comparison: _enum(["gte", "lte"]),
|
|
87145
|
+
threshold: number(),
|
|
87146
|
+
startDwellMs: number().nonnegative(),
|
|
87147
|
+
stopDwellMs: number().nonnegative()
|
|
87148
|
+
}),
|
|
87149
|
+
object({
|
|
87150
|
+
kind: literal("linear"),
|
|
87151
|
+
scale: number(),
|
|
87152
|
+
offset: number(),
|
|
87153
|
+
clampMin: number().optional(),
|
|
87154
|
+
clampMax: number().optional()
|
|
87155
|
+
}),
|
|
87156
|
+
object({
|
|
87157
|
+
kind: literal("enum-map"),
|
|
87158
|
+
mapping: record(string(), string().nullable())
|
|
87159
|
+
}),
|
|
87160
|
+
object({ kind: literal("number") })
|
|
87161
|
+
]);
|
|
87162
|
+
var ScalarOverrideDraftSchema = object({
|
|
87163
|
+
kind: literal("scalar"),
|
|
87164
|
+
cap: string().min(1),
|
|
87165
|
+
targetId: string().min(1),
|
|
87166
|
+
source: OverrideSourceSchema,
|
|
87167
|
+
transform: CustomizeTransformDraftSchema
|
|
87168
|
+
});
|
|
87169
|
+
var KeyedArrayOverrideDraftSchema = object({
|
|
87170
|
+
kind: literal("keyedArray"),
|
|
87171
|
+
cap: string().min(1),
|
|
87172
|
+
targetId: string().min(1),
|
|
87173
|
+
key: string().min(1),
|
|
87174
|
+
label: string().min(1),
|
|
87175
|
+
fieldPath: string().min(1),
|
|
87176
|
+
source: OverrideSourceSchema,
|
|
87177
|
+
transform: CustomizeTransformDraftSchema
|
|
87178
|
+
});
|
|
87179
|
+
var PulseOverrideDraftSchema = object({
|
|
87180
|
+
kind: literal("pulse"),
|
|
87181
|
+
cap: string().min(1),
|
|
87182
|
+
targetId: string().min(1),
|
|
87183
|
+
enabled: boolean(),
|
|
87184
|
+
debounceMs: number().nonnegative(),
|
|
87185
|
+
edges: array(_enum([
|
|
87186
|
+
"rising",
|
|
87187
|
+
"button",
|
|
87188
|
+
"native-event"
|
|
87189
|
+
])).min(1).optional(),
|
|
87190
|
+
sources: array(OverrideSourceSchema).min(1)
|
|
87191
|
+
});
|
|
87192
|
+
var SpanSourceDraftSchema = OverrideSourceSchema.extend({ mode: _enum([
|
|
87193
|
+
"in-addition",
|
|
87194
|
+
"confirm",
|
|
87195
|
+
"replace"
|
|
87196
|
+
]).optional() });
|
|
87197
|
+
discriminatedUnion("kind", [
|
|
87198
|
+
ScalarOverrideDraftSchema,
|
|
87199
|
+
KeyedArrayOverrideDraftSchema,
|
|
87200
|
+
PulseOverrideDraftSchema,
|
|
87201
|
+
object({
|
|
87202
|
+
kind: literal("span"),
|
|
87203
|
+
cap: string().min(1),
|
|
87204
|
+
targetId: string().min(1),
|
|
87205
|
+
timeoutMs: number().nonnegative(),
|
|
87206
|
+
cooldownMs: number().nonnegative().optional(),
|
|
87207
|
+
sources: array(SpanSourceDraftSchema)
|
|
87208
|
+
})
|
|
87209
|
+
]);
|
|
87210
|
+
object({
|
|
87211
|
+
targetId: string().min(1),
|
|
87212
|
+
configured: boolean(),
|
|
87213
|
+
source: _enum(["native", "assigned"]),
|
|
87214
|
+
state: _enum([
|
|
87215
|
+
"active",
|
|
87216
|
+
"stale",
|
|
87217
|
+
"released",
|
|
87218
|
+
"unavailable"
|
|
87219
|
+
]),
|
|
87220
|
+
reason: string().nullable()
|
|
87221
|
+
});
|
|
84371
87222
|
var G711_SCALE_CORRECTION_DB = {
|
|
84372
87223
|
PCMU: 20 * Math.log10(4),
|
|
84373
87224
|
PCMA: 20 * Math.log10(8)
|
|
@@ -84740,7 +87591,7 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
84740
87591
|
{
|
|
84741
87592
|
name: "summaryStreams",
|
|
84742
87593
|
label: "Summary: streams offline",
|
|
84743
|
-
example: "
|
|
87594
|
+
example: "Front door (high) — since 06:40",
|
|
84744
87595
|
kinds: ["stream-offline", "stream-online"]
|
|
84745
87596
|
},
|
|
84746
87597
|
{
|
|
@@ -84758,13 +87609,13 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
84758
87609
|
{
|
|
84759
87610
|
name: "summaryDetection",
|
|
84760
87611
|
label: "Summary: cameras detecting nothing",
|
|
84761
|
-
example: "
|
|
87612
|
+
example: "Front door — since 05:10",
|
|
84762
87613
|
kinds: ["detection-blind"]
|
|
84763
87614
|
},
|
|
84764
87615
|
{
|
|
84765
87616
|
name: "summaryNodes",
|
|
84766
87617
|
label: "Summary: nodes",
|
|
84767
|
-
example: "
|
|
87618
|
+
example: "agent-a — offline since 03:00",
|
|
84768
87619
|
kinds: [
|
|
84769
87620
|
"node-offline",
|
|
84770
87621
|
"node-online",
|
|
@@ -188491,13 +191342,6 @@ var MowerChargingEdge = class {
|
|
|
188491
191342
|
//#region src/devices/dreame-mower-device.ts
|
|
188492
191343
|
var CAP_NAME$9 = "lawn-mower-control";
|
|
188493
191344
|
var RUNNING_CAP$1 = "running-state";
|
|
188494
|
-
var RUNNING_COLD$1 = {
|
|
188495
|
-
running: null,
|
|
188496
|
-
since: null,
|
|
188497
|
-
source: "native",
|
|
188498
|
-
phase: null,
|
|
188499
|
-
lastFetchedAt: 0
|
|
188500
|
-
};
|
|
188501
191345
|
/**
|
|
188502
191346
|
* The CMS consumable custom-action only answers while the mower is momentarily
|
|
188503
191347
|
* awake and ACTIVELY charging — which it is the instant it docks with a depleted
|
|
@@ -188582,12 +191426,9 @@ var DreameMowerDevice = class extends DreameChildDevice {
|
|
|
188582
191426
|
await this.requireMower().dock();
|
|
188583
191427
|
}
|
|
188584
191428
|
});
|
|
188585
|
-
this.ctx.registerNativeCap(runningStateCapability, { getStatus: async () => this.runtimeState.getCapState(RUNNING_CAP$1) ??
|
|
191429
|
+
this.ctx.registerNativeCap(runningStateCapability, { getStatus: async () => this.runtimeState.getCapState(RUNNING_CAP$1) ?? RUNNING_STATE_COLD });
|
|
188586
191430
|
this.runtimeState.setCapState(CAP_NAME$9, COLD_START);
|
|
188587
|
-
this.runtimeState.setCapState(RUNNING_CAP$1,
|
|
188588
|
-
...RUNNING_COLD$1,
|
|
188589
|
-
lastFetchedAt: Date.now()
|
|
188590
|
-
});
|
|
191431
|
+
this.runtimeState.setCapState(RUNNING_CAP$1, RUNNING_STATE_COLD);
|
|
188591
191432
|
this.ctx.registerNativeCap(consumablesCapability, {
|
|
188592
191433
|
getStatus: async () => this.runtimeState.getCapState("consumables") ?? CONSUMABLES_COLD_START,
|
|
188593
191434
|
reset: async ({ key }) => {
|
|
@@ -188650,9 +191491,10 @@ var DreameMowerDevice = class extends DreameChildDevice {
|
|
|
188650
191491
|
lastChangedAt: Date.now()
|
|
188651
191492
|
};
|
|
188652
191493
|
this.runtimeState.setCapState(CAP_NAME$9, slice);
|
|
191494
|
+
const fetchedAt = Date.now();
|
|
188653
191495
|
const previous = this.runtimeState.getCapState(RUNNING_CAP$1);
|
|
188654
191496
|
const activityForRunning = status === null ? null : mapMowerStatusToActivity(status);
|
|
188655
|
-
this.runtimeState.setCapState(RUNNING_CAP$1, runningFromLawnMower(activityForRunning, previous, slice.lastChangedAt));
|
|
191497
|
+
this.runtimeState.setCapState(RUNNING_CAP$1, runningFromLawnMower(activityForRunning, previous, fetchedAt, slice.lastChangedAt));
|
|
188656
191498
|
if (this.#chargingEdge.observe(status, mower.charging)) this.#consumables.refresh("charging");
|
|
188657
191499
|
}
|
|
188658
191500
|
/** The live typed mower handle, or throw a clear error when disconnected. */
|
|
@@ -189400,13 +192242,6 @@ function resetMeta(result) {
|
|
|
189400
192242
|
//#region src/devices/dreame-vacuum-device.ts
|
|
189401
192243
|
var CAP_NAME$1 = "vacuum-control";
|
|
189402
192244
|
var RUNNING_CAP = "running-state";
|
|
189403
|
-
var RUNNING_COLD = {
|
|
189404
|
-
running: null,
|
|
189405
|
-
since: null,
|
|
189406
|
-
source: "native",
|
|
189407
|
-
phase: null,
|
|
189408
|
-
lastFetchedAt: 0
|
|
189409
|
-
};
|
|
189410
192245
|
var CONTROL_COLD_START = {
|
|
189411
192246
|
state: "idle",
|
|
189412
192247
|
batteryLevel: null,
|
|
@@ -189537,10 +192372,7 @@ var DreameVacuumDevice = class extends DreameChildDevice {
|
|
|
189537
192372
|
});
|
|
189538
192373
|
this.registerRunningCap();
|
|
189539
192374
|
this.runtimeState.setCapState(CAP_NAME$1, CONTROL_COLD_START);
|
|
189540
|
-
this.runtimeState.setCapState(RUNNING_CAP,
|
|
189541
|
-
...RUNNING_COLD,
|
|
189542
|
-
lastFetchedAt: Date.now()
|
|
189543
|
-
});
|
|
192375
|
+
this.runtimeState.setCapState(RUNNING_CAP, RUNNING_STATE_COLD);
|
|
189544
192376
|
this.registerConsumablesCap();
|
|
189545
192377
|
}
|
|
189546
192378
|
/**
|
|
@@ -189576,7 +192408,7 @@ var DreameVacuumDevice = class extends DreameChildDevice {
|
|
|
189576
192408
|
};
|
|
189577
192409
|
const toWrite = nextVacuumControlSlice(this.runtimeState.getCapState(CAP_NAME$1), controlSlice);
|
|
189578
192410
|
if (toWrite !== null) this.runtimeState.setCapState(CAP_NAME$1, toWrite);
|
|
189579
|
-
this.publishRunningSlice(miotStatus, controlSlice.lastChangedAt);
|
|
192411
|
+
this.publishRunningSlice(miotStatus, Date.now(), controlSlice.lastChangedAt);
|
|
189580
192412
|
this.consumables.onPush(controlSlice.state, tanks);
|
|
189581
192413
|
}
|
|
189582
192414
|
/**
|
|
@@ -189601,11 +192433,11 @@ var DreameVacuumDevice = class extends DreameChildDevice {
|
|
|
189601
192433
|
};
|
|
189602
192434
|
}
|
|
189603
192435
|
registerRunningCap() {
|
|
189604
|
-
this.ctx.registerNativeCap(runningStateCapability, { getStatus: async () => this.runtimeState.getCapState(RUNNING_CAP) ??
|
|
192436
|
+
this.ctx.registerNativeCap(runningStateCapability, { getStatus: async () => this.runtimeState.getCapState(RUNNING_CAP) ?? RUNNING_STATE_COLD });
|
|
189605
192437
|
}
|
|
189606
|
-
publishRunningSlice(miotStatus,
|
|
192438
|
+
publishRunningSlice(miotStatus, fetchedAt, transitionAt) {
|
|
189607
192439
|
const previous = this.runtimeState.getCapState(RUNNING_CAP);
|
|
189608
|
-
const next = runningFromVacuumState(miotStatus === null ? null : mapMiotStateToVacuumState(miotStatus), previous,
|
|
192440
|
+
const next = runningFromVacuumState(miotStatus === null ? null : mapMiotStateToVacuumState(miotStatus), previous, fetchedAt, transitionAt);
|
|
189609
192441
|
this.runtimeState.setCapState(RUNNING_CAP, next);
|
|
189610
192442
|
}
|
|
189611
192443
|
/** The live typed vacuum handle, or throw a clear error when disconnected. */
|