@camstack/addon-auth 1.2.168 → 1.2.169
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/CHANGELOG.md +12 -0
- package/README.md +22 -0
- package/dist/{dist-BshY4Vgx.js → dist-BNIIRoqG.js} +856 -432
- package/dist/{dist-BbOGRpqM.mjs → dist-D_I2DLb2.mjs} +856 -432
- package/dist/oidc/auth-oidc.addon.js +1 -1
- package/dist/oidc/auth-oidc.addon.mjs +1 -1
- package/dist/webauthn/_stub.js +1 -1
- package/dist/webauthn/{_virtual_mf-localSharedImportMap___mfe_internal__addon_auth_webauthn_widgets-CPAnDMEb.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_auth_webauthn_widgets-B9Die94z.mjs} +2 -2
- package/dist/webauthn/_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DIQm_Kjt.mjs +26 -0
- package/dist/webauthn/auth-webauthn.addon.js +1 -1
- package/dist/webauthn/auth-webauthn.addon.mjs +1 -1
- package/dist/webauthn/{hostInit-D1o9L6oS.mjs → hostInit-BgRutR_C.mjs} +2 -2
- package/dist/webauthn/remoteEntry.js +1 -1
- package/package.json +4 -2
- package/dist/webauthn/_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CNflp3NL.mjs +0 -26
|
@@ -32,7 +32,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
32
32
|
}) : target, mod));
|
|
33
33
|
var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
34
34
|
require("node:crypto");
|
|
35
|
-
//#region ../types/dist/event-category-
|
|
35
|
+
//#region ../types/dist/event-category-CT-hz5Rb.mjs
|
|
36
36
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
37
37
|
EventCategory["SystemBoot"] = "system.boot";
|
|
38
38
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -358,6 +358,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
358
358
|
/** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
|
|
359
359
|
EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
|
|
360
360
|
/**
|
|
361
|
+
* A camera's package LLM confirm has failed closed three times in a row
|
|
362
|
+
* (D931, 2026-10-26). One edge per camera until
|
|
363
|
+
* {@link PipelinePackageLlmAnswered}.
|
|
364
|
+
*/
|
|
365
|
+
EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
|
|
366
|
+
/** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
|
|
367
|
+
EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
|
|
368
|
+
/**
|
|
361
369
|
* Per-camera pipeline config was mutated by the orchestrator
|
|
362
370
|
* (a settings change via `setAgentInferenceDevices` /
|
|
363
371
|
* `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
|
|
@@ -5600,7 +5608,7 @@ var ZodIssueCode = {
|
|
|
5600
5608
|
var ZodFirstPartyTypeKind;
|
|
5601
5609
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5602
5610
|
//#endregion
|
|
5603
|
-
//#region ../types/dist/sleep-
|
|
5611
|
+
//#region ../types/dist/sleep-bykKrTgu.mjs
|
|
5604
5612
|
/**
|
|
5605
5613
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5606
5614
|
* window to float samples (D455).
|
|
@@ -8328,6 +8336,99 @@ function defineEntryKind(name, spec) {
|
|
|
8328
8336
|
if (defined === void 0) throw new DeclarationRefusedError(`entry kind "${name}" was not built`);
|
|
8329
8337
|
return defined;
|
|
8330
8338
|
}
|
|
8339
|
+
var READING_QUANTITIES = [
|
|
8340
|
+
"temperature",
|
|
8341
|
+
"pressure",
|
|
8342
|
+
"speed",
|
|
8343
|
+
"precipitation",
|
|
8344
|
+
"precipitation-rate",
|
|
8345
|
+
"length",
|
|
8346
|
+
"area",
|
|
8347
|
+
"illuminance",
|
|
8348
|
+
"irradiance",
|
|
8349
|
+
"power",
|
|
8350
|
+
"energy",
|
|
8351
|
+
"voltage",
|
|
8352
|
+
"current",
|
|
8353
|
+
"apparent-power",
|
|
8354
|
+
"humidity",
|
|
8355
|
+
"percentage",
|
|
8356
|
+
"concentration-volume",
|
|
8357
|
+
"concentration-mass",
|
|
8358
|
+
"concentration-ppb",
|
|
8359
|
+
"volume",
|
|
8360
|
+
"duration",
|
|
8361
|
+
"duration-ms",
|
|
8362
|
+
"information",
|
|
8363
|
+
"sound-level",
|
|
8364
|
+
"signal-level",
|
|
8365
|
+
"colour-temperature",
|
|
8366
|
+
"angle",
|
|
8367
|
+
"bitrate",
|
|
8368
|
+
"rate",
|
|
8369
|
+
"mass",
|
|
8370
|
+
"index",
|
|
8371
|
+
"ratio",
|
|
8372
|
+
"count",
|
|
8373
|
+
"none",
|
|
8374
|
+
"device"
|
|
8375
|
+
];
|
|
8376
|
+
var ReadingQuantitySchema = _enum(READING_QUANTITIES);
|
|
8377
|
+
new Set(READING_QUANTITIES);
|
|
8378
|
+
/**
|
|
8379
|
+
* Stored unit symbol for a quantity. `none` means the number is dimensionless
|
|
8380
|
+
* (or an index / ratio / count). `device` means the cap has no single unit.
|
|
8381
|
+
*/
|
|
8382
|
+
var QUANTITY_BASE = {
|
|
8383
|
+
temperature: "°C",
|
|
8384
|
+
pressure: "hPa",
|
|
8385
|
+
speed: "m/s",
|
|
8386
|
+
precipitation: "mm",
|
|
8387
|
+
"precipitation-rate": "mm/h",
|
|
8388
|
+
length: "m",
|
|
8389
|
+
area: "m²",
|
|
8390
|
+
illuminance: "lx",
|
|
8391
|
+
irradiance: "W/m²",
|
|
8392
|
+
power: "W",
|
|
8393
|
+
energy: "kWh",
|
|
8394
|
+
voltage: "V",
|
|
8395
|
+
current: "A",
|
|
8396
|
+
"apparent-power": "VA",
|
|
8397
|
+
humidity: "%",
|
|
8398
|
+
percentage: "%",
|
|
8399
|
+
"concentration-volume": "ppm",
|
|
8400
|
+
"concentration-mass": "µg/m³",
|
|
8401
|
+
"concentration-ppb": "ppb",
|
|
8402
|
+
volume: "L",
|
|
8403
|
+
duration: "s",
|
|
8404
|
+
"duration-ms": "ms",
|
|
8405
|
+
information: "B",
|
|
8406
|
+
"sound-level": "dBFS",
|
|
8407
|
+
"signal-level": "dBm",
|
|
8408
|
+
"colour-temperature": "mired",
|
|
8409
|
+
angle: "°",
|
|
8410
|
+
bitrate: "kbps",
|
|
8411
|
+
rate: "fps",
|
|
8412
|
+
mass: "kg",
|
|
8413
|
+
index: "none",
|
|
8414
|
+
ratio: "none",
|
|
8415
|
+
count: "none",
|
|
8416
|
+
none: "none",
|
|
8417
|
+
device: "device"
|
|
8418
|
+
};
|
|
8419
|
+
/** The stored unit, or `undefined` when the quantity has no unit symbol. */
|
|
8420
|
+
function baseUnitOf(quantity) {
|
|
8421
|
+
const symbol = QUANTITY_BASE[quantity];
|
|
8422
|
+
if (symbol === "none" || symbol === "device") return void 0;
|
|
8423
|
+
return symbol;
|
|
8424
|
+
}
|
|
8425
|
+
function readingMeta(quantity, extras) {
|
|
8426
|
+
return {
|
|
8427
|
+
quantity,
|
|
8428
|
+
...extras?.precision !== void 0 ? { precision: extras.precision } : {},
|
|
8429
|
+
...extras?.label !== void 0 ? { label: extras.label } : {}
|
|
8430
|
+
};
|
|
8431
|
+
}
|
|
8331
8432
|
/** Shared Zod schemas used across streaming capabilities. */
|
|
8332
8433
|
var CamProfileSchema = _enum([
|
|
8333
8434
|
"high",
|
|
@@ -8355,8 +8456,8 @@ var CamStreamKindSchema = _enum([
|
|
|
8355
8456
|
"derived"
|
|
8356
8457
|
]);
|
|
8357
8458
|
var CamStreamResolutionSchema = object({
|
|
8358
|
-
width: number().int().positive(),
|
|
8359
|
-
height: number().int().positive()
|
|
8459
|
+
width: number().int().positive().meta(readingMeta("none")),
|
|
8460
|
+
height: number().int().positive().meta(readingMeta("none"))
|
|
8360
8461
|
});
|
|
8361
8462
|
var CameraStreamSchema = object({
|
|
8362
8463
|
/** Stable, provider-assigned id unique within the (deviceId) scope. */
|
|
@@ -8870,6 +8971,8 @@ var CAP_NAMES = Object.freeze([
|
|
|
8870
8971
|
"filesystem-browse",
|
|
8871
8972
|
"flood",
|
|
8872
8973
|
"gas",
|
|
8974
|
+
"group-commands",
|
|
8975
|
+
"group-status",
|
|
8873
8976
|
"heating-valve",
|
|
8874
8977
|
"humidifier",
|
|
8875
8978
|
"humidity-sensor",
|
|
@@ -8999,14 +9102,6 @@ Object.freeze({
|
|
|
8999
9102
|
{
|
|
9000
9103
|
"path": "aqi",
|
|
9001
9104
|
"valueType": "number"
|
|
9002
|
-
},
|
|
9003
|
-
{
|
|
9004
|
-
"path": "unit",
|
|
9005
|
-
"valueType": "string"
|
|
9006
|
-
},
|
|
9007
|
-
{
|
|
9008
|
-
"path": "precision",
|
|
9009
|
-
"valueType": "number"
|
|
9010
9105
|
}
|
|
9011
9106
|
],
|
|
9012
9107
|
"alarm-panel": [
|
|
@@ -9042,20 +9137,10 @@ Object.freeze({
|
|
|
9042
9137
|
"valueType": "boolean"
|
|
9043
9138
|
}
|
|
9044
9139
|
],
|
|
9045
|
-
"ambient-light-sensor": [
|
|
9046
|
-
|
|
9047
|
-
|
|
9048
|
-
|
|
9049
|
-
},
|
|
9050
|
-
{
|
|
9051
|
-
"path": "unit",
|
|
9052
|
-
"valueType": "string"
|
|
9053
|
-
},
|
|
9054
|
-
{
|
|
9055
|
-
"path": "precision",
|
|
9056
|
-
"valueType": "number"
|
|
9057
|
-
}
|
|
9058
|
-
],
|
|
9140
|
+
"ambient-light-sensor": [{
|
|
9141
|
+
"path": "lux",
|
|
9142
|
+
"valueType": "number"
|
|
9143
|
+
}],
|
|
9059
9144
|
"audio-metrics": [
|
|
9060
9145
|
{
|
|
9061
9146
|
"path": "ts",
|
|
@@ -9135,6 +9220,10 @@ Object.freeze({
|
|
|
9135
9220
|
"path": "lastUpdated",
|
|
9136
9221
|
"valueType": "number"
|
|
9137
9222
|
},
|
|
9223
|
+
{
|
|
9224
|
+
"path": "volts",
|
|
9225
|
+
"valueType": "number"
|
|
9226
|
+
},
|
|
9138
9227
|
{
|
|
9139
9228
|
"path": "lastContactAt",
|
|
9140
9229
|
"valueType": "number"
|
|
@@ -9377,10 +9466,6 @@ Object.freeze({
|
|
|
9377
9466
|
"datetime"
|
|
9378
9467
|
]
|
|
9379
9468
|
},
|
|
9380
|
-
{
|
|
9381
|
-
"path": "unit",
|
|
9382
|
-
"valueType": "string"
|
|
9383
|
-
},
|
|
9384
9469
|
{
|
|
9385
9470
|
"path": "min",
|
|
9386
9471
|
"valueType": "number"
|
|
@@ -9392,19 +9477,6 @@ Object.freeze({
|
|
|
9392
9477
|
{
|
|
9393
9478
|
"path": "step",
|
|
9394
9479
|
"valueType": "number"
|
|
9395
|
-
},
|
|
9396
|
-
{
|
|
9397
|
-
"path": "precision",
|
|
9398
|
-
"valueType": "number"
|
|
9399
|
-
},
|
|
9400
|
-
{
|
|
9401
|
-
"path": "format",
|
|
9402
|
-
"valueType": "enum",
|
|
9403
|
-
"enumValues": [
|
|
9404
|
-
"date",
|
|
9405
|
-
"time",
|
|
9406
|
-
"datetime"
|
|
9407
|
-
]
|
|
9408
9480
|
}
|
|
9409
9481
|
],
|
|
9410
9482
|
"cover": [
|
|
@@ -9645,13 +9717,8 @@ Object.freeze({
|
|
|
9645
9717
|
"path": "value",
|
|
9646
9718
|
"valueType": "string"
|
|
9647
9719
|
}, {
|
|
9648
|
-
"path": "
|
|
9649
|
-
"valueType": "
|
|
9650
|
-
"enumValues": [
|
|
9651
|
-
"date",
|
|
9652
|
-
"time",
|
|
9653
|
-
"datetime"
|
|
9654
|
-
]
|
|
9720
|
+
"path": "timestamp",
|
|
9721
|
+
"valueType": "boolean"
|
|
9655
9722
|
}],
|
|
9656
9723
|
"event-emitter": [
|
|
9657
9724
|
{
|
|
@@ -9724,6 +9791,20 @@ Object.freeze({
|
|
|
9724
9791
|
"path": "detected",
|
|
9725
9792
|
"valueType": "boolean"
|
|
9726
9793
|
}],
|
|
9794
|
+
"group-status": [
|
|
9795
|
+
{
|
|
9796
|
+
"path": "included",
|
|
9797
|
+
"valueType": "number"
|
|
9798
|
+
},
|
|
9799
|
+
{
|
|
9800
|
+
"path": "excluded",
|
|
9801
|
+
"valueType": "number"
|
|
9802
|
+
},
|
|
9803
|
+
{
|
|
9804
|
+
"path": "total",
|
|
9805
|
+
"valueType": "number"
|
|
9806
|
+
}
|
|
9807
|
+
],
|
|
9727
9808
|
"heating-valve": [{
|
|
9728
9809
|
"path": "position",
|
|
9729
9810
|
"valueType": "number"
|
|
@@ -9758,20 +9839,10 @@ Object.freeze({
|
|
|
9758
9839
|
"valueType": "number"
|
|
9759
9840
|
}
|
|
9760
9841
|
],
|
|
9761
|
-
"humidity-sensor": [
|
|
9762
|
-
|
|
9763
|
-
|
|
9764
|
-
|
|
9765
|
-
},
|
|
9766
|
-
{
|
|
9767
|
-
"path": "unit",
|
|
9768
|
-
"valueType": "string"
|
|
9769
|
-
},
|
|
9770
|
-
{
|
|
9771
|
-
"path": "precision",
|
|
9772
|
-
"valueType": "number"
|
|
9773
|
-
}
|
|
9774
|
-
],
|
|
9842
|
+
"humidity-sensor": [{
|
|
9843
|
+
"path": "percent",
|
|
9844
|
+
"valueType": "number"
|
|
9845
|
+
}],
|
|
9775
9846
|
"image": [{
|
|
9776
9847
|
"path": "url",
|
|
9777
9848
|
"valueType": "string"
|
|
@@ -10110,20 +10181,10 @@ Object.freeze({
|
|
|
10110
10181
|
"valueType": "boolean"
|
|
10111
10182
|
}
|
|
10112
10183
|
],
|
|
10113
|
-
"numeric-sensor": [
|
|
10114
|
-
|
|
10115
|
-
|
|
10116
|
-
|
|
10117
|
-
},
|
|
10118
|
-
{
|
|
10119
|
-
"path": "unit",
|
|
10120
|
-
"valueType": "string"
|
|
10121
|
-
},
|
|
10122
|
-
{
|
|
10123
|
-
"path": "precision",
|
|
10124
|
-
"valueType": "number"
|
|
10125
|
-
}
|
|
10126
|
-
],
|
|
10184
|
+
"numeric-sensor": [{
|
|
10185
|
+
"path": "value",
|
|
10186
|
+
"valueType": "number"
|
|
10187
|
+
}],
|
|
10127
10188
|
"pet-feeder": [
|
|
10128
10189
|
{
|
|
10129
10190
|
"path": "foodLevel",
|
|
@@ -10215,14 +10276,6 @@ Object.freeze({
|
|
|
10215
10276
|
{
|
|
10216
10277
|
"path": "powerFactor",
|
|
10217
10278
|
"valueType": "number"
|
|
10218
|
-
},
|
|
10219
|
-
{
|
|
10220
|
-
"path": "unit",
|
|
10221
|
-
"valueType": "string"
|
|
10222
|
-
},
|
|
10223
|
-
{
|
|
10224
|
-
"path": "precision",
|
|
10225
|
-
"valueType": "number"
|
|
10226
10279
|
}
|
|
10227
10280
|
],
|
|
10228
10281
|
"presence": [
|
|
@@ -10251,20 +10304,10 @@ Object.freeze({
|
|
|
10251
10304
|
"valueType": "number"
|
|
10252
10305
|
}
|
|
10253
10306
|
],
|
|
10254
|
-
"pressure-sensor": [
|
|
10255
|
-
|
|
10256
|
-
|
|
10257
|
-
|
|
10258
|
-
},
|
|
10259
|
-
{
|
|
10260
|
-
"path": "unit",
|
|
10261
|
-
"valueType": "string"
|
|
10262
|
-
},
|
|
10263
|
-
{
|
|
10264
|
-
"path": "precision",
|
|
10265
|
-
"valueType": "number"
|
|
10266
|
-
}
|
|
10267
|
-
],
|
|
10307
|
+
"pressure-sensor": [{
|
|
10308
|
+
"path": "hpa",
|
|
10309
|
+
"valueType": "number"
|
|
10310
|
+
}],
|
|
10268
10311
|
"privacy-mask": [{
|
|
10269
10312
|
"path": "enabled",
|
|
10270
10313
|
"valueType": "boolean"
|
|
@@ -10575,20 +10618,10 @@ Object.freeze({
|
|
|
10575
10618
|
"path": "tampered",
|
|
10576
10619
|
"valueType": "boolean"
|
|
10577
10620
|
}],
|
|
10578
|
-
"temperature-sensor": [
|
|
10579
|
-
|
|
10580
|
-
|
|
10581
|
-
|
|
10582
|
-
},
|
|
10583
|
-
{
|
|
10584
|
-
"path": "unit",
|
|
10585
|
-
"valueType": "string"
|
|
10586
|
-
},
|
|
10587
|
-
{
|
|
10588
|
-
"path": "precision",
|
|
10589
|
-
"valueType": "number"
|
|
10590
|
-
}
|
|
10591
|
-
],
|
|
10621
|
+
"temperature-sensor": [{
|
|
10622
|
+
"path": "celsius",
|
|
10623
|
+
"valueType": "number"
|
|
10624
|
+
}],
|
|
10592
10625
|
"update": [
|
|
10593
10626
|
{
|
|
10594
10627
|
"path": "currentVersion",
|
|
@@ -10699,10 +10732,6 @@ Object.freeze({
|
|
|
10699
10732
|
"path": "temperature",
|
|
10700
10733
|
"valueType": "number"
|
|
10701
10734
|
},
|
|
10702
|
-
{
|
|
10703
|
-
"path": "temperatureUnit",
|
|
10704
|
-
"valueType": "string"
|
|
10705
|
-
},
|
|
10706
10735
|
{
|
|
10707
10736
|
"path": "humidity",
|
|
10708
10737
|
"valueType": "number"
|
|
@@ -10711,18 +10740,10 @@ Object.freeze({
|
|
|
10711
10740
|
"path": "pressure",
|
|
10712
10741
|
"valueType": "number"
|
|
10713
10742
|
},
|
|
10714
|
-
{
|
|
10715
|
-
"path": "pressureUnit",
|
|
10716
|
-
"valueType": "string"
|
|
10717
|
-
},
|
|
10718
10743
|
{
|
|
10719
10744
|
"path": "windSpeed",
|
|
10720
10745
|
"valueType": "number"
|
|
10721
10746
|
},
|
|
10722
|
-
{
|
|
10723
|
-
"path": "windSpeedUnit",
|
|
10724
|
-
"valueType": "string"
|
|
10725
|
-
},
|
|
10726
10747
|
{
|
|
10727
10748
|
"path": "windBearing",
|
|
10728
10749
|
"valueType": "number"
|
|
@@ -11125,7 +11146,7 @@ function errMsg(err) {
|
|
|
11125
11146
|
return String(err);
|
|
11126
11147
|
}
|
|
11127
11148
|
//#endregion
|
|
11128
|
-
//#region ../types/dist/composition-
|
|
11149
|
+
//#region ../types/dist/composition-OhpuespA.mjs
|
|
11129
11150
|
/**
|
|
11130
11151
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
11131
11152
|
*
|
|
@@ -11880,15 +11901,74 @@ function validateExpressionSource(src) {
|
|
|
11880
11901
|
}
|
|
11881
11902
|
return null;
|
|
11882
11903
|
}
|
|
11883
|
-
/**
|
|
11884
|
-
|
|
11885
|
-
|
|
11886
|
-
|
|
11904
|
+
/**
|
|
11905
|
+
* A composition source identity: `(addonId, stableId)`, never a numeric device
|
|
11906
|
+
* id. Split out so helper schemas can name it without a cycle through
|
|
11907
|
+
* `composition.ts` (D659).
|
|
11908
|
+
*/
|
|
11887
11909
|
var CompositionSourceRefSchema = object({
|
|
11888
11910
|
/** The owning addon; `stableId` is unique only within it. */
|
|
11889
11911
|
addonId: string().min(1),
|
|
11890
11912
|
stableId: string().min(1)
|
|
11891
11913
|
});
|
|
11914
|
+
var GROUP_TEMPLATE_IDS = [
|
|
11915
|
+
"temperature",
|
|
11916
|
+
"humidity",
|
|
11917
|
+
"pressure",
|
|
11918
|
+
"illuminance",
|
|
11919
|
+
"power",
|
|
11920
|
+
"energy",
|
|
11921
|
+
"battery",
|
|
11922
|
+
"numeric",
|
|
11923
|
+
"motion",
|
|
11924
|
+
"contact",
|
|
11925
|
+
"leak",
|
|
11926
|
+
"smoke",
|
|
11927
|
+
"occupancy",
|
|
11928
|
+
"binary",
|
|
11929
|
+
"switch",
|
|
11930
|
+
"light"
|
|
11931
|
+
];
|
|
11932
|
+
var NUMERIC_AGGREGATES = [
|
|
11933
|
+
"mean",
|
|
11934
|
+
"median",
|
|
11935
|
+
"min",
|
|
11936
|
+
"max",
|
|
11937
|
+
"sum"
|
|
11938
|
+
];
|
|
11939
|
+
var BINARY_AGGREGATES = ["any", "all"];
|
|
11940
|
+
/** How an actuator group decides it is on. Unknown members never count as off. */
|
|
11941
|
+
var ACTIVE_CRITERIA = ["at-least-one", "all"];
|
|
11942
|
+
var AGGREGATE_REDUCERS = [
|
|
11943
|
+
"mean",
|
|
11944
|
+
"median",
|
|
11945
|
+
"min",
|
|
11946
|
+
"max",
|
|
11947
|
+
"sum",
|
|
11948
|
+
"any",
|
|
11949
|
+
"all"
|
|
11950
|
+
];
|
|
11951
|
+
var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
|
|
11952
|
+
var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
|
|
11953
|
+
var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
|
|
11954
|
+
/** One member. The field is stored so occupancy can name motion or binary. */
|
|
11955
|
+
var HelperMemberSchema = object({
|
|
11956
|
+
source: CompositionSourceRefSchema,
|
|
11957
|
+
cap: string().min(1),
|
|
11958
|
+
fieldPath: string().min(1)
|
|
11959
|
+
});
|
|
11960
|
+
var HelperSpecSchema = discriminatedUnion("kind", [object({
|
|
11961
|
+
kind: literal("group"),
|
|
11962
|
+
templateId: GroupTemplateIdSchema,
|
|
11963
|
+
aggregate: AggregateReducerSchema,
|
|
11964
|
+
members: array(HelperMemberSchema).min(1).max(64),
|
|
11965
|
+
/** Actuator groups only. Readings leave this unset. */
|
|
11966
|
+
active: ActiveCriterionSchema.optional()
|
|
11967
|
+
})]);
|
|
11968
|
+
/** A composed device's stableId is this prefix plus the block id. */
|
|
11969
|
+
var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
|
|
11970
|
+
/** Longest snippet a `code` source may carry (slice 4). */
|
|
11971
|
+
var MAX_COMPOSITION_CODE_LENGTH = 2e4;
|
|
11892
11972
|
/** One field of one capability of one source device. */
|
|
11893
11973
|
var CompositionFieldReadSchema = object({
|
|
11894
11974
|
source: CompositionSourceRefSchema,
|
|
@@ -11932,7 +12012,33 @@ var CompositionCodeSourceSchema = object({
|
|
|
11932
12012
|
var CompositionFieldSourceSchema = discriminatedUnion("kind", [
|
|
11933
12013
|
CompositionFromSourceSchema,
|
|
11934
12014
|
CompositionExpressionSourceSchema,
|
|
11935
|
-
CompositionCodeSourceSchema
|
|
12015
|
+
CompositionCodeSourceSchema,
|
|
12016
|
+
object({
|
|
12017
|
+
kind: literal("aggregate"),
|
|
12018
|
+
reducer: _enum([
|
|
12019
|
+
"mean",
|
|
12020
|
+
"median",
|
|
12021
|
+
"min",
|
|
12022
|
+
"max",
|
|
12023
|
+
"sum",
|
|
12024
|
+
"any",
|
|
12025
|
+
"all"
|
|
12026
|
+
]),
|
|
12027
|
+
reads: array(CompositionFieldReadSchema).min(1).max(64),
|
|
12028
|
+
/** `value` is the reading; the others are the member counts. */
|
|
12029
|
+
publish: _enum([
|
|
12030
|
+
"value",
|
|
12031
|
+
"included",
|
|
12032
|
+
"excluded",
|
|
12033
|
+
"total"
|
|
12034
|
+
]),
|
|
12035
|
+
/** What a `value` publish does when nobody is included. Counts ignore this. */
|
|
12036
|
+
empty: _enum([
|
|
12037
|
+
"null",
|
|
12038
|
+
"omit",
|
|
12039
|
+
"offline"
|
|
12040
|
+
])
|
|
12041
|
+
})
|
|
11936
12042
|
]);
|
|
11937
12043
|
var CompositionCommandTargetSchema = discriminatedUnion("kind", [object({
|
|
11938
12044
|
kind: literal("forward"),
|
|
@@ -11978,7 +12084,13 @@ var CompositionSchema = object({
|
|
|
11978
12084
|
kind: literal("existing"),
|
|
11979
12085
|
device: CompositionSourceRefSchema
|
|
11980
12086
|
})]),
|
|
11981
|
-
features: array(CompositionFeatureSchema).min(1).max(16)
|
|
12087
|
+
features: array(CompositionFeatureSchema).min(1).max(16),
|
|
12088
|
+
/**
|
|
12089
|
+
* Present when the block is a helper template. Absent on a free
|
|
12090
|
+
* composition (the room example, device 4603). The editor reads this,
|
|
12091
|
+
* never the compiled features.
|
|
12092
|
+
*/
|
|
12093
|
+
helper: HelperSpecSchema.optional()
|
|
11982
12094
|
}).superRefine((composition, ctx) => {
|
|
11983
12095
|
const seen = /* @__PURE__ */ new Set();
|
|
11984
12096
|
composition.features.forEach((feature, index) => {
|
|
@@ -18456,7 +18568,11 @@ var CompositionProblemSchema = object({
|
|
|
18456
18568
|
"item-field-reserved",
|
|
18457
18569
|
"target-missing",
|
|
18458
18570
|
"target-unreadable",
|
|
18459
|
-
"not-replaceable"
|
|
18571
|
+
"not-replaceable",
|
|
18572
|
+
"native-capability-replace",
|
|
18573
|
+
"mixed-quantity",
|
|
18574
|
+
"helper-mismatch",
|
|
18575
|
+
"member-constraint"
|
|
18460
18576
|
]),
|
|
18461
18577
|
path: string(),
|
|
18462
18578
|
message: string()
|
|
@@ -18477,7 +18593,8 @@ var CompositionUnavailableModeSchema = _enum([
|
|
|
18477
18593
|
"null",
|
|
18478
18594
|
"offline",
|
|
18479
18595
|
"unknown",
|
|
18480
|
-
"release"
|
|
18596
|
+
"release",
|
|
18597
|
+
"omit"
|
|
18481
18598
|
]);
|
|
18482
18599
|
/**
|
|
18483
18600
|
* `derived` reads a source · `clock` reads only `now`, recomputed when a sibling
|
|
@@ -18514,9 +18631,11 @@ var CompositionFieldPlanSchema = object({
|
|
|
18514
18631
|
reads: array(CompositionFieldReadSchema)
|
|
18515
18632
|
});
|
|
18516
18633
|
/**
|
|
18517
|
-
* What a feature does to its target (D663): `new` builds a capability on a
|
|
18518
|
-
* device; on an existing device it `add`s a capability the device lacks
|
|
18519
|
-
*
|
|
18634
|
+
* What a feature does to its target (D663, D944): `new` builds a capability on a
|
|
18635
|
+
* new device; on an existing device it `add`s a capability the device lacks.
|
|
18636
|
+
* Replacing a capability the device already serves is refused
|
|
18637
|
+
* (`native-capability-replace`), not planned. `replace` remains on the claim
|
|
18638
|
+
* wire for a claim the hub already holds.
|
|
18520
18639
|
*/
|
|
18521
18640
|
var CompositionFeatureModeSchema = _enum([
|
|
18522
18641
|
"new",
|
|
@@ -18689,6 +18808,275 @@ Object.freeze({
|
|
|
18689
18808
|
result: ["number", "null"]
|
|
18690
18809
|
}
|
|
18691
18810
|
});
|
|
18811
|
+
/**
|
|
18812
|
+
* One catalog row per base reading a group helper can build (D944 §3).
|
|
18813
|
+
* Data, not a form default written into the block.
|
|
18814
|
+
*/
|
|
18815
|
+
var NOW = {
|
|
18816
|
+
fieldPath: "lastFetchedAt",
|
|
18817
|
+
expr: "now"
|
|
18818
|
+
};
|
|
18819
|
+
var CHANGED = {
|
|
18820
|
+
fieldPath: "lastChangedAt",
|
|
18821
|
+
expr: "now"
|
|
18822
|
+
};
|
|
18823
|
+
function numeric(input) {
|
|
18824
|
+
return {
|
|
18825
|
+
...input,
|
|
18826
|
+
family: "numeric",
|
|
18827
|
+
deviceType: DeviceType.Sensor,
|
|
18828
|
+
memberDeviceType: DeviceType.Sensor,
|
|
18829
|
+
commandCaps: [],
|
|
18830
|
+
baseUnit: baseUnitOf(input.quantity),
|
|
18831
|
+
aggregates: NUMERIC_AGGREGATES,
|
|
18832
|
+
accept: [{
|
|
18833
|
+
cap: input.outputCap,
|
|
18834
|
+
fieldPath: input.outputField
|
|
18835
|
+
}]
|
|
18836
|
+
};
|
|
18837
|
+
}
|
|
18838
|
+
function binary(input) {
|
|
18839
|
+
return {
|
|
18840
|
+
...input,
|
|
18841
|
+
family: "binary",
|
|
18842
|
+
deviceType: DeviceType.Sensor,
|
|
18843
|
+
memberDeviceType: DeviceType.Sensor,
|
|
18844
|
+
commandCaps: [],
|
|
18845
|
+
quantity: "none",
|
|
18846
|
+
baseUnit: void 0,
|
|
18847
|
+
aggregates: BINARY_AGGREGATES,
|
|
18848
|
+
empty: "offline"
|
|
18849
|
+
};
|
|
18850
|
+
}
|
|
18851
|
+
var GROUP_TEMPLATES = [
|
|
18852
|
+
numeric({
|
|
18853
|
+
id: "temperature",
|
|
18854
|
+
summary: "Mean, median, min, max or sum of temperatures. Offline and unknown members are left out, never read as 0 °C.",
|
|
18855
|
+
role: DeviceRole.TemperatureSensor,
|
|
18856
|
+
outputCap: "temperature-sensor",
|
|
18857
|
+
outputField: "celsius",
|
|
18858
|
+
quantity: "temperature",
|
|
18859
|
+
defaultAggregate: "mean",
|
|
18860
|
+
empty: "null",
|
|
18861
|
+
companions: [NOW]
|
|
18862
|
+
}),
|
|
18863
|
+
numeric({
|
|
18864
|
+
id: "humidity",
|
|
18865
|
+
summary: "Humidity in percent. Offline and unknown members are left out, never read as 0 %.",
|
|
18866
|
+
role: DeviceRole.HumiditySensor,
|
|
18867
|
+
outputCap: "humidity-sensor",
|
|
18868
|
+
outputField: "percent",
|
|
18869
|
+
quantity: "humidity",
|
|
18870
|
+
defaultAggregate: "mean",
|
|
18871
|
+
empty: "null",
|
|
18872
|
+
companions: [NOW]
|
|
18873
|
+
}),
|
|
18874
|
+
numeric({
|
|
18875
|
+
id: "pressure",
|
|
18876
|
+
summary: "Pressure in hectopascals. Offline and unknown members are left out, never read as 0 hPa.",
|
|
18877
|
+
role: DeviceRole.PressureSensor,
|
|
18878
|
+
outputCap: "pressure-sensor",
|
|
18879
|
+
outputField: "hpa",
|
|
18880
|
+
quantity: "pressure",
|
|
18881
|
+
defaultAggregate: "mean",
|
|
18882
|
+
empty: "null",
|
|
18883
|
+
companions: [NOW]
|
|
18884
|
+
}),
|
|
18885
|
+
numeric({
|
|
18886
|
+
id: "illuminance",
|
|
18887
|
+
summary: "Illuminance in lux. Offline and unknown members are left out, never read as 0 lx.",
|
|
18888
|
+
role: DeviceRole.AmbientLightSensor,
|
|
18889
|
+
outputCap: "ambient-light-sensor",
|
|
18890
|
+
outputField: "lux",
|
|
18891
|
+
quantity: "illuminance",
|
|
18892
|
+
defaultAggregate: "mean",
|
|
18893
|
+
empty: "null",
|
|
18894
|
+
companions: [NOW]
|
|
18895
|
+
}),
|
|
18896
|
+
numeric({
|
|
18897
|
+
id: "power",
|
|
18898
|
+
summary: "Power in watts, summed by default. Nobody reporting omits the key rather than writing 0 W.",
|
|
18899
|
+
role: DeviceRole.PowerSensor,
|
|
18900
|
+
outputCap: "power-meter",
|
|
18901
|
+
outputField: "watts",
|
|
18902
|
+
quantity: "power",
|
|
18903
|
+
defaultAggregate: "sum",
|
|
18904
|
+
empty: "omit",
|
|
18905
|
+
companions: [NOW]
|
|
18906
|
+
}),
|
|
18907
|
+
numeric({
|
|
18908
|
+
id: "energy",
|
|
18909
|
+
summary: "Energy in kilowatt-hours, summed by default. Nobody reporting omits the key rather than writing 0 kWh.",
|
|
18910
|
+
role: DeviceRole.EnergySensor,
|
|
18911
|
+
outputCap: "power-meter",
|
|
18912
|
+
outputField: "kwhTotal",
|
|
18913
|
+
quantity: "energy",
|
|
18914
|
+
defaultAggregate: "sum",
|
|
18915
|
+
empty: "omit",
|
|
18916
|
+
companions: [NOW]
|
|
18917
|
+
}),
|
|
18918
|
+
numeric({
|
|
18919
|
+
id: "battery",
|
|
18920
|
+
summary: "Battery charge in percent. Offline and unknown members are left out, never read as 0 %.",
|
|
18921
|
+
role: DeviceRole.BatterySensor,
|
|
18922
|
+
outputCap: "battery",
|
|
18923
|
+
outputField: "percentage",
|
|
18924
|
+
quantity: "percentage",
|
|
18925
|
+
defaultAggregate: "mean",
|
|
18926
|
+
empty: "null",
|
|
18927
|
+
companions: [
|
|
18928
|
+
{
|
|
18929
|
+
fieldPath: "charging",
|
|
18930
|
+
expr: "\"unknown\""
|
|
18931
|
+
},
|
|
18932
|
+
{
|
|
18933
|
+
fieldPath: "sleeping",
|
|
18934
|
+
expr: "false"
|
|
18935
|
+
},
|
|
18936
|
+
{
|
|
18937
|
+
fieldPath: "lastUpdated",
|
|
18938
|
+
expr: "now"
|
|
18939
|
+
}
|
|
18940
|
+
]
|
|
18941
|
+
}),
|
|
18942
|
+
numeric({
|
|
18943
|
+
id: "numeric",
|
|
18944
|
+
summary: "A numeric reading in the members’ shared quantity. Mixed quantities are refused. Nobody reporting publishes null, not 0.",
|
|
18945
|
+
role: DeviceRole.NumericSensor,
|
|
18946
|
+
outputCap: "numeric-sensor",
|
|
18947
|
+
outputField: "value",
|
|
18948
|
+
quantity: "device",
|
|
18949
|
+
defaultAggregate: "mean",
|
|
18950
|
+
empty: "null",
|
|
18951
|
+
companions: [NOW]
|
|
18952
|
+
}),
|
|
18953
|
+
binary({
|
|
18954
|
+
id: "motion",
|
|
18955
|
+
summary: "Any or all motion. Offline and unknown members are left out, never read as off. Nobody reporting takes the device offline.",
|
|
18956
|
+
role: DeviceRole.MotionSensor,
|
|
18957
|
+
outputCap: "motion",
|
|
18958
|
+
outputField: "detected",
|
|
18959
|
+
defaultAggregate: "any",
|
|
18960
|
+
accept: [{
|
|
18961
|
+
cap: "motion",
|
|
18962
|
+
fieldPath: "detected"
|
|
18963
|
+
}],
|
|
18964
|
+
companions: [{
|
|
18965
|
+
fieldPath: "lastDetectedAt",
|
|
18966
|
+
expr: "null"
|
|
18967
|
+
}, {
|
|
18968
|
+
fieldPath: "autoClearAfterMs",
|
|
18969
|
+
expr: "null"
|
|
18970
|
+
}]
|
|
18971
|
+
}),
|
|
18972
|
+
binary({
|
|
18973
|
+
id: "contact",
|
|
18974
|
+
summary: "Any or all open contacts. Offline and unknown members are left out, never read as closed.",
|
|
18975
|
+
role: DeviceRole.ContactSensor,
|
|
18976
|
+
outputCap: "contact",
|
|
18977
|
+
outputField: "entryOpen",
|
|
18978
|
+
defaultAggregate: "any",
|
|
18979
|
+
accept: [{
|
|
18980
|
+
cap: "contact",
|
|
18981
|
+
fieldPath: "entryOpen"
|
|
18982
|
+
}],
|
|
18983
|
+
companions: [CHANGED]
|
|
18984
|
+
}),
|
|
18985
|
+
binary({
|
|
18986
|
+
id: "leak",
|
|
18987
|
+
summary: "Any or all leak detections. Offline and unknown members are left out, never read as dry.",
|
|
18988
|
+
role: DeviceRole.LeakSensor,
|
|
18989
|
+
outputCap: "flood",
|
|
18990
|
+
outputField: "flooded",
|
|
18991
|
+
defaultAggregate: "any",
|
|
18992
|
+
accept: [{
|
|
18993
|
+
cap: "flood",
|
|
18994
|
+
fieldPath: "flooded"
|
|
18995
|
+
}],
|
|
18996
|
+
companions: [CHANGED]
|
|
18997
|
+
}),
|
|
18998
|
+
binary({
|
|
18999
|
+
id: "smoke",
|
|
19000
|
+
summary: "Any or all smoke detections. Offline and unknown members are left out, never read as clear.",
|
|
19001
|
+
role: DeviceRole.SmokeSensor,
|
|
19002
|
+
outputCap: "smoke",
|
|
19003
|
+
outputField: "detected",
|
|
19004
|
+
defaultAggregate: "any",
|
|
19005
|
+
accept: [{
|
|
19006
|
+
cap: "smoke",
|
|
19007
|
+
fieldPath: "detected"
|
|
19008
|
+
}],
|
|
19009
|
+
companions: [CHANGED]
|
|
19010
|
+
}),
|
|
19011
|
+
binary({
|
|
19012
|
+
id: "occupancy",
|
|
19013
|
+
summary: "Any or all of motion or binary sensors, published as a binary. Presence zones are not aggregated. Nobody reporting is offline, not off.",
|
|
19014
|
+
role: DeviceRole.BinarySensor,
|
|
19015
|
+
outputCap: "binary",
|
|
19016
|
+
outputField: "on",
|
|
19017
|
+
defaultAggregate: "any",
|
|
19018
|
+
accept: [{
|
|
19019
|
+
cap: "motion",
|
|
19020
|
+
fieldPath: "detected"
|
|
19021
|
+
}, {
|
|
19022
|
+
cap: "binary",
|
|
19023
|
+
fieldPath: "on"
|
|
19024
|
+
}],
|
|
19025
|
+
companions: [CHANGED]
|
|
19026
|
+
}),
|
|
19027
|
+
binary({
|
|
19028
|
+
id: "binary",
|
|
19029
|
+
summary: "Any or all generic binary sensors. Offline and unknown members are left out, never read as off.",
|
|
19030
|
+
role: DeviceRole.BinarySensor,
|
|
19031
|
+
outputCap: "binary",
|
|
19032
|
+
outputField: "on",
|
|
19033
|
+
defaultAggregate: "any",
|
|
19034
|
+
accept: [{
|
|
19035
|
+
cap: "binary",
|
|
19036
|
+
fieldPath: "on"
|
|
19037
|
+
}],
|
|
19038
|
+
companions: [CHANGED]
|
|
19039
|
+
}),
|
|
19040
|
+
actuator({
|
|
19041
|
+
id: "switch",
|
|
19042
|
+
summary: "On when at least one switch is on, or when all of them are. Offline and unknown members are left out of that decision, never read as off, and still receive the command.",
|
|
19043
|
+
deviceType: DeviceType.Switch,
|
|
19044
|
+
outputCap: "switch",
|
|
19045
|
+
commandCaps: ["switch"]
|
|
19046
|
+
}),
|
|
19047
|
+
actuator({
|
|
19048
|
+
id: "light",
|
|
19049
|
+
summary: "On when at least one light is on, or when all of them are. Brightness and colour are offered only when every member has them. A command is not sent to a member that lacks it.",
|
|
19050
|
+
deviceType: DeviceType.Light,
|
|
19051
|
+
outputCap: "switch",
|
|
19052
|
+
commandCaps: [
|
|
19053
|
+
"switch",
|
|
19054
|
+
"brightness",
|
|
19055
|
+
"color"
|
|
19056
|
+
]
|
|
19057
|
+
})
|
|
19058
|
+
];
|
|
19059
|
+
function actuator(input) {
|
|
19060
|
+
return {
|
|
19061
|
+
...input,
|
|
19062
|
+
family: "actuator",
|
|
19063
|
+
role: void 0,
|
|
19064
|
+
memberDeviceType: input.deviceType,
|
|
19065
|
+
outputField: "on",
|
|
19066
|
+
quantity: "none",
|
|
19067
|
+
baseUnit: void 0,
|
|
19068
|
+
aggregates: BINARY_AGGREGATES,
|
|
19069
|
+
defaultAggregate: "any",
|
|
19070
|
+
empty: "offline",
|
|
19071
|
+
accept: [{
|
|
19072
|
+
cap: "switch",
|
|
19073
|
+
fieldPath: "on"
|
|
19074
|
+
}],
|
|
19075
|
+
companions: [CHANGED]
|
|
19076
|
+
};
|
|
19077
|
+
}
|
|
19078
|
+
new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
|
|
19079
|
+
DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
|
|
18692
19080
|
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
18693
19081
|
/**
|
|
18694
19082
|
* What a composition may BUILD on a device type (G2, D676): the caps a new
|
|
@@ -20402,12 +20790,12 @@ method(object({ deviceId: number().int().nonnegative() }), DeviceAdminLinkSchema
|
|
|
20402
20790
|
* providers detect renames by matching `uniqueId` and patch `id`
|
|
20403
20791
|
* in-place so dispatch keeps working.
|
|
20404
20792
|
*
|
|
20405
|
-
* **
|
|
20406
|
-
*
|
|
20407
|
-
*
|
|
20408
|
-
*
|
|
20409
|
-
* (`ha-domain-mapping`)
|
|
20410
|
-
* stored after that point.
|
|
20793
|
+
* **Display unit and precision are NOT stored here.** They are a read-time
|
|
20794
|
+
* preference (D944). A polymorphic reading stores its `quantity` here once,
|
|
20795
|
+
* at adopt, and a date/time value stores `dateTimeShape` the same way —
|
|
20796
|
+
* neither is repeated on each sample. The `device_class` tag is an
|
|
20797
|
+
* HA-specific input consumed at the discovery boundary (`ha-domain-mapping`)
|
|
20798
|
+
* to derive the CamStack `DeviceRole`; it is never stored after that point.
|
|
20411
20799
|
*
|
|
20412
20800
|
* The `raw` escape hatch carries provider-specific attributes that don't
|
|
20413
20801
|
* fit the structured slots (HA `attributes` whitelist, Reolink `deviceCache`
|
|
@@ -20421,6 +20809,14 @@ var SourceInfoSchema = object({
|
|
|
20421
20809
|
/** Immutable upstream identifier when available (HA `unique_id`, … ).
|
|
20422
20810
|
* Used to detect rename when `id` changes. */
|
|
20423
20811
|
uniqueId: string().optional(),
|
|
20812
|
+
/** Quantity of a polymorphic reading, written once at adopt (D944). */
|
|
20813
|
+
quantity: ReadingQuantitySchema.optional(),
|
|
20814
|
+
/** Date / time / datetime shape of a string reading, written once at adopt. */
|
|
20815
|
+
dateTimeShape: _enum([
|
|
20816
|
+
"date",
|
|
20817
|
+
"time",
|
|
20818
|
+
"datetime"
|
|
20819
|
+
]).optional(),
|
|
20424
20820
|
/** Provider-specific extras that don't fit the structured slots.
|
|
20425
20821
|
* Whitelist what goes here per provider — do NOT dump entire HA
|
|
20426
20822
|
* attribute blobs (would explode the meta JSON column). */
|
|
@@ -41351,7 +41747,8 @@ method(object({
|
|
|
41351
41747
|
"enum"
|
|
41352
41748
|
]),
|
|
41353
41749
|
enumValues: array(string()).optional(),
|
|
41354
|
-
item: boolean().optional()
|
|
41750
|
+
item: boolean().optional(),
|
|
41751
|
+
quantity: ReadingQuantitySchema.optional()
|
|
41355
41752
|
})).readonly(),
|
|
41356
41753
|
itemArray: object({
|
|
41357
41754
|
path: string(),
|
|
@@ -45159,8 +45556,8 @@ var MaskPolygonShapeSchema = object({
|
|
|
45159
45556
|
/** Boolean cell grid — row-major, length === gridWidth*gridHeight. */
|
|
45160
45557
|
var MaskGridShapeSchema = object({
|
|
45161
45558
|
kind: literal("grid"),
|
|
45162
|
-
gridWidth: number(),
|
|
45163
|
-
gridHeight: number(),
|
|
45559
|
+
gridWidth: number().meta(readingMeta("none")),
|
|
45560
|
+
gridHeight: number().meta(readingMeta("none")),
|
|
45164
45561
|
cells: array(boolean())
|
|
45165
45562
|
});
|
|
45166
45563
|
discriminatedUnion("kind", [
|
|
@@ -45272,6 +45669,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
45272
45669
|
"detection-blind",
|
|
45273
45670
|
"motion-noisy",
|
|
45274
45671
|
"motion-calm",
|
|
45672
|
+
"package-llm-silent",
|
|
45673
|
+
"package-llm-answered",
|
|
45275
45674
|
"recording-stalled",
|
|
45276
45675
|
"recording-healthy",
|
|
45277
45676
|
"recording-degraded",
|
|
@@ -56337,6 +56736,28 @@ var PackageVersionInfoSchema = object({
|
|
|
56337
56736
|
deprecated: string().optional(),
|
|
56338
56737
|
distTags: array(string()).readonly()
|
|
56339
56738
|
});
|
|
56739
|
+
/**
|
|
56740
|
+
* One published document. `ok` is markdown from the registry. `missing` means
|
|
56741
|
+
* the registry answered and the file was not there. `error` is a registry or
|
|
56742
|
+
* tarball failure — never an empty string standing in for either.
|
|
56743
|
+
*/
|
|
56744
|
+
var PackageDocBodySchema = discriminatedUnion("status", [
|
|
56745
|
+
object({
|
|
56746
|
+
status: literal("ok"),
|
|
56747
|
+
markdown: string()
|
|
56748
|
+
}),
|
|
56749
|
+
object({ status: literal("missing") }),
|
|
56750
|
+
object({
|
|
56751
|
+
status: literal("error"),
|
|
56752
|
+
message: string()
|
|
56753
|
+
})
|
|
56754
|
+
]);
|
|
56755
|
+
var PackageDocsSchema = object({
|
|
56756
|
+
name: string(),
|
|
56757
|
+
version: string(),
|
|
56758
|
+
readme: PackageDocBodySchema,
|
|
56759
|
+
changelog: PackageDocBodySchema
|
|
56760
|
+
});
|
|
56340
56761
|
var SearchResultSchema = object({
|
|
56341
56762
|
name: string(),
|
|
56342
56763
|
version: string(),
|
|
@@ -56555,7 +56976,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
|
|
|
56555
56976
|
}), object({ success: literal(true) }), {
|
|
56556
56977
|
kind: "mutation",
|
|
56557
56978
|
auth: "admin"
|
|
56558
|
-
}), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
|
|
56979
|
+
}), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
|
|
56980
|
+
name: string().min(1),
|
|
56981
|
+
version: string().min(1).optional()
|
|
56982
|
+
}), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
|
|
56559
56983
|
kind: "mutation",
|
|
56560
56984
|
auth: "admin"
|
|
56561
56985
|
}), method(object({ packageName: string() }), object({ success: literal(true) }), {
|
|
@@ -56605,46 +57029,27 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
|
|
|
56605
57029
|
}), LogStreamEntrySchema, { kind: "subscription" });
|
|
56606
57030
|
object({
|
|
56607
57031
|
/** Carbon dioxide concentration in ppm. */
|
|
56608
|
-
co2Ppm: number().min(0).optional(),
|
|
57032
|
+
co2Ppm: number().min(0).optional().meta(readingMeta("concentration-volume")),
|
|
56609
57033
|
/** Total volatile organic compounds in ppb. */
|
|
56610
|
-
vocPpb: number().min(0).optional(),
|
|
57034
|
+
vocPpb: number().min(0).optional().meta(readingMeta("concentration-ppb")),
|
|
56611
57035
|
/** Particulate matter ≤ 2.5 μm in µg/m³. */
|
|
56612
|
-
pm25: number().min(0).optional(),
|
|
57036
|
+
pm25: number().min(0).optional().meta(readingMeta("concentration-mass")),
|
|
56613
57037
|
/** Particulate matter ≤ 10 μm in µg/m³. */
|
|
56614
|
-
pm10: number().min(0).optional(),
|
|
57038
|
+
pm10: number().min(0).optional().meta(readingMeta("concentration-mass")),
|
|
56615
57039
|
/** Composite AQI value (typically 0..500). */
|
|
56616
|
-
aqi: number().optional(),
|
|
57040
|
+
aqi: number().optional().meta(readingMeta("index")),
|
|
56617
57041
|
/** Ms epoch when the slice was last updated. */
|
|
56618
|
-
lastFetchedAt: number()
|
|
56619
|
-
/** Live display unit of the single metric this slice carries (e.g. HA
|
|
56620
|
-
* `attributes.unit_of_measurement` → 'ppm' / 'ppb' / 'µg/m³'). Each
|
|
56621
|
-
* upstream `sensor.*` entity surfaces ONE device_class, so one unit
|
|
56622
|
-
* per slice is unambiguous. */
|
|
56623
|
-
unit: string().optional(),
|
|
56624
|
-
/** Suggested decimal places for numeric display.
|
|
56625
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
56626
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
56627
|
-
* auto-formatting when absent. */
|
|
56628
|
-
precision: number().int().min(0).max(10).optional()
|
|
57042
|
+
lastFetchedAt: number()
|
|
56629
57043
|
});
|
|
56630
57044
|
DeviceType.Sensor;
|
|
56631
57045
|
object({
|
|
56632
|
-
/** Current illuminance in lux (lx). */
|
|
56633
|
-
lux: number().min(0).meta({
|
|
56634
|
-
|
|
57046
|
+
/** Current illuminance in lux (lx). `null` when the sample was refused (D393). */
|
|
57047
|
+
lux: number().min(0).nullable().meta(readingMeta("illuminance", {
|
|
57048
|
+
precision: 0,
|
|
56635
57049
|
label: "Illuminance"
|
|
56636
|
-
}),
|
|
57050
|
+
})),
|
|
56637
57051
|
/** Ms epoch when the slice was last updated. */
|
|
56638
|
-
lastFetchedAt: number()
|
|
56639
|
-
/** Live display unit from the upstream source (e.g. HA
|
|
56640
|
-
* `attributes.unit_of_measurement`). The UI prefers this over the
|
|
56641
|
-
* role's canonical unit. Absent → fall back to the canonical unit. */
|
|
56642
|
-
unit: string().optional(),
|
|
56643
|
-
/** Suggested decimal places for numeric display.
|
|
56644
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
56645
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
56646
|
-
* auto-formatting when absent. */
|
|
56647
|
-
precision: number().int().min(0).max(10).optional()
|
|
57052
|
+
lastFetchedAt: number()
|
|
56648
57053
|
});
|
|
56649
57054
|
DeviceType.Sensor;
|
|
56650
57055
|
/**
|
|
@@ -56789,10 +57194,7 @@ var BatteryStatusSchema = object({
|
|
|
56789
57194
|
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
56790
57195
|
* declines to band a non-finite reading, which is the correct shape.
|
|
56791
57196
|
*/
|
|
56792
|
-
percentage: number().min(0).max(100).nullable().meta({
|
|
56793
|
-
unit: "%",
|
|
56794
|
-
label: "Charge"
|
|
56795
|
-
}),
|
|
57197
|
+
percentage: number().min(0).max(100).nullable().meta(readingMeta("percentage", { label: "Charge" })),
|
|
56796
57198
|
/**
|
|
56797
57199
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
56798
57200
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
|
@@ -56819,7 +57221,14 @@ var BatteryStatusSchema = object({
|
|
|
56819
57221
|
*/
|
|
56820
57222
|
sleeping: boolean().meta({ label: "Sleeping" }),
|
|
56821
57223
|
/** Ms epoch of the last observation. Lets consumers reason about freshness. */
|
|
56822
|
-
lastUpdated: number(),
|
|
57224
|
+
lastUpdated: number().meta(readingMeta("none")),
|
|
57225
|
+
/**
|
|
57226
|
+
* Battery voltage in volts, for a cell the firmware reports as voltage
|
|
57227
|
+
* rather than a percentage (Ecowitt capacitor packs). Absent on cameras
|
|
57228
|
+
* that only report charge. A second reading on this cap, not a second
|
|
57229
|
+
* `numeric-sensor` on the same device.
|
|
57230
|
+
*/
|
|
57231
|
+
volts: number().nullable().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
56823
57232
|
/**
|
|
56824
57233
|
* Ms epoch of the last time the device PROVED it was reachable — a
|
|
56825
57234
|
* completed firmware round-trip, an observed wake, or an inbound push
|
|
@@ -56879,7 +57288,7 @@ object({
|
|
|
56879
57288
|
DeviceType.Sensor;
|
|
56880
57289
|
object({
|
|
56881
57290
|
/** Current level as 0..100 inclusive. Firmware-reported. */
|
|
56882
|
-
percentage: number().min(0).max(100),
|
|
57291
|
+
percentage: number().min(0).max(100).meta(readingMeta("percentage")),
|
|
56883
57292
|
/** Ms epoch of the last operator-driven change. Useful for UI freshness. */
|
|
56884
57293
|
lastChangedAt: number()
|
|
56885
57294
|
});
|
|
@@ -57264,21 +57673,21 @@ object({
|
|
|
57264
57673
|
/** Single setpoint in Celsius. Used by single-target modes
|
|
57265
57674
|
* (heat / cool / dry). Null when the device is in a range mode
|
|
57266
57675
|
* (`heat_cool`) or has no setpoint at all (`fan_only`/`off`). */
|
|
57267
|
-
target: number().nullable(),
|
|
57676
|
+
target: number().nullable().meta(readingMeta("temperature")),
|
|
57268
57677
|
/** Upper bound of the dual setpoint in Celsius. Populated only
|
|
57269
57678
|
* in `heat_cool` mode. */
|
|
57270
|
-
targetHigh: number().nullable(),
|
|
57679
|
+
targetHigh: number().nullable().meta(readingMeta("temperature")),
|
|
57271
57680
|
/** Lower bound of the dual setpoint in Celsius. Populated only
|
|
57272
57681
|
* in `heat_cool` mode. */
|
|
57273
|
-
targetLow: number().nullable(),
|
|
57682
|
+
targetLow: number().nullable().meta(readingMeta("temperature")),
|
|
57274
57683
|
/** Target relative humidity (0..100). Null when the device has no
|
|
57275
57684
|
* humidity control. */
|
|
57276
|
-
targetHumidity: number().min(0).max(100).nullable(),
|
|
57685
|
+
targetHumidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
57277
57686
|
/** Current measured temperature in Celsius. Read-only — pushed by
|
|
57278
57687
|
* the device's internal sensor. */
|
|
57279
|
-
currentTemp: number().nullable(),
|
|
57688
|
+
currentTemp: number().nullable().meta(readingMeta("temperature")),
|
|
57280
57689
|
/** Current measured relative humidity (0..100). Read-only. */
|
|
57281
|
-
currentHumidity: number().min(0).max(100).nullable(),
|
|
57690
|
+
currentHumidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
57282
57691
|
/** Vertical louver swing on/off. Null when the device has no vertical
|
|
57283
57692
|
* swing surface (gate with `DeviceFeature.ClimateSwingVertical`). */
|
|
57284
57693
|
swingVertical: boolean().nullable(),
|
|
@@ -57286,11 +57695,11 @@ object({
|
|
|
57286
57695
|
* horizontal swing surface (gate with `DeviceFeature.ClimateSwingHorizontal`). */
|
|
57287
57696
|
swingHorizontal: boolean().nullable(),
|
|
57288
57697
|
/** Lowest setpoint the device accepts, Celsius. Absent / null = not reported. */
|
|
57289
|
-
minTemp: number().nullable().optional(),
|
|
57698
|
+
minTemp: number().nullable().optional().meta(readingMeta("temperature")),
|
|
57290
57699
|
/** Highest setpoint the device accepts, Celsius. Absent / null = not reported. */
|
|
57291
|
-
maxTemp: number().nullable().optional(),
|
|
57700
|
+
maxTemp: number().nullable().optional().meta(readingMeta("temperature")),
|
|
57292
57701
|
/** Setpoint granularity, Celsius (0.5, 1). Absent / null = not reported. */
|
|
57293
|
-
tempStep: number().positive().nullable().optional(),
|
|
57702
|
+
tempStep: number().positive().nullable().optional().meta(readingMeta("temperature")),
|
|
57294
57703
|
/** Ms epoch when the slice was last updated (push or command). */
|
|
57295
57704
|
lastFetchedAt: number()
|
|
57296
57705
|
});
|
|
@@ -57369,17 +57778,17 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
|
|
|
57369
57778
|
* modes to expose in the picker without a slice fetch.
|
|
57370
57779
|
*/
|
|
57371
57780
|
var RgbTripletSchema = object({
|
|
57372
|
-
r: number().int().min(0).max(255),
|
|
57373
|
-
g: number().int().min(0).max(255),
|
|
57374
|
-
b: number().int().min(0).max(255)
|
|
57781
|
+
r: number().int().min(0).max(255).meta(readingMeta("none")),
|
|
57782
|
+
g: number().int().min(0).max(255).meta(readingMeta("none")),
|
|
57783
|
+
b: number().int().min(0).max(255).meta(readingMeta("none"))
|
|
57375
57784
|
});
|
|
57376
57785
|
var HsvTripletSchema = object({
|
|
57377
57786
|
/** Hue in degrees, 0..360. */
|
|
57378
|
-
h: number().min(0).max(360),
|
|
57787
|
+
h: number().min(0).max(360).meta(readingMeta("none")),
|
|
57379
57788
|
/** Saturation as 0..100 inclusive. */
|
|
57380
|
-
s: number().min(0).max(100),
|
|
57789
|
+
s: number().min(0).max(100).meta(readingMeta("none")),
|
|
57381
57790
|
/** Value/brightness as 0..100 inclusive. */
|
|
57382
|
-
v: number().min(0).max(100)
|
|
57791
|
+
v: number().min(0).max(100).meta(readingMeta("none"))
|
|
57383
57792
|
});
|
|
57384
57793
|
var ColorInputSchema = discriminatedUnion("mode", [
|
|
57385
57794
|
object({
|
|
@@ -57408,7 +57817,7 @@ object({
|
|
|
57408
57817
|
/** Populated when `mode === 'hsv'`. */
|
|
57409
57818
|
hsv: HsvTripletSchema.optional(),
|
|
57410
57819
|
/** Populated when `mode === 'mired'`. */
|
|
57411
|
-
mireds: number().int().optional(),
|
|
57820
|
+
mireds: number().int().optional().meta(readingMeta("colour-temperature")),
|
|
57412
57821
|
/** Ms epoch of the last operator-driven change. */
|
|
57413
57822
|
lastChangedAt: number()
|
|
57414
57823
|
});
|
|
@@ -57532,18 +57941,12 @@ _enum([
|
|
|
57532
57941
|
"empty",
|
|
57533
57942
|
"full"
|
|
57534
57943
|
]);
|
|
57535
|
-
/**
|
|
57536
|
-
|
|
57537
|
-
|
|
57538
|
-
"days",
|
|
57539
|
-
"hours",
|
|
57540
|
-
"cycles"
|
|
57541
|
-
]);
|
|
57542
|
-
/** Remaining life as a COUNT, not a percentage (the PetKit desiccant reports
|
|
57543
|
-
* days). `value` null = unknown (D393). */
|
|
57944
|
+
/** Whether `remaining.value` is a duration in seconds or a dimensionless count. */
|
|
57945
|
+
var ConsumableRemainingKindSchema = _enum(["duration", "count"]);
|
|
57946
|
+
/** Remaining life. `value` null = unknown (D393). Duration is seconds. */
|
|
57544
57947
|
var ConsumableRemainingSchema = object({
|
|
57545
|
-
value: number().min(0).nullable(),
|
|
57546
|
-
|
|
57948
|
+
value: number().min(0).nullable().meta(readingMeta("device")),
|
|
57949
|
+
kind: ConsumableRemainingKindSchema
|
|
57547
57950
|
});
|
|
57548
57951
|
var ConsumablesStatusSchema = object({
|
|
57549
57952
|
items: array(object({
|
|
@@ -57552,7 +57955,7 @@ var ConsumablesStatusSchema = object({
|
|
|
57552
57955
|
/** Display name. */
|
|
57553
57956
|
label: string().min(1),
|
|
57554
57957
|
/** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
|
|
57555
|
-
level: number().min(0).max(100).nullable(),
|
|
57958
|
+
level: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
57556
57959
|
/** The provider's discrete verdict when known (binary mode). */
|
|
57557
57960
|
status: ConsumableStatusSchema.nullable(),
|
|
57558
57961
|
/** What the item is — decides whether low or full is bad. Absent = `wear`. */
|
|
@@ -57569,7 +57972,7 @@ var ConsumablesStatusSchema = object({
|
|
|
57569
57972
|
})),
|
|
57570
57973
|
lastChangedAt: number()
|
|
57571
57974
|
});
|
|
57572
|
-
Object.values(DeviceType), [...
|
|
57975
|
+
Object.values(DeviceType), [...ConsumableRemainingKindSchema.options], [...ConsumableStatusSchema.options], [...ConsumableKindSchema.options], [...ConsumableFormSchema.options];
|
|
57573
57976
|
Object.values(DeviceType), method(object({
|
|
57574
57977
|
deviceId: number().int().nonnegative(),
|
|
57575
57978
|
key: string().min(1)
|
|
@@ -57594,39 +57997,17 @@ object({
|
|
|
57594
57997
|
/** Current value. Numeric kind → number; select/text/datetime → string.
|
|
57595
57998
|
* Datetime values are ISO 8601 strings (full timestamp, date-only,
|
|
57596
57999
|
* or time-only — HA accepts all three forms). */
|
|
57597
|
-
value: union([number(), string()]),
|
|
58000
|
+
value: union([number().meta(readingMeta("device")), string()]),
|
|
57598
58001
|
/** Acceptable values when `kind === 'select'`. Empty for other kinds. */
|
|
57599
58002
|
options: array(string()),
|
|
57600
58003
|
/** Ms epoch when the slice was last updated. */
|
|
57601
58004
|
lastChangedAt: number(),
|
|
57602
|
-
/**
|
|
57603
|
-
|
|
57604
|
-
|
|
57605
|
-
|
|
57606
|
-
/**
|
|
57607
|
-
|
|
57608
|
-
min: number().optional(),
|
|
57609
|
-
/** Maximum allowed value. Populated live from HA `attributes.max`.
|
|
57610
|
-
* Meaningful for `kind === 'numeric'`; absent for other kinds. */
|
|
57611
|
-
max: number().optional(),
|
|
57612
|
-
/** Step increment. Populated live from HA `attributes.step`.
|
|
57613
|
-
* Meaningful for `kind === 'numeric'`; absent for other kinds. */
|
|
57614
|
-
step: number().optional(),
|
|
57615
|
-
/** Suggested decimal places for numeric display. Populated live from HA
|
|
57616
|
-
* `attributes.suggested_display_precision`, or derived from `step` when the
|
|
57617
|
-
* HA attribute is absent. Meaningful for `kind === 'numeric'`; absent for
|
|
57618
|
-
* other kinds. Falls back to auto-formatting when absent. */
|
|
57619
|
-
precision: number().int().min(0).max(10).optional(),
|
|
57620
|
-
/** Date-picker granularity for `kind === 'datetime'`. 'date' → date-only,
|
|
57621
|
-
* 'time' → time-only, 'datetime' → full timestamp. Absent for other kinds
|
|
57622
|
-
* (UI defaults to 'datetime'). Derived live from the device's HA domain
|
|
57623
|
-
* (date.* / time.* / datetime.*) or, for input_datetime, from the entity's
|
|
57624
|
-
* `has_date`/`has_time` attributes on each push. */
|
|
57625
|
-
format: _enum([
|
|
57626
|
-
"date",
|
|
57627
|
-
"time",
|
|
57628
|
-
"datetime"
|
|
57629
|
-
]).optional()
|
|
58005
|
+
/** Minimum allowed value, in the device quantity's base unit. */
|
|
58006
|
+
min: number().optional().meta(readingMeta("device")),
|
|
58007
|
+
/** Maximum allowed value, in the device quantity's base unit. */
|
|
58008
|
+
max: number().optional().meta(readingMeta("device")),
|
|
58009
|
+
/** Step increment, in the device quantity's base unit. */
|
|
58010
|
+
step: number().optional().meta(readingMeta("device"))
|
|
57630
58011
|
});
|
|
57631
58012
|
var ControlSetValueInputSchema = discriminatedUnion("kind", [
|
|
57632
58013
|
object({
|
|
@@ -57664,9 +58045,9 @@ object({
|
|
|
57664
58045
|
]),
|
|
57665
58046
|
/** 0 = fully closed, 100 = fully open. Null when the device has
|
|
57666
58047
|
* no intermediate position surface. */
|
|
57667
|
-
position: number().min(0).max(100).nullable(),
|
|
58048
|
+
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
57668
58049
|
/** 0 = closed slats, 100 = open slats. Null when no tilt support. */
|
|
57669
|
-
tiltPosition: number().min(0).max(100).nullable(),
|
|
58050
|
+
tiltPosition: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
57670
58051
|
/** Ms epoch when the slice was last updated. */
|
|
57671
58052
|
lastChangedAt: number()
|
|
57672
58053
|
});
|
|
@@ -57724,9 +58105,9 @@ var NormalizedRangeSchema$1 = object({
|
|
|
57724
58105
|
object({
|
|
57725
58106
|
mode: DayNightModeSchema,
|
|
57726
58107
|
/** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
|
|
57727
|
-
sensitivity: number().optional(),
|
|
58108
|
+
sensitivity: number().optional().meta(readingMeta("none")),
|
|
57728
58109
|
/** Delay before the IR-cut filter flips, in seconds. */
|
|
57729
|
-
switchDelaySec: number().optional(),
|
|
58110
|
+
switchDelaySec: number().optional().meta(readingMeta("duration")),
|
|
57730
58111
|
lastFetchedAt: number()
|
|
57731
58112
|
});
|
|
57732
58113
|
/**
|
|
@@ -57881,11 +58262,11 @@ object({
|
|
|
57881
58262
|
/** Feature keys of the programs the appliance currently offers — drives the UI selector. */
|
|
57882
58263
|
availablePrograms: array(string()),
|
|
57883
58264
|
/** Seconds remaining on the active cycle, or null when not running / not known. */
|
|
57884
|
-
remainingSeconds: number().int().nonnegative().nullable(),
|
|
58265
|
+
remainingSeconds: number().int().nonnegative().nullable().meta(readingMeta("duration")),
|
|
57885
58266
|
/** Seconds the delayed start is set to (time until the cycle starts), or null. */
|
|
57886
|
-
delayedStartSeconds: number().int().nonnegative().nullable(),
|
|
58267
|
+
delayedStartSeconds: number().int().nonnegative().nullable().meta(readingMeta("duration")),
|
|
57887
58268
|
/** Cycle completion 0..100, or null when not applicable. */
|
|
57888
|
-
progressPercent: number().min(0).max(100).nullable(),
|
|
58269
|
+
progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
57889
58270
|
/** True when the door is reported open; null when the door state is not known. */
|
|
57890
58271
|
doorOpen: boolean().nullable(),
|
|
57891
58272
|
/** True when the door is latched (locked) during a cycle; null when not reported. */
|
|
@@ -57909,7 +58290,7 @@ object({
|
|
|
57909
58290
|
/** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
|
|
57910
58291
|
machineCareDue: boolean().nullable(),
|
|
57911
58292
|
/** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
|
|
57912
|
-
machineCareRemainingRuns: number().int().nonnegative().nullable(),
|
|
58293
|
+
machineCareRemainingRuns: number().int().nonnegative().nullable().meta(readingMeta("count")),
|
|
57913
58294
|
/** Option states: null when the appliance does not expose the option or has not said. */
|
|
57914
58295
|
halfLoad: boolean().nullable(),
|
|
57915
58296
|
hygienePlus: boolean().nullable(),
|
|
@@ -57924,7 +58305,7 @@ object({
|
|
|
57924
58305
|
/** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
|
|
57925
58306
|
activeEvents: array(string()),
|
|
57926
58307
|
/** Numeric error code when the appliance reports one; null otherwise. */
|
|
57927
|
-
errorCode: number().nullable(),
|
|
58308
|
+
errorCode: number().nullable().meta(readingMeta("none")),
|
|
57928
58309
|
/** Name of the raised alert-level event while the appliance is in error; null otherwise. */
|
|
57929
58310
|
errorLabel: string().nullable(),
|
|
57930
58311
|
/** Ms epoch of the last value received from the appliance; 0 = never. */
|
|
@@ -58070,24 +58451,14 @@ object({
|
|
|
58070
58451
|
/** Ms epoch of the last press. null = never observed since this provider started. */
|
|
58071
58452
|
lastPressedAt: number().nullable(),
|
|
58072
58453
|
/** Counter since provider start. Resets on reboot. Useful for metrics/debug. */
|
|
58073
|
-
pressCountSinceStart: number()
|
|
58454
|
+
pressCountSinceStart: number().meta(readingMeta("count"))
|
|
58074
58455
|
});
|
|
58075
58456
|
object({
|
|
58076
58457
|
deviceId: number(),
|
|
58077
58458
|
timestamp: number()
|
|
58078
58459
|
});
|
|
58079
58460
|
DeviceType.Button, DeviceType.Camera;
|
|
58080
|
-
|
|
58081
|
-
* Enum-state sensor — a string value picked from a finite option set.
|
|
58082
|
-
* Drives HA `sensor` entries with `state_class: enum` (HVAC action
|
|
58083
|
-
* states, weather conditions, contact-source channels, mode strings).
|
|
58084
|
-
* The option set is stable across observations; it is persisted in the
|
|
58085
|
-
* device config blob (via the control slice at adoption) and is NOT
|
|
58086
|
-
* stored in `sourceInfo`.
|
|
58087
|
-
*/
|
|
58088
|
-
/** Locale-render shape for an ISO `value` carried by a `DateTimeSensor`-role
|
|
58089
|
-
* enum sensor: `date` (date-only), `time` (time-only), `datetime` (both). */
|
|
58090
|
-
var EnumSensorDateTimeFormatSchema = _enum([
|
|
58461
|
+
_enum([
|
|
58091
58462
|
"date",
|
|
58092
58463
|
"time",
|
|
58093
58464
|
"datetime"
|
|
@@ -58095,12 +58466,11 @@ var EnumSensorDateTimeFormatSchema = _enum([
|
|
|
58095
58466
|
object({
|
|
58096
58467
|
value: string(),
|
|
58097
58468
|
/**
|
|
58098
|
-
* Set
|
|
58099
|
-
* as
|
|
58100
|
-
*
|
|
58101
|
-
* a time-only sensor → `'time'`.
|
|
58469
|
+
* Set when `value` is a timestamp rather than an enum state, so history
|
|
58470
|
+
* does not learn ISO strings as states. The display shape (date / time /
|
|
58471
|
+
* datetime) lives on `SourceInfo.dateTimeShape`, written once at adopt.
|
|
58102
58472
|
*/
|
|
58103
|
-
|
|
58473
|
+
timestamp: boolean().optional(),
|
|
58104
58474
|
/** Ms epoch when the slice was last updated. */
|
|
58105
58475
|
lastFetchedAt: number()
|
|
58106
58476
|
});
|
|
@@ -58119,13 +58489,13 @@ var EventFireSchema = object({
|
|
|
58119
58489
|
deviceId: number(),
|
|
58120
58490
|
eventType: string(),
|
|
58121
58491
|
data: record(string(), unknown()).nullable(),
|
|
58122
|
-
timestamp: number(),
|
|
58123
|
-
seq: number()
|
|
58492
|
+
timestamp: number().meta(readingMeta("none")),
|
|
58493
|
+
seq: number().meta(readingMeta("count"))
|
|
58124
58494
|
});
|
|
58125
58495
|
object({
|
|
58126
58496
|
eventTypes: array(string()),
|
|
58127
58497
|
lastEvent: EventFireSchema.nullable(),
|
|
58128
|
-
eventCountSinceStart: number()
|
|
58498
|
+
eventCountSinceStart: number().meta(readingMeta("count"))
|
|
58129
58499
|
});
|
|
58130
58500
|
DeviceType.EventEmitter;
|
|
58131
58501
|
var IdentitySchema = object({
|
|
@@ -58514,10 +58884,10 @@ var FanDirectionSchema = _enum(["forward", "reverse"]);
|
|
|
58514
58884
|
object({
|
|
58515
58885
|
/** Active speed as 0..100 inclusive. Null when the device has no
|
|
58516
58886
|
* speed surface (single-speed fan). */
|
|
58517
|
-
percentage: number().min(0).max(100).nullable(),
|
|
58887
|
+
percentage: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
58518
58888
|
/** Speed granularity the device accepts (HA `percentage_step`, e.g. 25 for
|
|
58519
58889
|
* a 4-speed fan). Absent when unknown — the UI then falls back to step 1. */
|
|
58520
|
-
percentageStep: number().positive().optional(),
|
|
58890
|
+
percentageStep: number().positive().optional().meta(readingMeta("percentage")),
|
|
58521
58891
|
/** Active preset mode (`auto` / `quiet` / `turbo` / vendor-specific)
|
|
58522
58892
|
* — empty string when no preset is active or supported. */
|
|
58523
58893
|
preset: string(),
|
|
@@ -58599,7 +58969,7 @@ var FeatureProbeStatusSchema = object({
|
|
|
58599
58969
|
/** Camera/firmware model string. `null` when the firmware doesn't expose it. */
|
|
58600
58970
|
model: string().nullable(),
|
|
58601
58971
|
/** Channel count for NVR/Hub devices; `1` for standalone cameras; `null` pre-probe. */
|
|
58602
|
-
channelCount: number().nullable(),
|
|
58972
|
+
channelCount: number().nullable().meta(readingMeta("count")),
|
|
58603
58973
|
/**
|
|
58604
58974
|
* Ms epoch of the last SUCCESSFUL probe. `0` before the first probe
|
|
58605
58975
|
* completes — drivers' `getAccessoryChildren()` should treat zero as
|
|
@@ -58631,9 +59001,39 @@ object({
|
|
|
58631
59001
|
lastChangedAt: number()
|
|
58632
59002
|
});
|
|
58633
59003
|
DeviceType.Sensor;
|
|
59004
|
+
object({
|
|
59005
|
+
/** One row per member that has been commanded. A later command replaces that member's row. */
|
|
59006
|
+
results: array(object({
|
|
59007
|
+
deviceId: number().int().nonnegative(),
|
|
59008
|
+
cap: string().min(1),
|
|
59009
|
+
method: string().min(1),
|
|
59010
|
+
ok: boolean(),
|
|
59011
|
+
error: string().optional(),
|
|
59012
|
+
/** Ms epoch of the attempt. */
|
|
59013
|
+
at: number()
|
|
59014
|
+
})) });
|
|
59015
|
+
DeviceType.Switch, DeviceType.Light;
|
|
59016
|
+
object({
|
|
59017
|
+
/** Members whose current value entered the aggregate. */
|
|
59018
|
+
included: number().int().nonnegative().meta(readingMeta("count", {
|
|
59019
|
+
precision: 0,
|
|
59020
|
+
label: "Reporting"
|
|
59021
|
+
})),
|
|
59022
|
+
/** Members left out: offline, unknown, or not a finite reading (D393). */
|
|
59023
|
+
excluded: number().int().nonnegative().meta(readingMeta("count", {
|
|
59024
|
+
precision: 0,
|
|
59025
|
+
label: "Excluded"
|
|
59026
|
+
})),
|
|
59027
|
+
/** `included` + `excluded`. */
|
|
59028
|
+
total: number().int().nonnegative().meta(readingMeta("count", {
|
|
59029
|
+
precision: 0,
|
|
59030
|
+
label: "Members"
|
|
59031
|
+
}))
|
|
59032
|
+
});
|
|
59033
|
+
DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
|
|
58634
59034
|
object({
|
|
58635
59035
|
/** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
|
|
58636
|
-
position: number().min(0).max(100).nullable(),
|
|
59036
|
+
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
58637
59037
|
/** Ms epoch when the slice was last updated (push or poll). */
|
|
58638
59038
|
lastFetchedAt: number()
|
|
58639
59039
|
});
|
|
@@ -58642,9 +59042,9 @@ object({
|
|
|
58642
59042
|
/** Whether the humidifier is currently on. */
|
|
58643
59043
|
on: boolean(),
|
|
58644
59044
|
/** Current measured relative humidity (0..100). Null when not reported. */
|
|
58645
|
-
currentHumidity: number().min(0).max(100).nullable(),
|
|
59045
|
+
currentHumidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
58646
59046
|
/** Target relative humidity (0..100). Null when no setpoint surface. */
|
|
58647
|
-
targetHumidity: number().min(0).max(100).nullable(),
|
|
59047
|
+
targetHumidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
58648
59048
|
/** Active mode (`auto` / `normal` / `baby` / vendor). Null when the
|
|
58649
59049
|
* device has no mode surface. */
|
|
58650
59050
|
mode: string().nullable(),
|
|
@@ -58654,9 +59054,9 @@ object({
|
|
|
58654
59054
|
* `idle` / `off`). Null when the device doesn't report it. */
|
|
58655
59055
|
action: string().nullable(),
|
|
58656
59056
|
/** HA `min_humidity` attribute. Null → UI uses 0. */
|
|
58657
|
-
minHumidity: number().nullable(),
|
|
59057
|
+
minHumidity: number().nullable().meta(readingMeta("humidity")),
|
|
58658
59058
|
/** HA `max_humidity` attribute. Null → UI uses 100. */
|
|
58659
|
-
maxHumidity: number().nullable(),
|
|
59059
|
+
maxHumidity: number().nullable().meta(readingMeta("humidity")),
|
|
58660
59060
|
/** Ms epoch when the slice was last updated. */
|
|
58661
59061
|
lastChangedAt: number()
|
|
58662
59062
|
});
|
|
@@ -58680,22 +59080,13 @@ DeviceType.Humidifier, method(object({
|
|
|
58680
59080
|
auth: "protected"
|
|
58681
59081
|
});
|
|
58682
59082
|
object({
|
|
58683
|
-
/** Current relative humidity, 0..100. */
|
|
58684
|
-
percent: number().min(0).max(100).meta({
|
|
58685
|
-
|
|
59083
|
+
/** Current relative humidity, 0..100. `null` when the sample was refused (D393). */
|
|
59084
|
+
percent: number().min(0).max(100).nullable().meta(readingMeta("humidity", {
|
|
59085
|
+
precision: 0,
|
|
58686
59086
|
label: "Humidity"
|
|
58687
|
-
}),
|
|
59087
|
+
})),
|
|
58688
59088
|
/** Ms epoch when the slice was last updated. */
|
|
58689
|
-
lastFetchedAt: number()
|
|
58690
|
-
/** Live display unit from the upstream source (e.g. HA
|
|
58691
|
-
* `attributes.unit_of_measurement`). The UI prefers this over the
|
|
58692
|
-
* role's canonical unit. Absent → fall back to the canonical unit. */
|
|
58693
|
-
unit: string().optional(),
|
|
58694
|
-
/** Suggested decimal places for numeric display.
|
|
58695
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
58696
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
58697
|
-
* auto-formatting when absent. */
|
|
58698
|
-
precision: number().int().min(0).max(10).optional()
|
|
59089
|
+
lastFetchedAt: number()
|
|
58699
59090
|
});
|
|
58700
59091
|
DeviceType.Sensor, DeviceType.Thermostat;
|
|
58701
59092
|
object({
|
|
@@ -58703,7 +59094,7 @@ object({
|
|
|
58703
59094
|
* entity exposes no `entity_picture` (yet). */
|
|
58704
59095
|
url: string().nullable(),
|
|
58705
59096
|
/** Ms epoch of the upstream last-updated timestamp. Null at cold-start. */
|
|
58706
|
-
lastUpdated: number().nullable()
|
|
59097
|
+
lastUpdated: number().nullable().meta(readingMeta("none"))
|
|
58707
59098
|
});
|
|
58708
59099
|
DeviceType.Image;
|
|
58709
59100
|
/**
|
|
@@ -58759,19 +59150,19 @@ var NormalizedRangeSchema = object({
|
|
|
58759
59150
|
});
|
|
58760
59151
|
object({
|
|
58761
59152
|
/** Normalized 0–100. */
|
|
58762
|
-
brightness: number().optional(),
|
|
59153
|
+
brightness: number().optional().meta(readingMeta("none")),
|
|
58763
59154
|
/** Normalized 0–100. */
|
|
58764
|
-
contrast: number().optional(),
|
|
59155
|
+
contrast: number().optional().meta(readingMeta("none")),
|
|
58765
59156
|
/** Normalized 0–100. */
|
|
58766
|
-
saturation: number().optional(),
|
|
59157
|
+
saturation: number().optional().meta(readingMeta("none")),
|
|
58767
59158
|
/** Normalized 0–100. */
|
|
58768
|
-
sharpness: number().optional(),
|
|
59159
|
+
sharpness: number().optional().meta(readingMeta("none")),
|
|
58769
59160
|
mirror: boolean().optional(),
|
|
58770
59161
|
flip: boolean().optional(),
|
|
58771
59162
|
rotate: ImageRotateSchema.optional(),
|
|
58772
59163
|
whiteBalance: WhiteBalanceModeSchema.optional(),
|
|
58773
59164
|
/** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
|
|
58774
|
-
warmth: number().optional(),
|
|
59165
|
+
warmth: number().optional().meta(readingMeta("none")),
|
|
58775
59166
|
exposureMode: ExposureModeSchema.optional(),
|
|
58776
59167
|
backlightMode: BacklightModeSchema.optional(),
|
|
58777
59168
|
lastFetchedAt: number()
|
|
@@ -59016,10 +59407,10 @@ var IntercomAbilitySchema = object({
|
|
|
59016
59407
|
/** Codecs accepted by firmware, in preference order. Driver-authored strings. */
|
|
59017
59408
|
codecs: array(string()),
|
|
59018
59409
|
/** Sample rate (Hz) the firmware expects. Reolink typical: 16000. */
|
|
59019
|
-
sampleRate: number(),
|
|
59410
|
+
sampleRate: number().meta(readingMeta("none")),
|
|
59020
59411
|
duplex: _enum(["half", "full"]),
|
|
59021
59412
|
/** Max in-flight audio backlog before drop (ms). Server uses this to bound latency. */
|
|
59022
|
-
maxBacklogMs: number()
|
|
59413
|
+
maxBacklogMs: number().meta(readingMeta("duration-ms"))
|
|
59023
59414
|
});
|
|
59024
59415
|
var IntercomStatusSchema = object({
|
|
59025
59416
|
/** True while a talk session is open. */
|
|
@@ -59130,13 +59521,13 @@ object({
|
|
|
59130
59521
|
activity: LawnMowerActivitySchema,
|
|
59131
59522
|
/** 0..100 battery percentage. Null when the device has no battery
|
|
59132
59523
|
* reading. */
|
|
59133
|
-
batteryLevel: number().min(0).max(100).nullable(),
|
|
59524
|
+
batteryLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
59134
59525
|
/** 0..100 mowing-completion percentage of the current task, or null when no
|
|
59135
59526
|
* task is active / progress is unavailable. */
|
|
59136
|
-
progressPercent: number().min(0).max(100).nullable(),
|
|
59527
|
+
progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
59137
59528
|
/** Current device/event code (dynamic — mostly status, sometimes an error),
|
|
59138
59529
|
* or null when unknown. */
|
|
59139
|
-
currentCode: number().nullable(),
|
|
59530
|
+
currentCode: number().nullable().meta(readingMeta("none")),
|
|
59140
59531
|
/** Human label for {@link currentCode}, or null when undecodable. */
|
|
59141
59532
|
currentCodeLabel: string().nullable(),
|
|
59142
59533
|
/** Severity of {@link currentCode}. `error` (and often `warning`) warrants UI
|
|
@@ -59598,7 +59989,7 @@ object({
|
|
|
59598
59989
|
state: MediaPlayerStateSchema,
|
|
59599
59990
|
/** Volume as 0..100 inclusive. Null when the device has no volume
|
|
59600
59991
|
* surface. Pair with `DeviceFeature.MediaPlayerVolume`. */
|
|
59601
|
-
volumeLevel: number().min(0).max(100).nullable(),
|
|
59992
|
+
volumeLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
59602
59993
|
/** Mute toggle distinct from volume=0. Null when no mute surface.
|
|
59603
59994
|
* Pair with `DeviceFeature.MediaPlayerMute`. */
|
|
59604
59995
|
isMuted: boolean().nullable(),
|
|
@@ -59611,10 +60002,10 @@ object({
|
|
|
59611
60002
|
currentMedia: MediaInfoSchema.nullable(),
|
|
59612
60003
|
/** Current playback position in ms. Null when not seekable or
|
|
59613
60004
|
* nothing is playing. Pair with `DeviceFeature.MediaPlayerSeek`. */
|
|
59614
|
-
positionMs: number().int().nonnegative().nullable(),
|
|
60005
|
+
positionMs: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
|
|
59615
60006
|
/** Total duration of the current media in ms. Null when unknown
|
|
59616
60007
|
* (live stream) or nothing is playing. */
|
|
59617
|
-
durationMs: number().int().nonnegative().nullable(),
|
|
60008
|
+
durationMs: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
|
|
59618
60009
|
/** Shuffle toggle. Null when no shuffle surface.
|
|
59619
60010
|
* Pair with `DeviceFeature.MediaPlayerShuffle`. */
|
|
59620
60011
|
shuffle: boolean().nullable(),
|
|
@@ -59914,7 +60305,7 @@ object({
|
|
|
59914
60305
|
* it, every provider seeded it at boot, and every session left it
|
|
59915
60306
|
* `detected: true` after its detach.
|
|
59916
60307
|
*/
|
|
59917
|
-
autoClearAfterMs: number().nullable()
|
|
60308
|
+
autoClearAfterMs: number().nullable().meta(readingMeta("duration-ms"))
|
|
59918
60309
|
});
|
|
59919
60310
|
/**
|
|
59920
60311
|
* Payload of `motion.onMotionChanged` event + the corresponding bus
|
|
@@ -59964,7 +60355,7 @@ var MotionZoneRegionSchema = object({
|
|
|
59964
60355
|
});
|
|
59965
60356
|
object({
|
|
59966
60357
|
enabled: boolean(),
|
|
59967
|
-
sensitivity: number(),
|
|
60358
|
+
sensitivity: number().meta(readingMeta("none")),
|
|
59968
60359
|
/** Grid region(s). Today exactly one `grid` shape. */
|
|
59969
60360
|
regions: array(MotionZoneRegionSchema),
|
|
59970
60361
|
lastFetchedAt: number()
|
|
@@ -60268,7 +60659,7 @@ var NavigationStatusSchema = object({
|
|
|
60268
60659
|
following: boolean(),
|
|
60269
60660
|
flash: boolean(),
|
|
60270
60661
|
lightMode: NavigationLightModeSchema,
|
|
60271
|
-
lightLevel: number().min(40).max(100),
|
|
60662
|
+
lightLevel: number().min(40).max(100).meta(readingMeta("none")),
|
|
60272
60663
|
/** Ms epoch when the slice was last updated. */
|
|
60273
60664
|
lastChangedAt: number()
|
|
60274
60665
|
});
|
|
@@ -60314,13 +60705,13 @@ var NetworkLinkStatusSchema = object({
|
|
|
60314
60705
|
* one whose reading has not landed must not be drawn at 0 %. Consumers
|
|
60315
60706
|
* SKIP a null rather than coerce it.
|
|
60316
60707
|
*/
|
|
60317
|
-
signalPercent: number().min(0).max(100).nullable(),
|
|
60708
|
+
signalPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
60318
60709
|
/** Raw received signal strength in dBm, when the firmware reports one. */
|
|
60319
|
-
rssiDbm: number().optional(),
|
|
60710
|
+
rssiDbm: number().optional().meta(readingMeta("signal-level")),
|
|
60320
60711
|
/** Network name of a wireless link, when the firmware reports it. */
|
|
60321
60712
|
ssid: string().optional(),
|
|
60322
60713
|
/** Ms epoch of the last observation. Lets consumers reason about freshness. */
|
|
60323
|
-
lastUpdated: number()
|
|
60714
|
+
lastUpdated: number().meta(readingMeta("none"))
|
|
60324
60715
|
});
|
|
60325
60716
|
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.Light, DeviceType.Lock, DeviceType.Siren, object({
|
|
60326
60717
|
deviceId: number(),
|
|
@@ -60639,7 +61030,7 @@ object({
|
|
|
60639
61030
|
lastError: string().nullable(),
|
|
60640
61031
|
/** Number of deliveries currently buffered server-side (rate-limited
|
|
60641
61032
|
* notifiers may queue). 0 when the provider sends synchronously. */
|
|
60642
|
-
queueDepth: number().int().nonnegative(),
|
|
61033
|
+
queueDepth: number().int().nonnegative().meta(readingMeta("count")),
|
|
60643
61034
|
/** Per-feature capability matrix — authoritative source for the
|
|
60644
61035
|
* compose-form field gating. */
|
|
60645
61036
|
supports: NotifierSupportsSchema
|
|
@@ -60689,15 +61080,8 @@ DeviceType.Notifier, method(NotifierSendInputSchema, NotifierSendResultSchema, {
|
|
|
60689
61080
|
acceptedAt: number()
|
|
60690
61081
|
});
|
|
60691
61082
|
object({
|
|
60692
|
-
|
|
60693
|
-
|
|
60694
|
-
* Populated live from the upstream source on each state push.
|
|
60695
|
-
* Absent for unitless sensors. */
|
|
60696
|
-
unit: string().optional(),
|
|
60697
|
-
/** Suggested decimal places for numeric display.
|
|
60698
|
-
* Populated live from the upstream source when provided.
|
|
60699
|
-
* Falls back to auto-formatting when absent. */
|
|
60700
|
-
precision: number().int().min(0).max(10).optional(),
|
|
61083
|
+
/** Reading in the device quantity's base unit. `null` when refused (D393). */
|
|
61084
|
+
value: number().nullable().meta(readingMeta("device")),
|
|
60701
61085
|
/** Ms epoch when the slice was last updated. */
|
|
60702
61086
|
lastFetchedAt: number()
|
|
60703
61087
|
});
|
|
@@ -60987,23 +61371,26 @@ object({
|
|
|
60987
61371
|
/** Food currently in the bowl (grams). Null when the device has not
|
|
60988
61372
|
* reported a reading yet. On dual-hopper models this is the combined
|
|
60989
61373
|
* bowl reading; per-hopper levels live in `food1`/`food2`. */
|
|
60990
|
-
foodLevel: number().nullable(),
|
|
61374
|
+
foodLevel: number().nullable().meta(readingMeta("none")),
|
|
60991
61375
|
/** Hopper-1 food level (grams) on dual-hopper feeders; null on
|
|
60992
61376
|
* single-hopper models. */
|
|
60993
|
-
food1: number().nullable(),
|
|
61377
|
+
food1: number().nullable().meta(readingMeta("none")),
|
|
60994
61378
|
/** Hopper-2 food level (grams) on dual-hopper feeders; null on
|
|
60995
61379
|
* single-hopper models. */
|
|
60996
|
-
food2: number().nullable(),
|
|
61380
|
+
food2: number().nullable().meta(readingMeta("none")),
|
|
60997
61381
|
/** Derived low-food flag — mirrors the HA `food_level` binary_sensor
|
|
60998
61382
|
* (`device_class: problem`, on = low). True when the bowl is empty /
|
|
60999
61383
|
* below the feeder's low threshold. */
|
|
61000
61384
|
lowFood: boolean(),
|
|
61001
61385
|
/** Battery charge 0..100 (%). Null on mains-powered models or when the
|
|
61002
61386
|
* device has no battery reading. */
|
|
61003
|
-
batteryPower: number().min(0).max(100).nullable(),
|
|
61004
|
-
/**
|
|
61005
|
-
*
|
|
61006
|
-
|
|
61387
|
+
batteryPower: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
61388
|
+
/**
|
|
61389
|
+
* Desiccant life remaining, stored in seconds (duration base, D944).
|
|
61390
|
+
* Providers convert from the days the feeder reports. Null when the
|
|
61391
|
+
* model has no desiccant sensor.
|
|
61392
|
+
*/
|
|
61393
|
+
desiccantLeftDays: number().nullable().meta(readingMeta("duration")),
|
|
61007
61394
|
/** True while a feed is in progress. */
|
|
61008
61395
|
feeding: boolean(),
|
|
61009
61396
|
/** Decoded connectivity / power status (HA petkit device-status enum).
|
|
@@ -61014,7 +61401,7 @@ object({
|
|
|
61014
61401
|
* with `errorCode` for consumers that want the raw integer. */
|
|
61015
61402
|
error: string().nullable(),
|
|
61016
61403
|
/** Raw device error code (0 / null = no error). */
|
|
61017
|
-
errorCode: number().nullable(),
|
|
61404
|
+
errorCode: number().nullable().meta(readingMeta("none")),
|
|
61018
61405
|
/** True for D4S/D4SH dual-hopper hardware — gates the per-hopper UI. */
|
|
61019
61406
|
isDualHopper: boolean(),
|
|
61020
61407
|
/** Child-lock (manual-lock) setting — buttons on the unit are disabled. */
|
|
@@ -61024,7 +61411,7 @@ object({
|
|
|
61024
61411
|
/** Play a chime when dispensing. */
|
|
61025
61412
|
feedSound: boolean(),
|
|
61026
61413
|
/** Speaker / prompt volume level (device-scaled integer). */
|
|
61027
|
-
volume: number(),
|
|
61414
|
+
volume: number().meta(readingMeta("none")),
|
|
61028
61415
|
/** Ms epoch when the slice was last refreshed from the cloud. */
|
|
61029
61416
|
lastFetchedAt: number()
|
|
61030
61417
|
});
|
|
@@ -61461,36 +61848,19 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
|
|
|
61461
61848
|
});
|
|
61462
61849
|
object({
|
|
61463
61850
|
/** Instantaneous power draw in watts. */
|
|
61464
|
-
watts: number().optional().meta({
|
|
61465
|
-
unit: "W",
|
|
61466
|
-
label: "Power"
|
|
61467
|
-
}),
|
|
61851
|
+
watts: number().optional().meta(readingMeta("power", { label: "Power" })),
|
|
61468
61852
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
61469
|
-
kwhTotal: number().optional().meta({
|
|
61470
|
-
unit: "kWh",
|
|
61471
|
-
label: "Energy"
|
|
61472
|
-
}),
|
|
61853
|
+
kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
|
|
61473
61854
|
/** Voltage in volts. */
|
|
61474
|
-
volts: number().optional(),
|
|
61855
|
+
volts: number().optional().meta(readingMeta("voltage")),
|
|
61475
61856
|
/** Current in amperes. */
|
|
61476
|
-
amps: number().optional(),
|
|
61477
|
-
/** Apparent power in volt-amperes
|
|
61478
|
-
va: number().optional(),
|
|
61857
|
+
amps: number().optional().meta(readingMeta("current")),
|
|
61858
|
+
/** Apparent power in volt-amperes. */
|
|
61859
|
+
va: number().optional().meta(readingMeta("apparent-power")),
|
|
61479
61860
|
/** Power factor (0..1) if reported. */
|
|
61480
|
-
powerFactor: number().min(0).max(1).optional(),
|
|
61861
|
+
powerFactor: number().min(0).max(1).optional().meta(readingMeta("ratio")),
|
|
61481
61862
|
/** Ms epoch when the slice was last updated. */
|
|
61482
|
-
lastFetchedAt: number()
|
|
61483
|
-
/** Live display unit of the single metric this slice carries (e.g. HA
|
|
61484
|
-
* `attributes.unit_of_measurement` → 'V' / 'A' / 'W' / 'kW' / 'kWh').
|
|
61485
|
-
* Each upstream `sensor.*` entity surfaces ONE device_class, so one
|
|
61486
|
-
* unit per slice is unambiguous. The UI prefers this over the role's
|
|
61487
|
-
* canonical unit so a 'kW' / 'Wh' feed renders verbatim. */
|
|
61488
|
-
unit: string().optional(),
|
|
61489
|
-
/** Suggested decimal places for numeric display.
|
|
61490
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
61491
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
61492
|
-
* auto-formatting when absent. */
|
|
61493
|
-
precision: number().int().min(0).max(10).optional()
|
|
61863
|
+
lastFetchedAt: number()
|
|
61494
61864
|
});
|
|
61495
61865
|
DeviceType.Sensor;
|
|
61496
61866
|
/**
|
|
@@ -61511,11 +61881,11 @@ DeviceType.Sensor;
|
|
|
61511
61881
|
*/
|
|
61512
61882
|
var GpsLocationSchema = object({
|
|
61513
61883
|
/** Latitude in decimal degrees, -90..90. */
|
|
61514
|
-
latitude: number().min(-90).max(90),
|
|
61884
|
+
latitude: number().min(-90).max(90).meta(readingMeta("angle")),
|
|
61515
61885
|
/** Longitude in decimal degrees, -180..180. */
|
|
61516
|
-
longitude: number().min(-180).max(180),
|
|
61886
|
+
longitude: number().min(-180).max(180).meta(readingMeta("angle")),
|
|
61517
61887
|
/** Reported accuracy in meters (lower = better). */
|
|
61518
|
-
accuracyMeters: number().nonnegative()
|
|
61888
|
+
accuracyMeters: number().nonnegative().meta(readingMeta("length"))
|
|
61519
61889
|
});
|
|
61520
61890
|
object({
|
|
61521
61891
|
/** `home` / `not_home` / any user-defined zone name. */
|
|
@@ -61527,25 +61897,16 @@ object({
|
|
|
61527
61897
|
gps: GpsLocationSchema.nullable(),
|
|
61528
61898
|
/** Optional battery level of the tracking device (0..100). Null
|
|
61529
61899
|
* when not reported. */
|
|
61530
|
-
batteryPercent: number().min(0).max(100).nullable(),
|
|
61900
|
+
batteryPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
61531
61901
|
/** Ms epoch when the slice was last updated. */
|
|
61532
61902
|
lastChangedAt: number()
|
|
61533
61903
|
});
|
|
61534
61904
|
DeviceType.Presence;
|
|
61535
61905
|
object({
|
|
61536
|
-
/** Current pressure in hPa. */
|
|
61537
|
-
hpa: number(),
|
|
61906
|
+
/** Current pressure in hPa. `null` when the sample was refused (D393). */
|
|
61907
|
+
hpa: number().nullable().meta(readingMeta("pressure", { precision: 0 })),
|
|
61538
61908
|
/** Ms epoch when the slice was last updated. */
|
|
61539
|
-
lastFetchedAt: number()
|
|
61540
|
-
/** Live display unit from the upstream source (e.g. HA
|
|
61541
|
-
* `attributes.unit_of_measurement`). The UI prefers this over the
|
|
61542
|
-
* role's canonical unit. Absent → fall back to the canonical unit. */
|
|
61543
|
-
unit: string().optional(),
|
|
61544
|
-
/** Suggested decimal places for numeric display.
|
|
61545
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
61546
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
61547
|
-
* auto-formatting when absent. */
|
|
61548
|
-
precision: number().int().min(0).max(10).optional()
|
|
61909
|
+
lastFetchedAt: number()
|
|
61549
61910
|
});
|
|
61550
61911
|
DeviceType.Sensor;
|
|
61551
61912
|
/**
|
|
@@ -61878,8 +62239,8 @@ DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _
|
|
|
61878
62239
|
}), _void(), { kind: "mutation" });
|
|
61879
62240
|
var PtzAutotrackSettingsSchema = object({
|
|
61880
62241
|
targetType: string().describe("Vendor target string (people/vehicle/pet); empty = camera default"),
|
|
61881
|
-
stopDelaySeconds: number().int().min(0).max(300),
|
|
61882
|
-
disappearDelaySeconds: number().int().min(0).max(300)
|
|
62242
|
+
stopDelaySeconds: number().int().min(0).max(300).meta(readingMeta("duration")),
|
|
62243
|
+
disappearDelaySeconds: number().int().min(0).max(300).meta(readingMeta("duration"))
|
|
61883
62244
|
});
|
|
61884
62245
|
/**
|
|
61885
62246
|
* One option the camera advertises as a valid `targetType`. Drivers
|
|
@@ -61936,7 +62297,7 @@ object({
|
|
|
61936
62297
|
/** null = unknown — never coerced to false (D393). */
|
|
61937
62298
|
running: boolean().nullable(),
|
|
61938
62299
|
/** Epoch ms the current boolean began; null while `running` is null. */
|
|
61939
|
-
since: number().nullable(),
|
|
62300
|
+
since: number().nullable().meta(readingMeta("none")),
|
|
61940
62301
|
source: RunningStateSourceSchema.meta({ label: "Source" }),
|
|
61941
62302
|
phase: string().nullable(),
|
|
61942
62303
|
/** null until a reading has been published (D393). */
|
|
@@ -63134,9 +63495,9 @@ var RecordTriggerSchema = _enum([
|
|
|
63134
63495
|
*/
|
|
63135
63496
|
var RecordWindowSchema = object({
|
|
63136
63497
|
trigger: RecordTriggerSchema,
|
|
63137
|
-
day: number().int().min(0).max(6),
|
|
63138
|
-
startMinute: number().int().min(0).max(1439),
|
|
63139
|
-
endMinute: number().int().min(1).max(1440)
|
|
63498
|
+
day: number().int().min(0).max(6).meta(readingMeta("none")),
|
|
63499
|
+
startMinute: number().int().min(0).max(1439).meta(readingMeta("none")),
|
|
63500
|
+
endMinute: number().int().min(1).max(1440).meta(readingMeta("none"))
|
|
63140
63501
|
});
|
|
63141
63502
|
/** Status of one physical volume, as the camera itself describes it. */
|
|
63142
63503
|
var OnboardStorageVolumeSchema = object({
|
|
@@ -63205,10 +63566,10 @@ object({
|
|
|
63205
63566
|
/** Master "record to the card at all" switch. */
|
|
63206
63567
|
enabled: boolean().nullable(),
|
|
63207
63568
|
overwriteWhenFull: boolean().nullable(),
|
|
63208
|
-
preRecordSec: number().nullable(),
|
|
63209
|
-
postRecordSec: number().nullable(),
|
|
63569
|
+
preRecordSec: number().nullable().meta(readingMeta("duration")),
|
|
63570
|
+
postRecordSec: number().nullable().meta(readingMeta("duration")),
|
|
63210
63571
|
/** Length of one recorded file, in minutes. */
|
|
63211
|
-
segmentMinutes: number().nullable(),
|
|
63572
|
+
segmentMinutes: number().nullable().meta(readingMeta("none")),
|
|
63212
63573
|
/** The primary track's weekly windows, flattened. */
|
|
63213
63574
|
windows: array(RecordWindowSchema),
|
|
63214
63575
|
/**
|
|
@@ -63224,7 +63585,7 @@ object({
|
|
|
63224
63585
|
* provider reporting a non-zero count also reports the schedule as not
|
|
63225
63586
|
* writable.
|
|
63226
63587
|
*/
|
|
63227
|
-
unreadableWindows: number(),
|
|
63588
|
+
unreadableWindows: number().meta(readingMeta("count")),
|
|
63228
63589
|
/**
|
|
63229
63590
|
* The camera is scheduled to record and has NO usable storage.
|
|
63230
63591
|
*
|
|
@@ -63861,7 +64222,7 @@ var CamStreamDescriptorSchema = object({
|
|
|
63861
64222
|
url: string().optional(),
|
|
63862
64223
|
codec: string().optional(),
|
|
63863
64224
|
resolution: CamStreamResolutionSchema.optional(),
|
|
63864
|
-
fps: number().positive().optional(),
|
|
64225
|
+
fps: number().positive().optional().meta(readingMeta("rate")),
|
|
63865
64226
|
label: string().optional(),
|
|
63866
64227
|
/** Device-level features (e.g. `battery-operated`) — drives broker policy. */
|
|
63867
64228
|
deviceFeatures: array(string()).optional(),
|
|
@@ -63891,18 +64252,18 @@ var StreamProfileSchema = _enum([
|
|
|
63891
64252
|
]);
|
|
63892
64253
|
/** The current encoding config of one stream profile. */
|
|
63893
64254
|
var StreamProfileConfigSchema = object({
|
|
63894
|
-
width: number(),
|
|
63895
|
-
height: number(),
|
|
64255
|
+
width: number().meta(readingMeta("none")),
|
|
64256
|
+
height: number().meta(readingMeta("none")),
|
|
63896
64257
|
codec: _enum(["h264", "h265"]),
|
|
63897
|
-
framerate: number(),
|
|
63898
|
-
bitrate: number(),
|
|
64258
|
+
framerate: number().meta(readingMeta("rate")),
|
|
64259
|
+
bitrate: number().meta(readingMeta("bitrate")),
|
|
63899
64260
|
bitrateMode: _enum(["vbr", "cbr"]).optional(),
|
|
63900
64261
|
encoderProfile: _enum([
|
|
63901
64262
|
"high",
|
|
63902
64263
|
"main",
|
|
63903
64264
|
"baseline"
|
|
63904
64265
|
]).optional(),
|
|
63905
|
-
gop: number().optional(),
|
|
64266
|
+
gop: number().optional().meta(readingMeta("none")),
|
|
63906
64267
|
/**
|
|
63907
64268
|
* Whether THIS profile currently carries an audio track. READ-ONLY here.
|
|
63908
64269
|
*
|
|
@@ -64545,23 +64906,13 @@ object({
|
|
|
64545
64906
|
});
|
|
64546
64907
|
DeviceType.Sensor;
|
|
64547
64908
|
object({
|
|
64548
|
-
/** Current temperature in Celsius. */
|
|
64549
|
-
celsius: number().meta({
|
|
64550
|
-
|
|
64909
|
+
/** Current temperature in Celsius. `null` when the sample was refused (D393). */
|
|
64910
|
+
celsius: number().nullable().meta(readingMeta("temperature", {
|
|
64911
|
+
precision: 1,
|
|
64551
64912
|
label: "Temperature"
|
|
64552
|
-
}),
|
|
64913
|
+
})),
|
|
64553
64914
|
/** Ms epoch when the slice was last updated (push or poll). */
|
|
64554
|
-
lastFetchedAt: number()
|
|
64555
|
-
/** Live display unit from the upstream source (e.g. HA
|
|
64556
|
-
* `attributes.unit_of_measurement`). The UI prefers this over the
|
|
64557
|
-
* role's canonical unit, so a Fahrenheit feed renders '°F' not '°C'.
|
|
64558
|
-
* Absent → the UI falls back to the role's canonical unit. */
|
|
64559
|
-
unit: string().optional(),
|
|
64560
|
-
/** Suggested decimal places for numeric display.
|
|
64561
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
64562
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
64563
|
-
* auto-formatting when absent. */
|
|
64564
|
-
precision: number().int().min(0).max(10).optional()
|
|
64915
|
+
lastFetchedAt: number()
|
|
64565
64916
|
});
|
|
64566
64917
|
DeviceType.Sensor, DeviceType.Thermostat;
|
|
64567
64918
|
/**
|
|
@@ -64813,16 +65164,16 @@ object({
|
|
|
64813
65164
|
]),
|
|
64814
65165
|
/** 0..100 battery percentage. Null when the device has no battery
|
|
64815
65166
|
* reading. */
|
|
64816
|
-
batteryLevel: number().min(0).max(100).nullable(),
|
|
65167
|
+
batteryLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
64817
65168
|
/** Current fan-speed token (provider-verbatim). Null when unknown or
|
|
64818
65169
|
* the vacuum has no speed control. */
|
|
64819
65170
|
fanSpeed: string().nullable(),
|
|
64820
65171
|
/** Speed tokens the hardware accepts — drives the UI selector. */
|
|
64821
65172
|
availableFanSpeeds: array(string()),
|
|
64822
65173
|
/** 0..100 cleaning-completion percentage of the current task, or null. */
|
|
64823
|
-
progressPercent: number().min(0).max(100).nullable(),
|
|
65174
|
+
progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
64824
65175
|
/** Current error code (0 / null = no error). */
|
|
64825
|
-
errorCode: number().nullable(),
|
|
65176
|
+
errorCode: number().nullable().meta(readingMeta("none")),
|
|
64826
65177
|
/** Human label for {@link errorCode}, or null when none / undecodable. */
|
|
64827
65178
|
errorLabel: string().nullable(),
|
|
64828
65179
|
/** Ms epoch when the slice was last updated. */
|
|
@@ -64861,7 +65212,7 @@ object({
|
|
|
64861
65212
|
]),
|
|
64862
65213
|
/** 0 = fully closed, 100 = fully open. Null when the device has no
|
|
64863
65214
|
* intermediate position surface. */
|
|
64864
|
-
position: number().min(0).max(100).nullable(),
|
|
65215
|
+
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
64865
65216
|
/** Ms epoch when the slice was last updated. */
|
|
64866
65217
|
lastChangedAt: number()
|
|
64867
65218
|
});
|
|
@@ -64889,9 +65240,9 @@ object({
|
|
|
64889
65240
|
DeviceType.Sensor;
|
|
64890
65241
|
object({
|
|
64891
65242
|
/** Current measured temperature. Null when not reported. */
|
|
64892
|
-
currentTemp: number().nullable(),
|
|
65243
|
+
currentTemp: number().nullable().meta(readingMeta("temperature")),
|
|
64893
65244
|
/** Target temperature setpoint. Null when no setpoint surface. */
|
|
64894
|
-
targetTemp: number().nullable(),
|
|
65245
|
+
targetTemp: number().nullable().meta(readingMeta("temperature")),
|
|
64895
65246
|
/** Active operation mode = HA `state` (`eco` / `electric` / `gas` /
|
|
64896
65247
|
* `heat_pump` / `high_demand` / `performance` / `off`). Null when the
|
|
64897
65248
|
* device reports an unknown state. */
|
|
@@ -64902,9 +65253,9 @@ object({
|
|
|
64902
65253
|
* has no away surface. */
|
|
64903
65254
|
away: boolean().nullable(),
|
|
64904
65255
|
/** HA `min_temp` attribute. Null when not reported. */
|
|
64905
|
-
minTemp: number().nullable(),
|
|
65256
|
+
minTemp: number().nullable().meta(readingMeta("temperature")),
|
|
64906
65257
|
/** HA `max_temp` attribute. Null when not reported. */
|
|
64907
|
-
maxTemp: number().nullable(),
|
|
65258
|
+
maxTemp: number().nullable().meta(readingMeta("temperature")),
|
|
64908
65259
|
/** Ms epoch when the slice was last updated. */
|
|
64909
65260
|
lastChangedAt: number()
|
|
64910
65261
|
});
|
|
@@ -64928,25 +65279,18 @@ DeviceType.WaterHeater, method(object({
|
|
|
64928
65279
|
auth: "protected"
|
|
64929
65280
|
});
|
|
64930
65281
|
object({
|
|
64931
|
-
/** Verbatim
|
|
64932
|
-
* when no condition has been reported yet. */
|
|
65282
|
+
/** Verbatim condition state (`sunny`, `cloudy`, `rainy`, …). Null when none yet. */
|
|
64933
65283
|
condition: string().nullable(),
|
|
64934
|
-
/** Current temperature in
|
|
64935
|
-
temperature: number().nullable(),
|
|
64936
|
-
/** Temperature unit string (e.g. `°C` / `°F`). Null when not provided. */
|
|
64937
|
-
temperatureUnit: string().nullable(),
|
|
65284
|
+
/** Current temperature in Celsius. Null when not provided or refused. */
|
|
65285
|
+
temperature: number().nullable().meta(readingMeta("temperature", { precision: 1 })),
|
|
64938
65286
|
/** Relative humidity (0..100). Null when not provided. */
|
|
64939
|
-
humidity: number().min(0).max(100).nullable(),
|
|
64940
|
-
/** Barometric pressure in
|
|
64941
|
-
pressure: number().nullable(),
|
|
64942
|
-
/**
|
|
64943
|
-
|
|
64944
|
-
/** Wind speed in the reported unit. Null when not provided. */
|
|
64945
|
-
windSpeed: number().nullable(),
|
|
64946
|
-
/** Wind-speed unit string (e.g. `km/h` / `mph`). Null when not provided. */
|
|
64947
|
-
windSpeedUnit: string().nullable(),
|
|
65287
|
+
humidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
65288
|
+
/** Barometric pressure in hPa. Null when not provided or refused. */
|
|
65289
|
+
pressure: number().nullable().meta(readingMeta("pressure")),
|
|
65290
|
+
/** Wind speed in metres per second. Null when not provided or refused. */
|
|
65291
|
+
windSpeed: number().nullable().meta(readingMeta("speed")),
|
|
64948
65292
|
/** Wind bearing in degrees (0..360, meteorological). Null when not provided. */
|
|
64949
|
-
windBearing: number().nullable(),
|
|
65293
|
+
windBearing: number().nullable().meta(readingMeta("angle")),
|
|
64950
65294
|
/** Ms epoch when the slice was last updated. */
|
|
64951
65295
|
lastFetchedAt: number()
|
|
64952
65296
|
});
|
|
@@ -65858,6 +66202,13 @@ Object.freeze({
|
|
|
65858
66202
|
access: "view",
|
|
65859
66203
|
role: "admin"
|
|
65860
66204
|
},
|
|
66205
|
+
"addons.getPackageDocs": {
|
|
66206
|
+
capName: "addons",
|
|
66207
|
+
capScope: "system",
|
|
66208
|
+
addonId: null,
|
|
66209
|
+
access: "view",
|
|
66210
|
+
role: "admin"
|
|
66211
|
+
},
|
|
65861
66212
|
"addons.getVersions": {
|
|
65862
66213
|
capName: "addons",
|
|
65863
66214
|
capScope: "system",
|
|
@@ -68966,6 +69317,20 @@ Object.freeze({
|
|
|
68966
69317
|
access: "view",
|
|
68967
69318
|
role: "viewer"
|
|
68968
69319
|
},
|
|
69320
|
+
"groupCommands.getStatus": {
|
|
69321
|
+
capName: "group-commands",
|
|
69322
|
+
capScope: "device",
|
|
69323
|
+
addonId: null,
|
|
69324
|
+
access: "view",
|
|
69325
|
+
role: "viewer"
|
|
69326
|
+
},
|
|
69327
|
+
"groupStatus.getStatus": {
|
|
69328
|
+
capName: "group-status",
|
|
69329
|
+
capScope: "device",
|
|
69330
|
+
addonId: null,
|
|
69331
|
+
access: "view",
|
|
69332
|
+
role: "viewer"
|
|
69333
|
+
},
|
|
68969
69334
|
"heatingValve.getStatus": {
|
|
68970
69335
|
capName: "heating-valve",
|
|
68971
69336
|
capScope: "device",
|
|
@@ -78788,6 +79153,37 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78788
79153
|
icon: "flame"
|
|
78789
79154
|
}]
|
|
78790
79155
|
},
|
|
79156
|
+
"group-commands": {
|
|
79157
|
+
scope: "device",
|
|
79158
|
+
noun: t("Group command", "Comando di gruppo")
|
|
79159
|
+
},
|
|
79160
|
+
"group-status": {
|
|
79161
|
+
scope: "device",
|
|
79162
|
+
noun: t("Group", "Gruppo"),
|
|
79163
|
+
state: [
|
|
79164
|
+
{
|
|
79165
|
+
kind: "numeric",
|
|
79166
|
+
field: "included",
|
|
79167
|
+
quantity: t("the members reporting", "i membri che rispondono"),
|
|
79168
|
+
label: t("Reporting", "Rispondono"),
|
|
79169
|
+
icon: "users"
|
|
79170
|
+
},
|
|
79171
|
+
{
|
|
79172
|
+
kind: "numeric",
|
|
79173
|
+
field: "excluded",
|
|
79174
|
+
quantity: t("the members left out", "i membri esclusi"),
|
|
79175
|
+
label: t("Excluded", "Esclusi"),
|
|
79176
|
+
icon: "users"
|
|
79177
|
+
},
|
|
79178
|
+
{
|
|
79179
|
+
kind: "numeric",
|
|
79180
|
+
field: "total",
|
|
79181
|
+
quantity: t("the member count", "il numero di membri"),
|
|
79182
|
+
label: t("Members", "Membri"),
|
|
79183
|
+
icon: "sigma"
|
|
79184
|
+
}
|
|
79185
|
+
]
|
|
79186
|
+
},
|
|
78791
79187
|
"humidity-sensor": {
|
|
78792
79188
|
scope: "device",
|
|
78793
79189
|
noun: t("Humidity", "Umidità"),
|
|
@@ -78821,7 +79217,6 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78821
79217
|
field: "value",
|
|
78822
79218
|
quantity: t("the reading", "il valore"),
|
|
78823
79219
|
label: t("Reading", "Valore"),
|
|
78824
|
-
unitField: "unit",
|
|
78825
79220
|
icon: "gauge"
|
|
78826
79221
|
}]
|
|
78827
79222
|
},
|
|
@@ -78957,7 +79352,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78957
79352
|
field: "temperature",
|
|
78958
79353
|
quantity: t("the outdoor temperature", "la temperatura esterna"),
|
|
78959
79354
|
label: t("Temperature", "Temperatura"),
|
|
78960
|
-
|
|
79355
|
+
unit: "°C",
|
|
78961
79356
|
icon: "thermometer"
|
|
78962
79357
|
},
|
|
78963
79358
|
{
|
|
@@ -78973,7 +79368,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78973
79368
|
field: "windSpeed",
|
|
78974
79369
|
quantity: t("the wind speed", "la velocità del vento"),
|
|
78975
79370
|
label: t("Wind", "Vento"),
|
|
78976
|
-
|
|
79371
|
+
unit: "m/s",
|
|
78977
79372
|
icon: "wind"
|
|
78978
79373
|
},
|
|
78979
79374
|
{
|
|
@@ -78981,7 +79376,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78981
79376
|
field: "pressure",
|
|
78982
79377
|
quantity: t("the air pressure", "la pressione atmosferica"),
|
|
78983
79378
|
label: t("Pressure", "Pressione"),
|
|
78984
|
-
|
|
79379
|
+
unit: "hPa",
|
|
78985
79380
|
icon: "gauge"
|
|
78986
79381
|
}
|
|
78987
79382
|
]
|
|
@@ -80254,6 +80649,16 @@ Object.freeze({
|
|
|
80254
80649
|
form: "single",
|
|
80255
80650
|
optional: false
|
|
80256
80651
|
}],
|
|
80652
|
+
"groupCommands.getStatus": [{
|
|
80653
|
+
name: "deviceId",
|
|
80654
|
+
form: "single",
|
|
80655
|
+
optional: false
|
|
80656
|
+
}],
|
|
80657
|
+
"groupStatus.getStatus": [{
|
|
80658
|
+
name: "deviceId",
|
|
80659
|
+
form: "single",
|
|
80660
|
+
optional: false
|
|
80661
|
+
}],
|
|
80257
80662
|
"heatingValve.getStatus": [{
|
|
80258
80663
|
name: "deviceId",
|
|
80259
80664
|
form: "single",
|
|
@@ -82238,6 +82643,8 @@ new Map(Object.entries({
|
|
|
82238
82643
|
"detection-blind": "device-events",
|
|
82239
82644
|
"motion-noisy": "device-events",
|
|
82240
82645
|
"motion-calm": "device-events",
|
|
82646
|
+
"package-llm-silent": "device-events",
|
|
82647
|
+
"package-llm-answered": "device-events",
|
|
82241
82648
|
"recording-stalled": "device-events",
|
|
82242
82649
|
"recording-healthy": "device-events",
|
|
82243
82650
|
"recording-degraded": "device-events",
|
|
@@ -82321,6 +82728,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
82321
82728
|
label: "Motion without a subject",
|
|
82322
82729
|
kinds: ["motion-noisy", "motion-calm"]
|
|
82323
82730
|
},
|
|
82731
|
+
{
|
|
82732
|
+
id: "package-llm",
|
|
82733
|
+
family: "device-events",
|
|
82734
|
+
label: "Package confirm",
|
|
82735
|
+
kinds: ["package-llm-silent", "package-llm-answered"]
|
|
82736
|
+
},
|
|
82324
82737
|
{
|
|
82325
82738
|
id: "recording",
|
|
82326
82739
|
family: "device-events",
|
|
@@ -82502,6 +82915,8 @@ var DEVICE_EVENTS = [
|
|
|
82502
82915
|
"detection-blind",
|
|
82503
82916
|
"motion-noisy",
|
|
82504
82917
|
"motion-calm",
|
|
82918
|
+
"package-llm-silent",
|
|
82919
|
+
"package-llm-answered",
|
|
82505
82920
|
"recording-stalled",
|
|
82506
82921
|
"recording-healthy",
|
|
82507
82922
|
"recording-degraded",
|
|
@@ -82770,6 +83185,15 @@ new Map([
|
|
|
82770
83185
|
snapshotLabel: "Cameras with constant motion now",
|
|
82771
83186
|
snapshotSection: null
|
|
82772
83187
|
},
|
|
83188
|
+
{
|
|
83189
|
+
id: "package-llm-confirm",
|
|
83190
|
+
family: "device-events",
|
|
83191
|
+
label: "Package confirm (not answering / answering again)",
|
|
83192
|
+
bad: ["package-llm-silent"],
|
|
83193
|
+
recovery: ["package-llm-answered"],
|
|
83194
|
+
snapshotLabel: "Cameras whose package confirm is not answering",
|
|
83195
|
+
snapshotSection: null
|
|
83196
|
+
},
|
|
82773
83197
|
{
|
|
82774
83198
|
id: "recording-health",
|
|
82775
83199
|
family: "device-events",
|