@camstack/addon-osd-manager 0.1.270 → 0.1.272
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{MotionZonesSettings-CVom9abm.mjs → MotionZonesSettings-DO_rCcth.mjs} +26 -26
- package/dist/{PrivacyMaskSettings-Bo-mhwY3.mjs → PrivacyMaskSettings-CayY5BmJ.mjs} +34 -34
- package/dist/{SceneMonitorEditor-jI0DFCps.mjs → SceneMonitorEditor-L-q8wwb4.mjs} +37 -37
- package/dist/_stub.js +4136 -4150
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-yQC--34-.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-D-aTY-A7.mjs} +4 -4
- package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BBm95C74.mjs +26 -0
- package/dist/{hostInit-Dlnxz_Xy.mjs → hostInit-NSw9ILTo.mjs} +3 -3
- package/dist/index.js +427 -422
- package/dist/index.mjs +427 -422
- package/dist/{player-overlays-CVErPzOI.mjs → player-overlays-C7qgUCpt.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-DvKLz6tZ.mjs → responsive-PTiwxSHa.mjs} +13 -10
- package/dist/{scene-monitor-copy-CFMKYWvN.mjs → scene-monitor-copy-BOMlNMKs.mjs} +1 -1
- package/dist/{square-7EBGU9cd.mjs → square-bnP3Db28.mjs} +1 -1
- package/dist/{trash-2-CL68AGsL.mjs → trash-2-DJvcr3Yh.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-CVDDDDPu.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-CySnUJzK.mjs} +1 -1
- package/package.json +7 -2
- package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-eQtDkbeP.mjs +0 -26
package/dist/index.js
CHANGED
|
@@ -5437,7 +5437,7 @@ var ZodIssueCode = {
|
|
|
5437
5437
|
var ZodFirstPartyTypeKind;
|
|
5438
5438
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5439
5439
|
//#endregion
|
|
5440
|
-
//#region ../types/dist/sleep-
|
|
5440
|
+
//#region ../types/dist/sleep-CARd6wZF.mjs
|
|
5441
5441
|
/**
|
|
5442
5442
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5443
5443
|
* window to float samples (D455).
|
|
@@ -7924,6 +7924,52 @@ var RecordKindDeclarationSchema = object({
|
|
|
7924
7924
|
}).strict();
|
|
7925
7925
|
/** The kind names: lower-case, dash separated, short enough for an index name. */
|
|
7926
7926
|
var RecordKindNameSchema = string().regex(/^[a-z][a-z0-9-]{0,47}$/);
|
|
7927
|
+
var READING_QUANTITIES = [
|
|
7928
|
+
"temperature",
|
|
7929
|
+
"pressure",
|
|
7930
|
+
"speed",
|
|
7931
|
+
"precipitation",
|
|
7932
|
+
"precipitation-rate",
|
|
7933
|
+
"length",
|
|
7934
|
+
"area",
|
|
7935
|
+
"illuminance",
|
|
7936
|
+
"irradiance",
|
|
7937
|
+
"power",
|
|
7938
|
+
"energy",
|
|
7939
|
+
"voltage",
|
|
7940
|
+
"current",
|
|
7941
|
+
"apparent-power",
|
|
7942
|
+
"humidity",
|
|
7943
|
+
"percentage",
|
|
7944
|
+
"concentration-volume",
|
|
7945
|
+
"concentration-mass",
|
|
7946
|
+
"concentration-ppb",
|
|
7947
|
+
"volume",
|
|
7948
|
+
"duration",
|
|
7949
|
+
"duration-ms",
|
|
7950
|
+
"information",
|
|
7951
|
+
"sound-level",
|
|
7952
|
+
"signal-level",
|
|
7953
|
+
"colour-temperature",
|
|
7954
|
+
"angle",
|
|
7955
|
+
"bitrate",
|
|
7956
|
+
"rate",
|
|
7957
|
+
"mass",
|
|
7958
|
+
"index",
|
|
7959
|
+
"ratio",
|
|
7960
|
+
"count",
|
|
7961
|
+
"none",
|
|
7962
|
+
"device"
|
|
7963
|
+
];
|
|
7964
|
+
var ReadingQuantitySchema = _enum(READING_QUANTITIES);
|
|
7965
|
+
new Set(READING_QUANTITIES);
|
|
7966
|
+
function readingMeta(quantity, extras) {
|
|
7967
|
+
return {
|
|
7968
|
+
quantity,
|
|
7969
|
+
...extras?.precision !== void 0 ? { precision: extras.precision } : {},
|
|
7970
|
+
...extras?.label !== void 0 ? { label: extras.label } : {}
|
|
7971
|
+
};
|
|
7972
|
+
}
|
|
7927
7973
|
/** Shared Zod schemas used across streaming capabilities. */
|
|
7928
7974
|
var CamProfileSchema = _enum([
|
|
7929
7975
|
"high",
|
|
@@ -7951,8 +7997,8 @@ var CamStreamKindSchema = _enum([
|
|
|
7951
7997
|
"derived"
|
|
7952
7998
|
]);
|
|
7953
7999
|
var CamStreamResolutionSchema = object({
|
|
7954
|
-
width: number().int().positive(),
|
|
7955
|
-
height: number().int().positive()
|
|
8000
|
+
width: number().int().positive().meta(readingMeta("none")),
|
|
8001
|
+
height: number().int().positive().meta(readingMeta("none"))
|
|
7956
8002
|
});
|
|
7957
8003
|
var CameraStreamSchema = object({
|
|
7958
8004
|
/** Stable, provider-assigned id unique within the (deviceId) scope. */
|
|
@@ -8596,14 +8642,6 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
8596
8642
|
{
|
|
8597
8643
|
"path": "aqi",
|
|
8598
8644
|
"valueType": "number"
|
|
8599
|
-
},
|
|
8600
|
-
{
|
|
8601
|
-
"path": "unit",
|
|
8602
|
-
"valueType": "string"
|
|
8603
|
-
},
|
|
8604
|
-
{
|
|
8605
|
-
"path": "precision",
|
|
8606
|
-
"valueType": "number"
|
|
8607
8645
|
}
|
|
8608
8646
|
],
|
|
8609
8647
|
"alarm-panel": [
|
|
@@ -8639,20 +8677,10 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
8639
8677
|
"valueType": "boolean"
|
|
8640
8678
|
}
|
|
8641
8679
|
],
|
|
8642
|
-
"ambient-light-sensor": [
|
|
8643
|
-
|
|
8644
|
-
|
|
8645
|
-
|
|
8646
|
-
},
|
|
8647
|
-
{
|
|
8648
|
-
"path": "unit",
|
|
8649
|
-
"valueType": "string"
|
|
8650
|
-
},
|
|
8651
|
-
{
|
|
8652
|
-
"path": "precision",
|
|
8653
|
-
"valueType": "number"
|
|
8654
|
-
}
|
|
8655
|
-
],
|
|
8680
|
+
"ambient-light-sensor": [{
|
|
8681
|
+
"path": "lux",
|
|
8682
|
+
"valueType": "number"
|
|
8683
|
+
}],
|
|
8656
8684
|
"audio-metrics": [
|
|
8657
8685
|
{
|
|
8658
8686
|
"path": "ts",
|
|
@@ -8732,6 +8760,10 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
8732
8760
|
"path": "lastUpdated",
|
|
8733
8761
|
"valueType": "number"
|
|
8734
8762
|
},
|
|
8763
|
+
{
|
|
8764
|
+
"path": "volts",
|
|
8765
|
+
"valueType": "number"
|
|
8766
|
+
},
|
|
8735
8767
|
{
|
|
8736
8768
|
"path": "lastContactAt",
|
|
8737
8769
|
"valueType": "number"
|
|
@@ -8974,10 +9006,6 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
8974
9006
|
"datetime"
|
|
8975
9007
|
]
|
|
8976
9008
|
},
|
|
8977
|
-
{
|
|
8978
|
-
"path": "unit",
|
|
8979
|
-
"valueType": "string"
|
|
8980
|
-
},
|
|
8981
9009
|
{
|
|
8982
9010
|
"path": "min",
|
|
8983
9011
|
"valueType": "number"
|
|
@@ -8989,19 +9017,6 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
8989
9017
|
{
|
|
8990
9018
|
"path": "step",
|
|
8991
9019
|
"valueType": "number"
|
|
8992
|
-
},
|
|
8993
|
-
{
|
|
8994
|
-
"path": "precision",
|
|
8995
|
-
"valueType": "number"
|
|
8996
|
-
},
|
|
8997
|
-
{
|
|
8998
|
-
"path": "format",
|
|
8999
|
-
"valueType": "enum",
|
|
9000
|
-
"enumValues": [
|
|
9001
|
-
"date",
|
|
9002
|
-
"time",
|
|
9003
|
-
"datetime"
|
|
9004
|
-
]
|
|
9005
9020
|
}
|
|
9006
9021
|
],
|
|
9007
9022
|
"cover": [
|
|
@@ -9242,13 +9257,8 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
9242
9257
|
"path": "value",
|
|
9243
9258
|
"valueType": "string"
|
|
9244
9259
|
}, {
|
|
9245
|
-
"path": "
|
|
9246
|
-
"valueType": "
|
|
9247
|
-
"enumValues": [
|
|
9248
|
-
"date",
|
|
9249
|
-
"time",
|
|
9250
|
-
"datetime"
|
|
9251
|
-
]
|
|
9260
|
+
"path": "timestamp",
|
|
9261
|
+
"valueType": "boolean"
|
|
9252
9262
|
}],
|
|
9253
9263
|
"event-emitter": [
|
|
9254
9264
|
{
|
|
@@ -9355,20 +9365,10 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
9355
9365
|
"valueType": "number"
|
|
9356
9366
|
}
|
|
9357
9367
|
],
|
|
9358
|
-
"humidity-sensor": [
|
|
9359
|
-
|
|
9360
|
-
|
|
9361
|
-
|
|
9362
|
-
},
|
|
9363
|
-
{
|
|
9364
|
-
"path": "unit",
|
|
9365
|
-
"valueType": "string"
|
|
9366
|
-
},
|
|
9367
|
-
{
|
|
9368
|
-
"path": "precision",
|
|
9369
|
-
"valueType": "number"
|
|
9370
|
-
}
|
|
9371
|
-
],
|
|
9368
|
+
"humidity-sensor": [{
|
|
9369
|
+
"path": "percent",
|
|
9370
|
+
"valueType": "number"
|
|
9371
|
+
}],
|
|
9372
9372
|
"image": [{
|
|
9373
9373
|
"path": "url",
|
|
9374
9374
|
"valueType": "string"
|
|
@@ -9707,20 +9707,10 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
9707
9707
|
"valueType": "boolean"
|
|
9708
9708
|
}
|
|
9709
9709
|
],
|
|
9710
|
-
"numeric-sensor": [
|
|
9711
|
-
|
|
9712
|
-
|
|
9713
|
-
|
|
9714
|
-
},
|
|
9715
|
-
{
|
|
9716
|
-
"path": "unit",
|
|
9717
|
-
"valueType": "string"
|
|
9718
|
-
},
|
|
9719
|
-
{
|
|
9720
|
-
"path": "precision",
|
|
9721
|
-
"valueType": "number"
|
|
9722
|
-
}
|
|
9723
|
-
],
|
|
9710
|
+
"numeric-sensor": [{
|
|
9711
|
+
"path": "value",
|
|
9712
|
+
"valueType": "number"
|
|
9713
|
+
}],
|
|
9724
9714
|
"pet-feeder": [
|
|
9725
9715
|
{
|
|
9726
9716
|
"path": "foodLevel",
|
|
@@ -9812,14 +9802,6 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
9812
9802
|
{
|
|
9813
9803
|
"path": "powerFactor",
|
|
9814
9804
|
"valueType": "number"
|
|
9815
|
-
},
|
|
9816
|
-
{
|
|
9817
|
-
"path": "unit",
|
|
9818
|
-
"valueType": "string"
|
|
9819
|
-
},
|
|
9820
|
-
{
|
|
9821
|
-
"path": "precision",
|
|
9822
|
-
"valueType": "number"
|
|
9823
9805
|
}
|
|
9824
9806
|
],
|
|
9825
9807
|
"presence": [
|
|
@@ -9848,20 +9830,10 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
9848
9830
|
"valueType": "number"
|
|
9849
9831
|
}
|
|
9850
9832
|
],
|
|
9851
|
-
"pressure-sensor": [
|
|
9852
|
-
|
|
9853
|
-
|
|
9854
|
-
|
|
9855
|
-
},
|
|
9856
|
-
{
|
|
9857
|
-
"path": "unit",
|
|
9858
|
-
"valueType": "string"
|
|
9859
|
-
},
|
|
9860
|
-
{
|
|
9861
|
-
"path": "precision",
|
|
9862
|
-
"valueType": "number"
|
|
9863
|
-
}
|
|
9864
|
-
],
|
|
9833
|
+
"pressure-sensor": [{
|
|
9834
|
+
"path": "hpa",
|
|
9835
|
+
"valueType": "number"
|
|
9836
|
+
}],
|
|
9865
9837
|
"privacy-mask": [{
|
|
9866
9838
|
"path": "enabled",
|
|
9867
9839
|
"valueType": "boolean"
|
|
@@ -10172,20 +10144,10 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
10172
10144
|
"path": "tampered",
|
|
10173
10145
|
"valueType": "boolean"
|
|
10174
10146
|
}],
|
|
10175
|
-
"temperature-sensor": [
|
|
10176
|
-
|
|
10177
|
-
|
|
10178
|
-
|
|
10179
|
-
},
|
|
10180
|
-
{
|
|
10181
|
-
"path": "unit",
|
|
10182
|
-
"valueType": "string"
|
|
10183
|
-
},
|
|
10184
|
-
{
|
|
10185
|
-
"path": "precision",
|
|
10186
|
-
"valueType": "number"
|
|
10187
|
-
}
|
|
10188
|
-
],
|
|
10147
|
+
"temperature-sensor": [{
|
|
10148
|
+
"path": "celsius",
|
|
10149
|
+
"valueType": "number"
|
|
10150
|
+
}],
|
|
10189
10151
|
"update": [
|
|
10190
10152
|
{
|
|
10191
10153
|
"path": "currentVersion",
|
|
@@ -10296,10 +10258,6 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
10296
10258
|
"path": "temperature",
|
|
10297
10259
|
"valueType": "number"
|
|
10298
10260
|
},
|
|
10299
|
-
{
|
|
10300
|
-
"path": "temperatureUnit",
|
|
10301
|
-
"valueType": "string"
|
|
10302
|
-
},
|
|
10303
10261
|
{
|
|
10304
10262
|
"path": "humidity",
|
|
10305
10263
|
"valueType": "number"
|
|
@@ -10308,18 +10266,10 @@ var CAP_STATE_LEAVES = Object.freeze({
|
|
|
10308
10266
|
"path": "pressure",
|
|
10309
10267
|
"valueType": "number"
|
|
10310
10268
|
},
|
|
10311
|
-
{
|
|
10312
|
-
"path": "pressureUnit",
|
|
10313
|
-
"valueType": "string"
|
|
10314
|
-
},
|
|
10315
10269
|
{
|
|
10316
10270
|
"path": "windSpeed",
|
|
10317
10271
|
"valueType": "number"
|
|
10318
10272
|
},
|
|
10319
|
-
{
|
|
10320
|
-
"path": "windSpeedUnit",
|
|
10321
|
-
"valueType": "string"
|
|
10322
|
-
},
|
|
10323
10273
|
{
|
|
10324
10274
|
"path": "windBearing",
|
|
10325
10275
|
"valueType": "number"
|
|
@@ -17684,7 +17634,8 @@ var CompositionProblemSchema = object({
|
|
|
17684
17634
|
"item-field-reserved",
|
|
17685
17635
|
"target-missing",
|
|
17686
17636
|
"target-unreadable",
|
|
17687
|
-
"not-replaceable"
|
|
17637
|
+
"not-replaceable",
|
|
17638
|
+
"native-capability-replace"
|
|
17688
17639
|
]),
|
|
17689
17640
|
path: string(),
|
|
17690
17641
|
message: string()
|
|
@@ -17742,9 +17693,11 @@ var CompositionFieldPlanSchema = object({
|
|
|
17742
17693
|
reads: array(CompositionFieldReadSchema)
|
|
17743
17694
|
});
|
|
17744
17695
|
/**
|
|
17745
|
-
* What a feature does to its target (D663): `new` builds a capability on a
|
|
17746
|
-
* device; on an existing device it `add`s a capability the device lacks
|
|
17747
|
-
*
|
|
17696
|
+
* What a feature does to its target (D663, D944): `new` builds a capability on a
|
|
17697
|
+
* new device; on an existing device it `add`s a capability the device lacks.
|
|
17698
|
+
* Replacing a capability the device already serves is refused
|
|
17699
|
+
* (`native-capability-replace`), not planned. `replace` remains on the claim
|
|
17700
|
+
* wire for a claim the hub already holds.
|
|
17748
17701
|
*/
|
|
17749
17702
|
var CompositionFeatureModeSchema = _enum([
|
|
17750
17703
|
"new",
|
|
@@ -19630,12 +19583,12 @@ method(object({ deviceId: number().int().nonnegative() }), DeviceAdminLinkSchema
|
|
|
19630
19583
|
* providers detect renames by matching `uniqueId` and patch `id`
|
|
19631
19584
|
* in-place so dispatch keeps working.
|
|
19632
19585
|
*
|
|
19633
|
-
* **
|
|
19634
|
-
*
|
|
19635
|
-
*
|
|
19636
|
-
*
|
|
19637
|
-
* (`ha-domain-mapping`)
|
|
19638
|
-
* stored after that point.
|
|
19586
|
+
* **Display unit and precision are NOT stored here.** They are a read-time
|
|
19587
|
+
* preference (D944). A polymorphic reading stores its `quantity` here once,
|
|
19588
|
+
* at adopt, and a date/time value stores `dateTimeShape` the same way —
|
|
19589
|
+
* neither is repeated on each sample. The `device_class` tag is an
|
|
19590
|
+
* HA-specific input consumed at the discovery boundary (`ha-domain-mapping`)
|
|
19591
|
+
* to derive the CamStack `DeviceRole`; it is never stored after that point.
|
|
19639
19592
|
*
|
|
19640
19593
|
* The `raw` escape hatch carries provider-specific attributes that don't
|
|
19641
19594
|
* fit the structured slots (HA `attributes` whitelist, Reolink `deviceCache`
|
|
@@ -19649,6 +19602,14 @@ var SourceInfoSchema = object({
|
|
|
19649
19602
|
/** Immutable upstream identifier when available (HA `unique_id`, … ).
|
|
19650
19603
|
* Used to detect rename when `id` changes. */
|
|
19651
19604
|
uniqueId: string().optional(),
|
|
19605
|
+
/** Quantity of a polymorphic reading, written once at adopt (D944). */
|
|
19606
|
+
quantity: ReadingQuantitySchema.optional(),
|
|
19607
|
+
/** Date / time / datetime shape of a string reading, written once at adopt. */
|
|
19608
|
+
dateTimeShape: _enum([
|
|
19609
|
+
"date",
|
|
19610
|
+
"time",
|
|
19611
|
+
"datetime"
|
|
19612
|
+
]).optional(),
|
|
19652
19613
|
/** Provider-specific extras that don't fit the structured slots.
|
|
19653
19614
|
* Whitelist what goes here per provider — do NOT dump entire HA
|
|
19654
19615
|
* attribute blobs (would explode the meta JSON column). */
|
|
@@ -19694,9 +19655,38 @@ function normalizeUnit(raw) {
|
|
|
19694
19655
|
if (lower === "mph") return "mph";
|
|
19695
19656
|
if (lower === "m/s") return "m/s";
|
|
19696
19657
|
if (lower === "m") return "m";
|
|
19658
|
+
if (lower === "m²" || lower === "m2") return "m²";
|
|
19659
|
+
if (lower === "mm") return "mm";
|
|
19660
|
+
if (lower === "cm") return "cm";
|
|
19697
19661
|
if (lower === "km") return "km";
|
|
19662
|
+
if (lower === "in" || lower === "inch" || lower === "inches") return "in";
|
|
19663
|
+
if (lower === "ft" || lower === "foot" || lower === "feet") return "ft";
|
|
19698
19664
|
if (lower === "kg") return "kg";
|
|
19699
19665
|
if (lower === "g") return "g";
|
|
19666
|
+
if (lower === "l" || lower === "liter" || lower === "litre" || lower === "liters" || lower === "litres") return "L";
|
|
19667
|
+
if (lower === "ml") return "mL";
|
|
19668
|
+
if (lower === "gal" || lower === "gallon" || lower === "gallons") return "gal";
|
|
19669
|
+
if (lower === "s" || lower === "sec" || lower === "second" || lower === "seconds") return "s";
|
|
19670
|
+
if (lower === "ms") return "ms";
|
|
19671
|
+
if (lower === "min" || lower === "minute" || lower === "minutes") return "min";
|
|
19672
|
+
if (lower === "h" || lower === "hr" || lower === "hour" || lower === "hours") return "h";
|
|
19673
|
+
if (lower === "d" || lower === "day" || lower === "days") return "d";
|
|
19674
|
+
if (lower === "b" || lower === "byte" || lower === "bytes") return "B";
|
|
19675
|
+
if (lower === "kib") return "KiB";
|
|
19676
|
+
if (lower === "mib") return "MiB";
|
|
19677
|
+
if (lower === "gib") return "GiB";
|
|
19678
|
+
if (lower === "tib") return "TiB";
|
|
19679
|
+
if (lower === "kb") return "kB";
|
|
19680
|
+
if (lower === "mb") return "MB";
|
|
19681
|
+
if (lower === "gb") return "GB";
|
|
19682
|
+
if (lower === "dbm") return "dBm";
|
|
19683
|
+
if (lower === "dbfs") return "dBFS";
|
|
19684
|
+
if (lower === "inhg") return "inHg";
|
|
19685
|
+
if (lower === "mm/h") return "mm/h";
|
|
19686
|
+
if (lower === "w/m²" || lower === "w/m2") return "W/m²";
|
|
19687
|
+
if (lower === "°" || lower === "deg" || lower === "degree" || lower === "degrees") return "°";
|
|
19688
|
+
if (lower === "kbps") return "kbps";
|
|
19689
|
+
if (lower === "fps") return "fps";
|
|
19700
19690
|
return trimmed;
|
|
19701
19691
|
}
|
|
19702
19692
|
/**
|
|
@@ -40606,7 +40596,8 @@ method(object({
|
|
|
40606
40596
|
"enum"
|
|
40607
40597
|
]),
|
|
40608
40598
|
enumValues: array(string()).optional(),
|
|
40609
|
-
item: boolean().optional()
|
|
40599
|
+
item: boolean().optional(),
|
|
40600
|
+
quantity: ReadingQuantitySchema.optional()
|
|
40610
40601
|
})).readonly(),
|
|
40611
40602
|
itemArray: object({
|
|
40612
40603
|
path: string(),
|
|
@@ -44406,8 +44397,8 @@ var MaskPolygonShapeSchema = object({
|
|
|
44406
44397
|
/** Boolean cell grid — row-major, length === gridWidth*gridHeight. */
|
|
44407
44398
|
var MaskGridShapeSchema = object({
|
|
44408
44399
|
kind: literal("grid"),
|
|
44409
|
-
gridWidth: number(),
|
|
44410
|
-
gridHeight: number(),
|
|
44400
|
+
gridWidth: number().meta(readingMeta("none")),
|
|
44401
|
+
gridHeight: number().meta(readingMeta("none")),
|
|
44411
44402
|
cells: array(boolean())
|
|
44412
44403
|
});
|
|
44413
44404
|
discriminatedUnion("kind", [
|
|
@@ -56393,46 +56384,27 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
|
|
|
56393
56384
|
}), LogStreamEntrySchema, { kind: "subscription" });
|
|
56394
56385
|
object({
|
|
56395
56386
|
/** Carbon dioxide concentration in ppm. */
|
|
56396
|
-
co2Ppm: number().min(0).optional(),
|
|
56387
|
+
co2Ppm: number().min(0).optional().meta(readingMeta("concentration-volume")),
|
|
56397
56388
|
/** Total volatile organic compounds in ppb. */
|
|
56398
|
-
vocPpb: number().min(0).optional(),
|
|
56389
|
+
vocPpb: number().min(0).optional().meta(readingMeta("concentration-ppb")),
|
|
56399
56390
|
/** Particulate matter ≤ 2.5 μm in µg/m³. */
|
|
56400
|
-
pm25: number().min(0).optional(),
|
|
56391
|
+
pm25: number().min(0).optional().meta(readingMeta("concentration-mass")),
|
|
56401
56392
|
/** Particulate matter ≤ 10 μm in µg/m³. */
|
|
56402
|
-
pm10: number().min(0).optional(),
|
|
56393
|
+
pm10: number().min(0).optional().meta(readingMeta("concentration-mass")),
|
|
56403
56394
|
/** Composite AQI value (typically 0..500). */
|
|
56404
|
-
aqi: number().optional(),
|
|
56395
|
+
aqi: number().optional().meta(readingMeta("index")),
|
|
56405
56396
|
/** Ms epoch when the slice was last updated. */
|
|
56406
|
-
lastFetchedAt: number()
|
|
56407
|
-
/** Live display unit of the single metric this slice carries (e.g. HA
|
|
56408
|
-
* `attributes.unit_of_measurement` → 'ppm' / 'ppb' / 'µg/m³'). Each
|
|
56409
|
-
* upstream `sensor.*` entity surfaces ONE device_class, so one unit
|
|
56410
|
-
* per slice is unambiguous. */
|
|
56411
|
-
unit: string().optional(),
|
|
56412
|
-
/** Suggested decimal places for numeric display.
|
|
56413
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
56414
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
56415
|
-
* auto-formatting when absent. */
|
|
56416
|
-
precision: number().int().min(0).max(10).optional()
|
|
56397
|
+
lastFetchedAt: number()
|
|
56417
56398
|
});
|
|
56418
56399
|
DeviceType.Sensor;
|
|
56419
56400
|
object({
|
|
56420
|
-
/** Current illuminance in lux (lx). */
|
|
56421
|
-
lux: number().min(0).meta({
|
|
56422
|
-
|
|
56401
|
+
/** Current illuminance in lux (lx). `null` when the sample was refused (D393). */
|
|
56402
|
+
lux: number().min(0).nullable().meta(readingMeta("illuminance", {
|
|
56403
|
+
precision: 0,
|
|
56423
56404
|
label: "Illuminance"
|
|
56424
|
-
}),
|
|
56405
|
+
})),
|
|
56425
56406
|
/** Ms epoch when the slice was last updated. */
|
|
56426
|
-
lastFetchedAt: number()
|
|
56427
|
-
/** Live display unit from the upstream source (e.g. HA
|
|
56428
|
-
* `attributes.unit_of_measurement`). The UI prefers this over the
|
|
56429
|
-
* role's canonical unit. Absent → fall back to the canonical unit. */
|
|
56430
|
-
unit: string().optional(),
|
|
56431
|
-
/** Suggested decimal places for numeric display.
|
|
56432
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
56433
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
56434
|
-
* auto-formatting when absent. */
|
|
56435
|
-
precision: number().int().min(0).max(10).optional()
|
|
56407
|
+
lastFetchedAt: number()
|
|
56436
56408
|
});
|
|
56437
56409
|
DeviceType.Sensor;
|
|
56438
56410
|
/**
|
|
@@ -56577,10 +56549,7 @@ var BatteryStatusSchema = object({
|
|
|
56577
56549
|
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
56578
56550
|
* declines to band a non-finite reading, which is the correct shape.
|
|
56579
56551
|
*/
|
|
56580
|
-
percentage: number().min(0).max(100).nullable().meta({
|
|
56581
|
-
unit: "%",
|
|
56582
|
-
label: "Charge"
|
|
56583
|
-
}),
|
|
56552
|
+
percentage: number().min(0).max(100).nullable().meta(readingMeta("percentage", { label: "Charge" })),
|
|
56584
56553
|
/**
|
|
56585
56554
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
56586
56555
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
|
@@ -56607,7 +56576,14 @@ var BatteryStatusSchema = object({
|
|
|
56607
56576
|
*/
|
|
56608
56577
|
sleeping: boolean().meta({ label: "Sleeping" }),
|
|
56609
56578
|
/** Ms epoch of the last observation. Lets consumers reason about freshness. */
|
|
56610
|
-
lastUpdated: number(),
|
|
56579
|
+
lastUpdated: number().meta(readingMeta("none")),
|
|
56580
|
+
/**
|
|
56581
|
+
* Battery voltage in volts, for a cell the firmware reports as voltage
|
|
56582
|
+
* rather than a percentage (Ecowitt capacitor packs). Absent on cameras
|
|
56583
|
+
* that only report charge. A second reading on this cap, not a second
|
|
56584
|
+
* `numeric-sensor` on the same device.
|
|
56585
|
+
*/
|
|
56586
|
+
volts: number().nullable().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
56611
56587
|
/**
|
|
56612
56588
|
* Ms epoch of the last time the device PROVED it was reachable — a
|
|
56613
56589
|
* completed firmware round-trip, an observed wake, or an inbound push
|
|
@@ -56667,7 +56643,7 @@ object({
|
|
|
56667
56643
|
DeviceType.Sensor;
|
|
56668
56644
|
object({
|
|
56669
56645
|
/** Current level as 0..100 inclusive. Firmware-reported. */
|
|
56670
|
-
percentage: number().min(0).max(100),
|
|
56646
|
+
percentage: number().min(0).max(100).meta(readingMeta("percentage")),
|
|
56671
56647
|
/** Ms epoch of the last operator-driven change. Useful for UI freshness. */
|
|
56672
56648
|
lastChangedAt: number()
|
|
56673
56649
|
});
|
|
@@ -57052,21 +57028,21 @@ object({
|
|
|
57052
57028
|
/** Single setpoint in Celsius. Used by single-target modes
|
|
57053
57029
|
* (heat / cool / dry). Null when the device is in a range mode
|
|
57054
57030
|
* (`heat_cool`) or has no setpoint at all (`fan_only`/`off`). */
|
|
57055
|
-
target: number().nullable(),
|
|
57031
|
+
target: number().nullable().meta(readingMeta("temperature")),
|
|
57056
57032
|
/** Upper bound of the dual setpoint in Celsius. Populated only
|
|
57057
57033
|
* in `heat_cool` mode. */
|
|
57058
|
-
targetHigh: number().nullable(),
|
|
57034
|
+
targetHigh: number().nullable().meta(readingMeta("temperature")),
|
|
57059
57035
|
/** Lower bound of the dual setpoint in Celsius. Populated only
|
|
57060
57036
|
* in `heat_cool` mode. */
|
|
57061
|
-
targetLow: number().nullable(),
|
|
57037
|
+
targetLow: number().nullable().meta(readingMeta("temperature")),
|
|
57062
57038
|
/** Target relative humidity (0..100). Null when the device has no
|
|
57063
57039
|
* humidity control. */
|
|
57064
|
-
targetHumidity: number().min(0).max(100).nullable(),
|
|
57040
|
+
targetHumidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
57065
57041
|
/** Current measured temperature in Celsius. Read-only — pushed by
|
|
57066
57042
|
* the device's internal sensor. */
|
|
57067
|
-
currentTemp: number().nullable(),
|
|
57043
|
+
currentTemp: number().nullable().meta(readingMeta("temperature")),
|
|
57068
57044
|
/** Current measured relative humidity (0..100). Read-only. */
|
|
57069
|
-
currentHumidity: number().min(0).max(100).nullable(),
|
|
57045
|
+
currentHumidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
57070
57046
|
/** Vertical louver swing on/off. Null when the device has no vertical
|
|
57071
57047
|
* swing surface (gate with `DeviceFeature.ClimateSwingVertical`). */
|
|
57072
57048
|
swingVertical: boolean().nullable(),
|
|
@@ -57074,11 +57050,11 @@ object({
|
|
|
57074
57050
|
* horizontal swing surface (gate with `DeviceFeature.ClimateSwingHorizontal`). */
|
|
57075
57051
|
swingHorizontal: boolean().nullable(),
|
|
57076
57052
|
/** Lowest setpoint the device accepts, Celsius. Absent / null = not reported. */
|
|
57077
|
-
minTemp: number().nullable().optional(),
|
|
57053
|
+
minTemp: number().nullable().optional().meta(readingMeta("temperature")),
|
|
57078
57054
|
/** Highest setpoint the device accepts, Celsius. Absent / null = not reported. */
|
|
57079
|
-
maxTemp: number().nullable().optional(),
|
|
57055
|
+
maxTemp: number().nullable().optional().meta(readingMeta("temperature")),
|
|
57080
57056
|
/** Setpoint granularity, Celsius (0.5, 1). Absent / null = not reported. */
|
|
57081
|
-
tempStep: number().positive().nullable().optional(),
|
|
57057
|
+
tempStep: number().positive().nullable().optional().meta(readingMeta("temperature")),
|
|
57082
57058
|
/** Ms epoch when the slice was last updated (push or command). */
|
|
57083
57059
|
lastFetchedAt: number()
|
|
57084
57060
|
});
|
|
@@ -57157,17 +57133,17 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
|
|
|
57157
57133
|
* modes to expose in the picker without a slice fetch.
|
|
57158
57134
|
*/
|
|
57159
57135
|
var RgbTripletSchema = object({
|
|
57160
|
-
r: number().int().min(0).max(255),
|
|
57161
|
-
g: number().int().min(0).max(255),
|
|
57162
|
-
b: number().int().min(0).max(255)
|
|
57136
|
+
r: number().int().min(0).max(255).meta(readingMeta("none")),
|
|
57137
|
+
g: number().int().min(0).max(255).meta(readingMeta("none")),
|
|
57138
|
+
b: number().int().min(0).max(255).meta(readingMeta("none"))
|
|
57163
57139
|
});
|
|
57164
57140
|
var HsvTripletSchema = object({
|
|
57165
57141
|
/** Hue in degrees, 0..360. */
|
|
57166
|
-
h: number().min(0).max(360),
|
|
57142
|
+
h: number().min(0).max(360).meta(readingMeta("none")),
|
|
57167
57143
|
/** Saturation as 0..100 inclusive. */
|
|
57168
|
-
s: number().min(0).max(100),
|
|
57144
|
+
s: number().min(0).max(100).meta(readingMeta("none")),
|
|
57169
57145
|
/** Value/brightness as 0..100 inclusive. */
|
|
57170
|
-
v: number().min(0).max(100)
|
|
57146
|
+
v: number().min(0).max(100).meta(readingMeta("none"))
|
|
57171
57147
|
});
|
|
57172
57148
|
var ColorInputSchema = discriminatedUnion("mode", [
|
|
57173
57149
|
object({
|
|
@@ -57196,7 +57172,7 @@ object({
|
|
|
57196
57172
|
/** Populated when `mode === 'hsv'`. */
|
|
57197
57173
|
hsv: HsvTripletSchema.optional(),
|
|
57198
57174
|
/** Populated when `mode === 'mired'`. */
|
|
57199
|
-
mireds: number().int().optional(),
|
|
57175
|
+
mireds: number().int().optional().meta(readingMeta("colour-temperature")),
|
|
57200
57176
|
/** Ms epoch of the last operator-driven change. */
|
|
57201
57177
|
lastChangedAt: number()
|
|
57202
57178
|
});
|
|
@@ -57320,18 +57296,12 @@ _enum([
|
|
|
57320
57296
|
"empty",
|
|
57321
57297
|
"full"
|
|
57322
57298
|
]);
|
|
57323
|
-
/**
|
|
57324
|
-
|
|
57325
|
-
|
|
57326
|
-
"days",
|
|
57327
|
-
"hours",
|
|
57328
|
-
"cycles"
|
|
57329
|
-
]);
|
|
57330
|
-
/** Remaining life as a COUNT, not a percentage (the PetKit desiccant reports
|
|
57331
|
-
* days). `value` null = unknown (D393). */
|
|
57299
|
+
/** Whether `remaining.value` is a duration in seconds or a dimensionless count. */
|
|
57300
|
+
var ConsumableRemainingKindSchema = _enum(["duration", "count"]);
|
|
57301
|
+
/** Remaining life. `value` null = unknown (D393). Duration is seconds. */
|
|
57332
57302
|
var ConsumableRemainingSchema = object({
|
|
57333
|
-
value: number().min(0).nullable(),
|
|
57334
|
-
|
|
57303
|
+
value: number().min(0).nullable().meta(readingMeta("device")),
|
|
57304
|
+
kind: ConsumableRemainingKindSchema
|
|
57335
57305
|
});
|
|
57336
57306
|
var ConsumablesStatusSchema = object({
|
|
57337
57307
|
items: array(object({
|
|
@@ -57340,7 +57310,7 @@ var ConsumablesStatusSchema = object({
|
|
|
57340
57310
|
/** Display name. */
|
|
57341
57311
|
label: string().min(1),
|
|
57342
57312
|
/** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
|
|
57343
|
-
level: number().min(0).max(100).nullable(),
|
|
57313
|
+
level: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
57344
57314
|
/** The provider's discrete verdict when known (binary mode). */
|
|
57345
57315
|
status: ConsumableStatusSchema.nullable(),
|
|
57346
57316
|
/** What the item is — decides whether low or full is bad. Absent = `wear`. */
|
|
@@ -57357,7 +57327,7 @@ var ConsumablesStatusSchema = object({
|
|
|
57357
57327
|
})),
|
|
57358
57328
|
lastChangedAt: number()
|
|
57359
57329
|
});
|
|
57360
|
-
Object.values(DeviceType), [...
|
|
57330
|
+
Object.values(DeviceType), [...ConsumableRemainingKindSchema.options], [...ConsumableStatusSchema.options], [...ConsumableKindSchema.options], [...ConsumableFormSchema.options];
|
|
57361
57331
|
Object.values(DeviceType), method(object({
|
|
57362
57332
|
deviceId: number().int().nonnegative(),
|
|
57363
57333
|
key: string().min(1)
|
|
@@ -57382,39 +57352,17 @@ object({
|
|
|
57382
57352
|
/** Current value. Numeric kind → number; select/text/datetime → string.
|
|
57383
57353
|
* Datetime values are ISO 8601 strings (full timestamp, date-only,
|
|
57384
57354
|
* or time-only — HA accepts all three forms). */
|
|
57385
|
-
value: union([number(), string()]),
|
|
57355
|
+
value: union([number().meta(readingMeta("device")), string()]),
|
|
57386
57356
|
/** Acceptable values when `kind === 'select'`. Empty for other kinds. */
|
|
57387
57357
|
options: array(string()),
|
|
57388
57358
|
/** Ms epoch when the slice was last updated. */
|
|
57389
57359
|
lastChangedAt: number(),
|
|
57390
|
-
/**
|
|
57391
|
-
|
|
57392
|
-
|
|
57393
|
-
|
|
57394
|
-
/**
|
|
57395
|
-
|
|
57396
|
-
min: number().optional(),
|
|
57397
|
-
/** Maximum allowed value. Populated live from HA `attributes.max`.
|
|
57398
|
-
* Meaningful for `kind === 'numeric'`; absent for other kinds. */
|
|
57399
|
-
max: number().optional(),
|
|
57400
|
-
/** Step increment. Populated live from HA `attributes.step`.
|
|
57401
|
-
* Meaningful for `kind === 'numeric'`; absent for other kinds. */
|
|
57402
|
-
step: number().optional(),
|
|
57403
|
-
/** Suggested decimal places for numeric display. Populated live from HA
|
|
57404
|
-
* `attributes.suggested_display_precision`, or derived from `step` when the
|
|
57405
|
-
* HA attribute is absent. Meaningful for `kind === 'numeric'`; absent for
|
|
57406
|
-
* other kinds. Falls back to auto-formatting when absent. */
|
|
57407
|
-
precision: number().int().min(0).max(10).optional(),
|
|
57408
|
-
/** Date-picker granularity for `kind === 'datetime'`. 'date' → date-only,
|
|
57409
|
-
* 'time' → time-only, 'datetime' → full timestamp. Absent for other kinds
|
|
57410
|
-
* (UI defaults to 'datetime'). Derived live from the device's HA domain
|
|
57411
|
-
* (date.* / time.* / datetime.*) or, for input_datetime, from the entity's
|
|
57412
|
-
* `has_date`/`has_time` attributes on each push. */
|
|
57413
|
-
format: _enum([
|
|
57414
|
-
"date",
|
|
57415
|
-
"time",
|
|
57416
|
-
"datetime"
|
|
57417
|
-
]).optional()
|
|
57360
|
+
/** Minimum allowed value, in the device quantity's base unit. */
|
|
57361
|
+
min: number().optional().meta(readingMeta("device")),
|
|
57362
|
+
/** Maximum allowed value, in the device quantity's base unit. */
|
|
57363
|
+
max: number().optional().meta(readingMeta("device")),
|
|
57364
|
+
/** Step increment, in the device quantity's base unit. */
|
|
57365
|
+
step: number().optional().meta(readingMeta("device"))
|
|
57418
57366
|
});
|
|
57419
57367
|
var ControlSetValueInputSchema = discriminatedUnion("kind", [
|
|
57420
57368
|
object({
|
|
@@ -57452,9 +57400,9 @@ object({
|
|
|
57452
57400
|
]),
|
|
57453
57401
|
/** 0 = fully closed, 100 = fully open. Null when the device has
|
|
57454
57402
|
* no intermediate position surface. */
|
|
57455
|
-
position: number().min(0).max(100).nullable(),
|
|
57403
|
+
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
57456
57404
|
/** 0 = closed slats, 100 = open slats. Null when no tilt support. */
|
|
57457
|
-
tiltPosition: number().min(0).max(100).nullable(),
|
|
57405
|
+
tiltPosition: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
57458
57406
|
/** Ms epoch when the slice was last updated. */
|
|
57459
57407
|
lastChangedAt: number()
|
|
57460
57408
|
});
|
|
@@ -57512,9 +57460,9 @@ var NormalizedRangeSchema$1 = object({
|
|
|
57512
57460
|
object({
|
|
57513
57461
|
mode: DayNightModeSchema,
|
|
57514
57462
|
/** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
|
|
57515
|
-
sensitivity: number().optional(),
|
|
57463
|
+
sensitivity: number().optional().meta(readingMeta("none")),
|
|
57516
57464
|
/** Delay before the IR-cut filter flips, in seconds. */
|
|
57517
|
-
switchDelaySec: number().optional(),
|
|
57465
|
+
switchDelaySec: number().optional().meta(readingMeta("duration")),
|
|
57518
57466
|
lastFetchedAt: number()
|
|
57519
57467
|
});
|
|
57520
57468
|
/**
|
|
@@ -57669,11 +57617,11 @@ object({
|
|
|
57669
57617
|
/** Feature keys of the programs the appliance currently offers — drives the UI selector. */
|
|
57670
57618
|
availablePrograms: array(string()),
|
|
57671
57619
|
/** Seconds remaining on the active cycle, or null when not running / not known. */
|
|
57672
|
-
remainingSeconds: number().int().nonnegative().nullable(),
|
|
57620
|
+
remainingSeconds: number().int().nonnegative().nullable().meta(readingMeta("duration")),
|
|
57673
57621
|
/** Seconds the delayed start is set to (time until the cycle starts), or null. */
|
|
57674
|
-
delayedStartSeconds: number().int().nonnegative().nullable(),
|
|
57622
|
+
delayedStartSeconds: number().int().nonnegative().nullable().meta(readingMeta("duration")),
|
|
57675
57623
|
/** Cycle completion 0..100, or null when not applicable. */
|
|
57676
|
-
progressPercent: number().min(0).max(100).nullable(),
|
|
57624
|
+
progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
57677
57625
|
/** True when the door is reported open; null when the door state is not known. */
|
|
57678
57626
|
doorOpen: boolean().nullable(),
|
|
57679
57627
|
/** True when the door is latched (locked) during a cycle; null when not reported. */
|
|
@@ -57697,7 +57645,7 @@ object({
|
|
|
57697
57645
|
/** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
|
|
57698
57646
|
machineCareDue: boolean().nullable(),
|
|
57699
57647
|
/** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
|
|
57700
|
-
machineCareRemainingRuns: number().int().nonnegative().nullable(),
|
|
57648
|
+
machineCareRemainingRuns: number().int().nonnegative().nullable().meta(readingMeta("count")),
|
|
57701
57649
|
/** Option states: null when the appliance does not expose the option or has not said. */
|
|
57702
57650
|
halfLoad: boolean().nullable(),
|
|
57703
57651
|
hygienePlus: boolean().nullable(),
|
|
@@ -57712,7 +57660,7 @@ object({
|
|
|
57712
57660
|
/** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
|
|
57713
57661
|
activeEvents: array(string()),
|
|
57714
57662
|
/** Numeric error code when the appliance reports one; null otherwise. */
|
|
57715
|
-
errorCode: number().nullable(),
|
|
57663
|
+
errorCode: number().nullable().meta(readingMeta("none")),
|
|
57716
57664
|
/** Name of the raised alert-level event while the appliance is in error; null otherwise. */
|
|
57717
57665
|
errorLabel: string().nullable(),
|
|
57718
57666
|
/** Ms epoch of the last value received from the appliance; 0 = never. */
|
|
@@ -57858,24 +57806,14 @@ object({
|
|
|
57858
57806
|
/** Ms epoch of the last press. null = never observed since this provider started. */
|
|
57859
57807
|
lastPressedAt: number().nullable(),
|
|
57860
57808
|
/** Counter since provider start. Resets on reboot. Useful for metrics/debug. */
|
|
57861
|
-
pressCountSinceStart: number()
|
|
57809
|
+
pressCountSinceStart: number().meta(readingMeta("count"))
|
|
57862
57810
|
});
|
|
57863
57811
|
object({
|
|
57864
57812
|
deviceId: number(),
|
|
57865
57813
|
timestamp: number()
|
|
57866
57814
|
});
|
|
57867
57815
|
DeviceType.Button, DeviceType.Camera;
|
|
57868
|
-
|
|
57869
|
-
* Enum-state sensor — a string value picked from a finite option set.
|
|
57870
|
-
* Drives HA `sensor` entries with `state_class: enum` (HVAC action
|
|
57871
|
-
* states, weather conditions, contact-source channels, mode strings).
|
|
57872
|
-
* The option set is stable across observations; it is persisted in the
|
|
57873
|
-
* device config blob (via the control slice at adoption) and is NOT
|
|
57874
|
-
* stored in `sourceInfo`.
|
|
57875
|
-
*/
|
|
57876
|
-
/** Locale-render shape for an ISO `value` carried by a `DateTimeSensor`-role
|
|
57877
|
-
* enum sensor: `date` (date-only), `time` (time-only), `datetime` (both). */
|
|
57878
|
-
var EnumSensorDateTimeFormatSchema = _enum([
|
|
57816
|
+
_enum([
|
|
57879
57817
|
"date",
|
|
57880
57818
|
"time",
|
|
57881
57819
|
"datetime"
|
|
@@ -57883,12 +57821,11 @@ var EnumSensorDateTimeFormatSchema = _enum([
|
|
|
57883
57821
|
object({
|
|
57884
57822
|
value: string(),
|
|
57885
57823
|
/**
|
|
57886
|
-
* Set
|
|
57887
|
-
* as
|
|
57888
|
-
*
|
|
57889
|
-
* a time-only sensor → `'time'`.
|
|
57824
|
+
* Set when `value` is a timestamp rather than an enum state, so history
|
|
57825
|
+
* does not learn ISO strings as states. The display shape (date / time /
|
|
57826
|
+
* datetime) lives on `SourceInfo.dateTimeShape`, written once at adopt.
|
|
57890
57827
|
*/
|
|
57891
|
-
|
|
57828
|
+
timestamp: boolean().optional(),
|
|
57892
57829
|
/** Ms epoch when the slice was last updated. */
|
|
57893
57830
|
lastFetchedAt: number()
|
|
57894
57831
|
});
|
|
@@ -57907,13 +57844,13 @@ var EventFireSchema = object({
|
|
|
57907
57844
|
deviceId: number(),
|
|
57908
57845
|
eventType: string(),
|
|
57909
57846
|
data: record(string(), unknown()).nullable(),
|
|
57910
|
-
timestamp: number(),
|
|
57911
|
-
seq: number()
|
|
57847
|
+
timestamp: number().meta(readingMeta("none")),
|
|
57848
|
+
seq: number().meta(readingMeta("count"))
|
|
57912
57849
|
});
|
|
57913
57850
|
object({
|
|
57914
57851
|
eventTypes: array(string()),
|
|
57915
57852
|
lastEvent: EventFireSchema.nullable(),
|
|
57916
|
-
eventCountSinceStart: number()
|
|
57853
|
+
eventCountSinceStart: number().meta(readingMeta("count"))
|
|
57917
57854
|
});
|
|
57918
57855
|
DeviceType.EventEmitter;
|
|
57919
57856
|
var IdentitySchema = object({
|
|
@@ -58302,10 +58239,10 @@ var FanDirectionSchema = _enum(["forward", "reverse"]);
|
|
|
58302
58239
|
object({
|
|
58303
58240
|
/** Active speed as 0..100 inclusive. Null when the device has no
|
|
58304
58241
|
* speed surface (single-speed fan). */
|
|
58305
|
-
percentage: number().min(0).max(100).nullable(),
|
|
58242
|
+
percentage: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
58306
58243
|
/** Speed granularity the device accepts (HA `percentage_step`, e.g. 25 for
|
|
58307
58244
|
* a 4-speed fan). Absent when unknown — the UI then falls back to step 1. */
|
|
58308
|
-
percentageStep: number().positive().optional(),
|
|
58245
|
+
percentageStep: number().positive().optional().meta(readingMeta("percentage")),
|
|
58309
58246
|
/** Active preset mode (`auto` / `quiet` / `turbo` / vendor-specific)
|
|
58310
58247
|
* — empty string when no preset is active or supported. */
|
|
58311
58248
|
preset: string(),
|
|
@@ -58387,7 +58324,7 @@ var FeatureProbeStatusSchema = object({
|
|
|
58387
58324
|
/** Camera/firmware model string. `null` when the firmware doesn't expose it. */
|
|
58388
58325
|
model: string().nullable(),
|
|
58389
58326
|
/** Channel count for NVR/Hub devices; `1` for standalone cameras; `null` pre-probe. */
|
|
58390
|
-
channelCount: number().nullable(),
|
|
58327
|
+
channelCount: number().nullable().meta(readingMeta("count")),
|
|
58391
58328
|
/**
|
|
58392
58329
|
* Ms epoch of the last SUCCESSFUL probe. `0` before the first probe
|
|
58393
58330
|
* completes — drivers' `getAccessoryChildren()` should treat zero as
|
|
@@ -58421,7 +58358,7 @@ object({
|
|
|
58421
58358
|
DeviceType.Sensor;
|
|
58422
58359
|
object({
|
|
58423
58360
|
/** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
|
|
58424
|
-
position: number().min(0).max(100).nullable(),
|
|
58361
|
+
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
58425
58362
|
/** Ms epoch when the slice was last updated (push or poll). */
|
|
58426
58363
|
lastFetchedAt: number()
|
|
58427
58364
|
});
|
|
@@ -58430,9 +58367,9 @@ object({
|
|
|
58430
58367
|
/** Whether the humidifier is currently on. */
|
|
58431
58368
|
on: boolean(),
|
|
58432
58369
|
/** Current measured relative humidity (0..100). Null when not reported. */
|
|
58433
|
-
currentHumidity: number().min(0).max(100).nullable(),
|
|
58370
|
+
currentHumidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
58434
58371
|
/** Target relative humidity (0..100). Null when no setpoint surface. */
|
|
58435
|
-
targetHumidity: number().min(0).max(100).nullable(),
|
|
58372
|
+
targetHumidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
58436
58373
|
/** Active mode (`auto` / `normal` / `baby` / vendor). Null when the
|
|
58437
58374
|
* device has no mode surface. */
|
|
58438
58375
|
mode: string().nullable(),
|
|
@@ -58442,9 +58379,9 @@ object({
|
|
|
58442
58379
|
* `idle` / `off`). Null when the device doesn't report it. */
|
|
58443
58380
|
action: string().nullable(),
|
|
58444
58381
|
/** HA `min_humidity` attribute. Null → UI uses 0. */
|
|
58445
|
-
minHumidity: number().nullable(),
|
|
58382
|
+
minHumidity: number().nullable().meta(readingMeta("humidity")),
|
|
58446
58383
|
/** HA `max_humidity` attribute. Null → UI uses 100. */
|
|
58447
|
-
maxHumidity: number().nullable(),
|
|
58384
|
+
maxHumidity: number().nullable().meta(readingMeta("humidity")),
|
|
58448
58385
|
/** Ms epoch when the slice was last updated. */
|
|
58449
58386
|
lastChangedAt: number()
|
|
58450
58387
|
});
|
|
@@ -58468,22 +58405,13 @@ DeviceType.Humidifier, method(object({
|
|
|
58468
58405
|
auth: "protected"
|
|
58469
58406
|
});
|
|
58470
58407
|
object({
|
|
58471
|
-
/** Current relative humidity, 0..100. */
|
|
58472
|
-
percent: number().min(0).max(100).meta({
|
|
58473
|
-
|
|
58408
|
+
/** Current relative humidity, 0..100. `null` when the sample was refused (D393). */
|
|
58409
|
+
percent: number().min(0).max(100).nullable().meta(readingMeta("humidity", {
|
|
58410
|
+
precision: 0,
|
|
58474
58411
|
label: "Humidity"
|
|
58475
|
-
}),
|
|
58412
|
+
})),
|
|
58476
58413
|
/** Ms epoch when the slice was last updated. */
|
|
58477
|
-
lastFetchedAt: number()
|
|
58478
|
-
/** Live display unit from the upstream source (e.g. HA
|
|
58479
|
-
* `attributes.unit_of_measurement`). The UI prefers this over the
|
|
58480
|
-
* role's canonical unit. Absent → fall back to the canonical unit. */
|
|
58481
|
-
unit: string().optional(),
|
|
58482
|
-
/** Suggested decimal places for numeric display.
|
|
58483
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
58484
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
58485
|
-
* auto-formatting when absent. */
|
|
58486
|
-
precision: number().int().min(0).max(10).optional()
|
|
58414
|
+
lastFetchedAt: number()
|
|
58487
58415
|
});
|
|
58488
58416
|
DeviceType.Sensor, DeviceType.Thermostat;
|
|
58489
58417
|
object({
|
|
@@ -58491,7 +58419,7 @@ object({
|
|
|
58491
58419
|
* entity exposes no `entity_picture` (yet). */
|
|
58492
58420
|
url: string().nullable(),
|
|
58493
58421
|
/** Ms epoch of the upstream last-updated timestamp. Null at cold-start. */
|
|
58494
|
-
lastUpdated: number().nullable()
|
|
58422
|
+
lastUpdated: number().nullable().meta(readingMeta("none"))
|
|
58495
58423
|
});
|
|
58496
58424
|
DeviceType.Image;
|
|
58497
58425
|
/**
|
|
@@ -58547,19 +58475,19 @@ var NormalizedRangeSchema = object({
|
|
|
58547
58475
|
});
|
|
58548
58476
|
object({
|
|
58549
58477
|
/** Normalized 0–100. */
|
|
58550
|
-
brightness: number().optional(),
|
|
58478
|
+
brightness: number().optional().meta(readingMeta("none")),
|
|
58551
58479
|
/** Normalized 0–100. */
|
|
58552
|
-
contrast: number().optional(),
|
|
58480
|
+
contrast: number().optional().meta(readingMeta("none")),
|
|
58553
58481
|
/** Normalized 0–100. */
|
|
58554
|
-
saturation: number().optional(),
|
|
58482
|
+
saturation: number().optional().meta(readingMeta("none")),
|
|
58555
58483
|
/** Normalized 0–100. */
|
|
58556
|
-
sharpness: number().optional(),
|
|
58484
|
+
sharpness: number().optional().meta(readingMeta("none")),
|
|
58557
58485
|
mirror: boolean().optional(),
|
|
58558
58486
|
flip: boolean().optional(),
|
|
58559
58487
|
rotate: ImageRotateSchema.optional(),
|
|
58560
58488
|
whiteBalance: WhiteBalanceModeSchema.optional(),
|
|
58561
58489
|
/** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
|
|
58562
|
-
warmth: number().optional(),
|
|
58490
|
+
warmth: number().optional().meta(readingMeta("none")),
|
|
58563
58491
|
exposureMode: ExposureModeSchema.optional(),
|
|
58564
58492
|
backlightMode: BacklightModeSchema.optional(),
|
|
58565
58493
|
lastFetchedAt: number()
|
|
@@ -58804,10 +58732,10 @@ var IntercomAbilitySchema = object({
|
|
|
58804
58732
|
/** Codecs accepted by firmware, in preference order. Driver-authored strings. */
|
|
58805
58733
|
codecs: array(string()),
|
|
58806
58734
|
/** Sample rate (Hz) the firmware expects. Reolink typical: 16000. */
|
|
58807
|
-
sampleRate: number(),
|
|
58735
|
+
sampleRate: number().meta(readingMeta("none")),
|
|
58808
58736
|
duplex: _enum(["half", "full"]),
|
|
58809
58737
|
/** Max in-flight audio backlog before drop (ms). Server uses this to bound latency. */
|
|
58810
|
-
maxBacklogMs: number()
|
|
58738
|
+
maxBacklogMs: number().meta(readingMeta("duration-ms"))
|
|
58811
58739
|
});
|
|
58812
58740
|
var IntercomStatusSchema = object({
|
|
58813
58741
|
/** True while a talk session is open. */
|
|
@@ -58918,13 +58846,13 @@ object({
|
|
|
58918
58846
|
activity: LawnMowerActivitySchema,
|
|
58919
58847
|
/** 0..100 battery percentage. Null when the device has no battery
|
|
58920
58848
|
* reading. */
|
|
58921
|
-
batteryLevel: number().min(0).max(100).nullable(),
|
|
58849
|
+
batteryLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
58922
58850
|
/** 0..100 mowing-completion percentage of the current task, or null when no
|
|
58923
58851
|
* task is active / progress is unavailable. */
|
|
58924
|
-
progressPercent: number().min(0).max(100).nullable(),
|
|
58852
|
+
progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
58925
58853
|
/** Current device/event code (dynamic — mostly status, sometimes an error),
|
|
58926
58854
|
* or null when unknown. */
|
|
58927
|
-
currentCode: number().nullable(),
|
|
58855
|
+
currentCode: number().nullable().meta(readingMeta("none")),
|
|
58928
58856
|
/** Human label for {@link currentCode}, or null when undecodable. */
|
|
58929
58857
|
currentCodeLabel: string().nullable(),
|
|
58930
58858
|
/** Severity of {@link currentCode}. `error` (and often `warning`) warrants UI
|
|
@@ -59386,7 +59314,7 @@ object({
|
|
|
59386
59314
|
state: MediaPlayerStateSchema,
|
|
59387
59315
|
/** Volume as 0..100 inclusive. Null when the device has no volume
|
|
59388
59316
|
* surface. Pair with `DeviceFeature.MediaPlayerVolume`. */
|
|
59389
|
-
volumeLevel: number().min(0).max(100).nullable(),
|
|
59317
|
+
volumeLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
59390
59318
|
/** Mute toggle distinct from volume=0. Null when no mute surface.
|
|
59391
59319
|
* Pair with `DeviceFeature.MediaPlayerMute`. */
|
|
59392
59320
|
isMuted: boolean().nullable(),
|
|
@@ -59399,10 +59327,10 @@ object({
|
|
|
59399
59327
|
currentMedia: MediaInfoSchema.nullable(),
|
|
59400
59328
|
/** Current playback position in ms. Null when not seekable or
|
|
59401
59329
|
* nothing is playing. Pair with `DeviceFeature.MediaPlayerSeek`. */
|
|
59402
|
-
positionMs: number().int().nonnegative().nullable(),
|
|
59330
|
+
positionMs: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
|
|
59403
59331
|
/** Total duration of the current media in ms. Null when unknown
|
|
59404
59332
|
* (live stream) or nothing is playing. */
|
|
59405
|
-
durationMs: number().int().nonnegative().nullable(),
|
|
59333
|
+
durationMs: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
|
|
59406
59334
|
/** Shuffle toggle. Null when no shuffle surface.
|
|
59407
59335
|
* Pair with `DeviceFeature.MediaPlayerShuffle`. */
|
|
59408
59336
|
shuffle: boolean().nullable(),
|
|
@@ -59702,7 +59630,7 @@ object({
|
|
|
59702
59630
|
* it, every provider seeded it at boot, and every session left it
|
|
59703
59631
|
* `detected: true` after its detach.
|
|
59704
59632
|
*/
|
|
59705
|
-
autoClearAfterMs: number().nullable()
|
|
59633
|
+
autoClearAfterMs: number().nullable().meta(readingMeta("duration-ms"))
|
|
59706
59634
|
});
|
|
59707
59635
|
/**
|
|
59708
59636
|
* Payload of `motion.onMotionChanged` event + the corresponding bus
|
|
@@ -59752,7 +59680,7 @@ var MotionZoneRegionSchema = object({
|
|
|
59752
59680
|
});
|
|
59753
59681
|
object({
|
|
59754
59682
|
enabled: boolean(),
|
|
59755
|
-
sensitivity: number(),
|
|
59683
|
+
sensitivity: number().meta(readingMeta("none")),
|
|
59756
59684
|
/** Grid region(s). Today exactly one `grid` shape. */
|
|
59757
59685
|
regions: array(MotionZoneRegionSchema),
|
|
59758
59686
|
lastFetchedAt: number()
|
|
@@ -60056,7 +59984,7 @@ var NavigationStatusSchema = object({
|
|
|
60056
59984
|
following: boolean(),
|
|
60057
59985
|
flash: boolean(),
|
|
60058
59986
|
lightMode: NavigationLightModeSchema,
|
|
60059
|
-
lightLevel: number().min(40).max(100),
|
|
59987
|
+
lightLevel: number().min(40).max(100).meta(readingMeta("none")),
|
|
60060
59988
|
/** Ms epoch when the slice was last updated. */
|
|
60061
59989
|
lastChangedAt: number()
|
|
60062
59990
|
});
|
|
@@ -60102,13 +60030,13 @@ var NetworkLinkStatusSchema = object({
|
|
|
60102
60030
|
* one whose reading has not landed must not be drawn at 0 %. Consumers
|
|
60103
60031
|
* SKIP a null rather than coerce it.
|
|
60104
60032
|
*/
|
|
60105
|
-
signalPercent: number().min(0).max(100).nullable(),
|
|
60033
|
+
signalPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
60106
60034
|
/** Raw received signal strength in dBm, when the firmware reports one. */
|
|
60107
|
-
rssiDbm: number().optional(),
|
|
60035
|
+
rssiDbm: number().optional().meta(readingMeta("signal-level")),
|
|
60108
60036
|
/** Network name of a wireless link, when the firmware reports it. */
|
|
60109
60037
|
ssid: string().optional(),
|
|
60110
60038
|
/** Ms epoch of the last observation. Lets consumers reason about freshness. */
|
|
60111
|
-
lastUpdated: number()
|
|
60039
|
+
lastUpdated: number().meta(readingMeta("none"))
|
|
60112
60040
|
});
|
|
60113
60041
|
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.Light, DeviceType.Lock, DeviceType.Siren, object({
|
|
60114
60042
|
deviceId: number(),
|
|
@@ -60427,7 +60355,7 @@ object({
|
|
|
60427
60355
|
lastError: string().nullable(),
|
|
60428
60356
|
/** Number of deliveries currently buffered server-side (rate-limited
|
|
60429
60357
|
* notifiers may queue). 0 when the provider sends synchronously. */
|
|
60430
|
-
queueDepth: number().int().nonnegative(),
|
|
60358
|
+
queueDepth: number().int().nonnegative().meta(readingMeta("count")),
|
|
60431
60359
|
/** Per-feature capability matrix — authoritative source for the
|
|
60432
60360
|
* compose-form field gating. */
|
|
60433
60361
|
supports: NotifierSupportsSchema
|
|
@@ -60477,15 +60405,8 @@ DeviceType.Notifier, method(NotifierSendInputSchema, NotifierSendResultSchema, {
|
|
|
60477
60405
|
acceptedAt: number()
|
|
60478
60406
|
});
|
|
60479
60407
|
object({
|
|
60480
|
-
|
|
60481
|
-
|
|
60482
|
-
* Populated live from the upstream source on each state push.
|
|
60483
|
-
* Absent for unitless sensors. */
|
|
60484
|
-
unit: string().optional(),
|
|
60485
|
-
/** Suggested decimal places for numeric display.
|
|
60486
|
-
* Populated live from the upstream source when provided.
|
|
60487
|
-
* Falls back to auto-formatting when absent. */
|
|
60488
|
-
precision: number().int().min(0).max(10).optional(),
|
|
60408
|
+
/** Reading in the device quantity's base unit. `null` when refused (D393). */
|
|
60409
|
+
value: number().nullable().meta(readingMeta("device")),
|
|
60489
60410
|
/** Ms epoch when the slice was last updated. */
|
|
60490
60411
|
lastFetchedAt: number()
|
|
60491
60412
|
});
|
|
@@ -60837,23 +60758,26 @@ object({
|
|
|
60837
60758
|
/** Food currently in the bowl (grams). Null when the device has not
|
|
60838
60759
|
* reported a reading yet. On dual-hopper models this is the combined
|
|
60839
60760
|
* bowl reading; per-hopper levels live in `food1`/`food2`. */
|
|
60840
|
-
foodLevel: number().nullable(),
|
|
60761
|
+
foodLevel: number().nullable().meta(readingMeta("none")),
|
|
60841
60762
|
/** Hopper-1 food level (grams) on dual-hopper feeders; null on
|
|
60842
60763
|
* single-hopper models. */
|
|
60843
|
-
food1: number().nullable(),
|
|
60764
|
+
food1: number().nullable().meta(readingMeta("none")),
|
|
60844
60765
|
/** Hopper-2 food level (grams) on dual-hopper feeders; null on
|
|
60845
60766
|
* single-hopper models. */
|
|
60846
|
-
food2: number().nullable(),
|
|
60767
|
+
food2: number().nullable().meta(readingMeta("none")),
|
|
60847
60768
|
/** Derived low-food flag — mirrors the HA `food_level` binary_sensor
|
|
60848
60769
|
* (`device_class: problem`, on = low). True when the bowl is empty /
|
|
60849
60770
|
* below the feeder's low threshold. */
|
|
60850
60771
|
lowFood: boolean(),
|
|
60851
60772
|
/** Battery charge 0..100 (%). Null on mains-powered models or when the
|
|
60852
60773
|
* device has no battery reading. */
|
|
60853
|
-
batteryPower: number().min(0).max(100).nullable(),
|
|
60854
|
-
/**
|
|
60855
|
-
*
|
|
60856
|
-
|
|
60774
|
+
batteryPower: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
60775
|
+
/**
|
|
60776
|
+
* Desiccant life remaining, stored in seconds (duration base, D944).
|
|
60777
|
+
* Providers convert from the days the feeder reports. Null when the
|
|
60778
|
+
* model has no desiccant sensor.
|
|
60779
|
+
*/
|
|
60780
|
+
desiccantLeftDays: number().nullable().meta(readingMeta("duration")),
|
|
60857
60781
|
/** True while a feed is in progress. */
|
|
60858
60782
|
feeding: boolean(),
|
|
60859
60783
|
/** Decoded connectivity / power status (HA petkit device-status enum).
|
|
@@ -60864,7 +60788,7 @@ object({
|
|
|
60864
60788
|
* with `errorCode` for consumers that want the raw integer. */
|
|
60865
60789
|
error: string().nullable(),
|
|
60866
60790
|
/** Raw device error code (0 / null = no error). */
|
|
60867
|
-
errorCode: number().nullable(),
|
|
60791
|
+
errorCode: number().nullable().meta(readingMeta("none")),
|
|
60868
60792
|
/** True for D4S/D4SH dual-hopper hardware — gates the per-hopper UI. */
|
|
60869
60793
|
isDualHopper: boolean(),
|
|
60870
60794
|
/** Child-lock (manual-lock) setting — buttons on the unit are disabled. */
|
|
@@ -60874,7 +60798,7 @@ object({
|
|
|
60874
60798
|
/** Play a chime when dispensing. */
|
|
60875
60799
|
feedSound: boolean(),
|
|
60876
60800
|
/** Speaker / prompt volume level (device-scaled integer). */
|
|
60877
|
-
volume: number(),
|
|
60801
|
+
volume: number().meta(readingMeta("none")),
|
|
60878
60802
|
/** Ms epoch when the slice was last refreshed from the cloud. */
|
|
60879
60803
|
lastFetchedAt: number()
|
|
60880
60804
|
});
|
|
@@ -61311,36 +61235,19 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
|
|
|
61311
61235
|
});
|
|
61312
61236
|
object({
|
|
61313
61237
|
/** Instantaneous power draw in watts. */
|
|
61314
|
-
watts: number().optional().meta({
|
|
61315
|
-
unit: "W",
|
|
61316
|
-
label: "Power"
|
|
61317
|
-
}),
|
|
61238
|
+
watts: number().optional().meta(readingMeta("power", { label: "Power" })),
|
|
61318
61239
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
61319
|
-
kwhTotal: number().optional().meta({
|
|
61320
|
-
unit: "kWh",
|
|
61321
|
-
label: "Energy"
|
|
61322
|
-
}),
|
|
61240
|
+
kwhTotal: number().optional().meta(readingMeta("energy", { label: "Energy" })),
|
|
61323
61241
|
/** Voltage in volts. */
|
|
61324
|
-
volts: number().optional(),
|
|
61242
|
+
volts: number().optional().meta(readingMeta("voltage")),
|
|
61325
61243
|
/** Current in amperes. */
|
|
61326
|
-
amps: number().optional(),
|
|
61327
|
-
/** Apparent power in volt-amperes
|
|
61328
|
-
va: number().optional(),
|
|
61244
|
+
amps: number().optional().meta(readingMeta("current")),
|
|
61245
|
+
/** Apparent power in volt-amperes. */
|
|
61246
|
+
va: number().optional().meta(readingMeta("apparent-power")),
|
|
61329
61247
|
/** Power factor (0..1) if reported. */
|
|
61330
|
-
powerFactor: number().min(0).max(1).optional(),
|
|
61248
|
+
powerFactor: number().min(0).max(1).optional().meta(readingMeta("ratio")),
|
|
61331
61249
|
/** Ms epoch when the slice was last updated. */
|
|
61332
|
-
lastFetchedAt: number()
|
|
61333
|
-
/** Live display unit of the single metric this slice carries (e.g. HA
|
|
61334
|
-
* `attributes.unit_of_measurement` → 'V' / 'A' / 'W' / 'kW' / 'kWh').
|
|
61335
|
-
* Each upstream `sensor.*` entity surfaces ONE device_class, so one
|
|
61336
|
-
* unit per slice is unambiguous. The UI prefers this over the role's
|
|
61337
|
-
* canonical unit so a 'kW' / 'Wh' feed renders verbatim. */
|
|
61338
|
-
unit: string().optional(),
|
|
61339
|
-
/** Suggested decimal places for numeric display.
|
|
61340
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
61341
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
61342
|
-
* auto-formatting when absent. */
|
|
61343
|
-
precision: number().int().min(0).max(10).optional()
|
|
61250
|
+
lastFetchedAt: number()
|
|
61344
61251
|
});
|
|
61345
61252
|
DeviceType.Sensor;
|
|
61346
61253
|
/**
|
|
@@ -61361,11 +61268,11 @@ DeviceType.Sensor;
|
|
|
61361
61268
|
*/
|
|
61362
61269
|
var GpsLocationSchema = object({
|
|
61363
61270
|
/** Latitude in decimal degrees, -90..90. */
|
|
61364
|
-
latitude: number().min(-90).max(90),
|
|
61271
|
+
latitude: number().min(-90).max(90).meta(readingMeta("angle")),
|
|
61365
61272
|
/** Longitude in decimal degrees, -180..180. */
|
|
61366
|
-
longitude: number().min(-180).max(180),
|
|
61273
|
+
longitude: number().min(-180).max(180).meta(readingMeta("angle")),
|
|
61367
61274
|
/** Reported accuracy in meters (lower = better). */
|
|
61368
|
-
accuracyMeters: number().nonnegative()
|
|
61275
|
+
accuracyMeters: number().nonnegative().meta(readingMeta("length"))
|
|
61369
61276
|
});
|
|
61370
61277
|
object({
|
|
61371
61278
|
/** `home` / `not_home` / any user-defined zone name. */
|
|
@@ -61377,25 +61284,16 @@ object({
|
|
|
61377
61284
|
gps: GpsLocationSchema.nullable(),
|
|
61378
61285
|
/** Optional battery level of the tracking device (0..100). Null
|
|
61379
61286
|
* when not reported. */
|
|
61380
|
-
batteryPercent: number().min(0).max(100).nullable(),
|
|
61287
|
+
batteryPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
61381
61288
|
/** Ms epoch when the slice was last updated. */
|
|
61382
61289
|
lastChangedAt: number()
|
|
61383
61290
|
});
|
|
61384
61291
|
DeviceType.Presence;
|
|
61385
61292
|
object({
|
|
61386
|
-
/** Current pressure in hPa. */
|
|
61387
|
-
hpa: number(),
|
|
61293
|
+
/** Current pressure in hPa. `null` when the sample was refused (D393). */
|
|
61294
|
+
hpa: number().nullable().meta(readingMeta("pressure", { precision: 0 })),
|
|
61388
61295
|
/** Ms epoch when the slice was last updated. */
|
|
61389
|
-
lastFetchedAt: number()
|
|
61390
|
-
/** Live display unit from the upstream source (e.g. HA
|
|
61391
|
-
* `attributes.unit_of_measurement`). The UI prefers this over the
|
|
61392
|
-
* role's canonical unit. Absent → fall back to the canonical unit. */
|
|
61393
|
-
unit: string().optional(),
|
|
61394
|
-
/** Suggested decimal places for numeric display.
|
|
61395
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
61396
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
61397
|
-
* auto-formatting when absent. */
|
|
61398
|
-
precision: number().int().min(0).max(10).optional()
|
|
61296
|
+
lastFetchedAt: number()
|
|
61399
61297
|
});
|
|
61400
61298
|
DeviceType.Sensor;
|
|
61401
61299
|
/**
|
|
@@ -61728,8 +61626,8 @@ DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _
|
|
|
61728
61626
|
}), _void(), { kind: "mutation" });
|
|
61729
61627
|
var PtzAutotrackSettingsSchema = object({
|
|
61730
61628
|
targetType: string().describe("Vendor target string (people/vehicle/pet); empty = camera default"),
|
|
61731
|
-
stopDelaySeconds: number().int().min(0).max(300),
|
|
61732
|
-
disappearDelaySeconds: number().int().min(0).max(300)
|
|
61629
|
+
stopDelaySeconds: number().int().min(0).max(300).meta(readingMeta("duration")),
|
|
61630
|
+
disappearDelaySeconds: number().int().min(0).max(300).meta(readingMeta("duration"))
|
|
61733
61631
|
});
|
|
61734
61632
|
/**
|
|
61735
61633
|
* One option the camera advertises as a valid `targetType`. Drivers
|
|
@@ -61786,7 +61684,7 @@ object({
|
|
|
61786
61684
|
/** null = unknown — never coerced to false (D393). */
|
|
61787
61685
|
running: boolean().nullable(),
|
|
61788
61686
|
/** Epoch ms the current boolean began; null while `running` is null. */
|
|
61789
|
-
since: number().nullable(),
|
|
61687
|
+
since: number().nullable().meta(readingMeta("none")),
|
|
61790
61688
|
source: RunningStateSourceSchema.meta({ label: "Source" }),
|
|
61791
61689
|
phase: string().nullable(),
|
|
61792
61690
|
/** null until a reading has been published (D393). */
|
|
@@ -62984,9 +62882,9 @@ var RecordTriggerSchema = _enum([
|
|
|
62984
62882
|
*/
|
|
62985
62883
|
var RecordWindowSchema = object({
|
|
62986
62884
|
trigger: RecordTriggerSchema,
|
|
62987
|
-
day: number().int().min(0).max(6),
|
|
62988
|
-
startMinute: number().int().min(0).max(1439),
|
|
62989
|
-
endMinute: number().int().min(1).max(1440)
|
|
62885
|
+
day: number().int().min(0).max(6).meta(readingMeta("none")),
|
|
62886
|
+
startMinute: number().int().min(0).max(1439).meta(readingMeta("none")),
|
|
62887
|
+
endMinute: number().int().min(1).max(1440).meta(readingMeta("none"))
|
|
62990
62888
|
});
|
|
62991
62889
|
/** Status of one physical volume, as the camera itself describes it. */
|
|
62992
62890
|
var OnboardStorageVolumeSchema = object({
|
|
@@ -63055,10 +62953,10 @@ object({
|
|
|
63055
62953
|
/** Master "record to the card at all" switch. */
|
|
63056
62954
|
enabled: boolean().nullable(),
|
|
63057
62955
|
overwriteWhenFull: boolean().nullable(),
|
|
63058
|
-
preRecordSec: number().nullable(),
|
|
63059
|
-
postRecordSec: number().nullable(),
|
|
62956
|
+
preRecordSec: number().nullable().meta(readingMeta("duration")),
|
|
62957
|
+
postRecordSec: number().nullable().meta(readingMeta("duration")),
|
|
63060
62958
|
/** Length of one recorded file, in minutes. */
|
|
63061
|
-
segmentMinutes: number().nullable(),
|
|
62959
|
+
segmentMinutes: number().nullable().meta(readingMeta("none")),
|
|
63062
62960
|
/** The primary track's weekly windows, flattened. */
|
|
63063
62961
|
windows: array(RecordWindowSchema),
|
|
63064
62962
|
/**
|
|
@@ -63074,7 +62972,7 @@ object({
|
|
|
63074
62972
|
* provider reporting a non-zero count also reports the schedule as not
|
|
63075
62973
|
* writable.
|
|
63076
62974
|
*/
|
|
63077
|
-
unreadableWindows: number(),
|
|
62975
|
+
unreadableWindows: number().meta(readingMeta("count")),
|
|
63078
62976
|
/**
|
|
63079
62977
|
* The camera is scheduled to record and has NO usable storage.
|
|
63080
62978
|
*
|
|
@@ -63711,7 +63609,7 @@ var CamStreamDescriptorSchema = object({
|
|
|
63711
63609
|
url: string().optional(),
|
|
63712
63610
|
codec: string().optional(),
|
|
63713
63611
|
resolution: CamStreamResolutionSchema.optional(),
|
|
63714
|
-
fps: number().positive().optional(),
|
|
63612
|
+
fps: number().positive().optional().meta(readingMeta("rate")),
|
|
63715
63613
|
label: string().optional(),
|
|
63716
63614
|
/** Device-level features (e.g. `battery-operated`) — drives broker policy. */
|
|
63717
63615
|
deviceFeatures: array(string()).optional(),
|
|
@@ -63741,18 +63639,18 @@ var StreamProfileSchema = _enum([
|
|
|
63741
63639
|
]);
|
|
63742
63640
|
/** The current encoding config of one stream profile. */
|
|
63743
63641
|
var StreamProfileConfigSchema = object({
|
|
63744
|
-
width: number(),
|
|
63745
|
-
height: number(),
|
|
63642
|
+
width: number().meta(readingMeta("none")),
|
|
63643
|
+
height: number().meta(readingMeta("none")),
|
|
63746
63644
|
codec: _enum(["h264", "h265"]),
|
|
63747
|
-
framerate: number(),
|
|
63748
|
-
bitrate: number(),
|
|
63645
|
+
framerate: number().meta(readingMeta("rate")),
|
|
63646
|
+
bitrate: number().meta(readingMeta("bitrate")),
|
|
63749
63647
|
bitrateMode: _enum(["vbr", "cbr"]).optional(),
|
|
63750
63648
|
encoderProfile: _enum([
|
|
63751
63649
|
"high",
|
|
63752
63650
|
"main",
|
|
63753
63651
|
"baseline"
|
|
63754
63652
|
]).optional(),
|
|
63755
|
-
gop: number().optional(),
|
|
63653
|
+
gop: number().optional().meta(readingMeta("none")),
|
|
63756
63654
|
/**
|
|
63757
63655
|
* Whether THIS profile currently carries an audio track. READ-ONLY here.
|
|
63758
63656
|
*
|
|
@@ -64395,23 +64293,13 @@ object({
|
|
|
64395
64293
|
});
|
|
64396
64294
|
DeviceType.Sensor;
|
|
64397
64295
|
object({
|
|
64398
|
-
/** Current temperature in Celsius. */
|
|
64399
|
-
celsius: number().meta({
|
|
64400
|
-
|
|
64296
|
+
/** Current temperature in Celsius. `null` when the sample was refused (D393). */
|
|
64297
|
+
celsius: number().nullable().meta(readingMeta("temperature", {
|
|
64298
|
+
precision: 1,
|
|
64401
64299
|
label: "Temperature"
|
|
64402
|
-
}),
|
|
64300
|
+
})),
|
|
64403
64301
|
/** Ms epoch when the slice was last updated (push or poll). */
|
|
64404
|
-
lastFetchedAt: number()
|
|
64405
|
-
/** Live display unit from the upstream source (e.g. HA
|
|
64406
|
-
* `attributes.unit_of_measurement`). The UI prefers this over the
|
|
64407
|
-
* role's canonical unit, so a Fahrenheit feed renders '°F' not '°C'.
|
|
64408
|
-
* Absent → the UI falls back to the role's canonical unit. */
|
|
64409
|
-
unit: string().optional(),
|
|
64410
|
-
/** Suggested decimal places for numeric display.
|
|
64411
|
-
* Populated live from the upstream source when provided (e.g. HA
|
|
64412
|
-
* `attributes.suggested_display_precision`). Falls back to
|
|
64413
|
-
* auto-formatting when absent. */
|
|
64414
|
-
precision: number().int().min(0).max(10).optional()
|
|
64302
|
+
lastFetchedAt: number()
|
|
64415
64303
|
});
|
|
64416
64304
|
DeviceType.Sensor, DeviceType.Thermostat;
|
|
64417
64305
|
/**
|
|
@@ -64663,16 +64551,16 @@ object({
|
|
|
64663
64551
|
]),
|
|
64664
64552
|
/** 0..100 battery percentage. Null when the device has no battery
|
|
64665
64553
|
* reading. */
|
|
64666
|
-
batteryLevel: number().min(0).max(100).nullable(),
|
|
64554
|
+
batteryLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
64667
64555
|
/** Current fan-speed token (provider-verbatim). Null when unknown or
|
|
64668
64556
|
* the vacuum has no speed control. */
|
|
64669
64557
|
fanSpeed: string().nullable(),
|
|
64670
64558
|
/** Speed tokens the hardware accepts — drives the UI selector. */
|
|
64671
64559
|
availableFanSpeeds: array(string()),
|
|
64672
64560
|
/** 0..100 cleaning-completion percentage of the current task, or null. */
|
|
64673
|
-
progressPercent: number().min(0).max(100).nullable(),
|
|
64561
|
+
progressPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
64674
64562
|
/** Current error code (0 / null = no error). */
|
|
64675
|
-
errorCode: number().nullable(),
|
|
64563
|
+
errorCode: number().nullable().meta(readingMeta("none")),
|
|
64676
64564
|
/** Human label for {@link errorCode}, or null when none / undecodable. */
|
|
64677
64565
|
errorLabel: string().nullable(),
|
|
64678
64566
|
/** Ms epoch when the slice was last updated. */
|
|
@@ -64711,7 +64599,7 @@ object({
|
|
|
64711
64599
|
]),
|
|
64712
64600
|
/** 0 = fully closed, 100 = fully open. Null when the device has no
|
|
64713
64601
|
* intermediate position surface. */
|
|
64714
|
-
position: number().min(0).max(100).nullable(),
|
|
64602
|
+
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
64715
64603
|
/** Ms epoch when the slice was last updated. */
|
|
64716
64604
|
lastChangedAt: number()
|
|
64717
64605
|
});
|
|
@@ -64739,9 +64627,9 @@ object({
|
|
|
64739
64627
|
DeviceType.Sensor;
|
|
64740
64628
|
object({
|
|
64741
64629
|
/** Current measured temperature. Null when not reported. */
|
|
64742
|
-
currentTemp: number().nullable(),
|
|
64630
|
+
currentTemp: number().nullable().meta(readingMeta("temperature")),
|
|
64743
64631
|
/** Target temperature setpoint. Null when no setpoint surface. */
|
|
64744
|
-
targetTemp: number().nullable(),
|
|
64632
|
+
targetTemp: number().nullable().meta(readingMeta("temperature")),
|
|
64745
64633
|
/** Active operation mode = HA `state` (`eco` / `electric` / `gas` /
|
|
64746
64634
|
* `heat_pump` / `high_demand` / `performance` / `off`). Null when the
|
|
64747
64635
|
* device reports an unknown state. */
|
|
@@ -64752,9 +64640,9 @@ object({
|
|
|
64752
64640
|
* has no away surface. */
|
|
64753
64641
|
away: boolean().nullable(),
|
|
64754
64642
|
/** HA `min_temp` attribute. Null when not reported. */
|
|
64755
|
-
minTemp: number().nullable(),
|
|
64643
|
+
minTemp: number().nullable().meta(readingMeta("temperature")),
|
|
64756
64644
|
/** HA `max_temp` attribute. Null when not reported. */
|
|
64757
|
-
maxTemp: number().nullable(),
|
|
64645
|
+
maxTemp: number().nullable().meta(readingMeta("temperature")),
|
|
64758
64646
|
/** Ms epoch when the slice was last updated. */
|
|
64759
64647
|
lastChangedAt: number()
|
|
64760
64648
|
});
|
|
@@ -64778,25 +64666,18 @@ DeviceType.WaterHeater, method(object({
|
|
|
64778
64666
|
auth: "protected"
|
|
64779
64667
|
});
|
|
64780
64668
|
object({
|
|
64781
|
-
/** Verbatim
|
|
64782
|
-
* when no condition has been reported yet. */
|
|
64669
|
+
/** Verbatim condition state (`sunny`, `cloudy`, `rainy`, …). Null when none yet. */
|
|
64783
64670
|
condition: string().nullable(),
|
|
64784
|
-
/** Current temperature in
|
|
64785
|
-
temperature: number().nullable(),
|
|
64786
|
-
/** Temperature unit string (e.g. `°C` / `°F`). Null when not provided. */
|
|
64787
|
-
temperatureUnit: string().nullable(),
|
|
64671
|
+
/** Current temperature in Celsius. Null when not provided or refused. */
|
|
64672
|
+
temperature: number().nullable().meta(readingMeta("temperature", { precision: 1 })),
|
|
64788
64673
|
/** Relative humidity (0..100). Null when not provided. */
|
|
64789
|
-
humidity: number().min(0).max(100).nullable(),
|
|
64790
|
-
/** Barometric pressure in
|
|
64791
|
-
pressure: number().nullable(),
|
|
64792
|
-
/**
|
|
64793
|
-
|
|
64794
|
-
/** Wind speed in the reported unit. Null when not provided. */
|
|
64795
|
-
windSpeed: number().nullable(),
|
|
64796
|
-
/** Wind-speed unit string (e.g. `km/h` / `mph`). Null when not provided. */
|
|
64797
|
-
windSpeedUnit: string().nullable(),
|
|
64674
|
+
humidity: number().min(0).max(100).nullable().meta(readingMeta("humidity")),
|
|
64675
|
+
/** Barometric pressure in hPa. Null when not provided or refused. */
|
|
64676
|
+
pressure: number().nullable().meta(readingMeta("pressure")),
|
|
64677
|
+
/** Wind speed in metres per second. Null when not provided or refused. */
|
|
64678
|
+
windSpeed: number().nullable().meta(readingMeta("speed")),
|
|
64798
64679
|
/** Wind bearing in degrees (0..360, meteorological). Null when not provided. */
|
|
64799
|
-
windBearing: number().nullable(),
|
|
64680
|
+
windBearing: number().nullable().meta(readingMeta("angle")),
|
|
64800
64681
|
/** Ms epoch when the slice was last updated. */
|
|
64801
64682
|
lastFetchedAt: number()
|
|
64802
64683
|
});
|
|
@@ -65673,6 +65554,11 @@ var UNIT_TABLE = {
|
|
|
65673
65554
|
factor: 1609.344,
|
|
65674
65555
|
offset: 0
|
|
65675
65556
|
},
|
|
65557
|
+
"m²": {
|
|
65558
|
+
dimension: "area",
|
|
65559
|
+
factor: 1,
|
|
65560
|
+
offset: 0
|
|
65561
|
+
},
|
|
65676
65562
|
lx: {
|
|
65677
65563
|
dimension: "illuminance",
|
|
65678
65564
|
factor: 1,
|
|
@@ -65777,6 +65663,121 @@ var UNIT_TABLE = {
|
|
|
65777
65663
|
dimension: "percentage",
|
|
65778
65664
|
factor: 1,
|
|
65779
65665
|
offset: 0
|
|
65666
|
+
},
|
|
65667
|
+
L: {
|
|
65668
|
+
dimension: "volume",
|
|
65669
|
+
factor: 1,
|
|
65670
|
+
offset: 0
|
|
65671
|
+
},
|
|
65672
|
+
mL: {
|
|
65673
|
+
dimension: "volume",
|
|
65674
|
+
factor: .001,
|
|
65675
|
+
offset: 0
|
|
65676
|
+
},
|
|
65677
|
+
gal: {
|
|
65678
|
+
dimension: "volume",
|
|
65679
|
+
factor: 3.785411784,
|
|
65680
|
+
offset: 0
|
|
65681
|
+
},
|
|
65682
|
+
s: {
|
|
65683
|
+
dimension: "duration",
|
|
65684
|
+
factor: 1,
|
|
65685
|
+
offset: 0
|
|
65686
|
+
},
|
|
65687
|
+
ms: {
|
|
65688
|
+
dimension: "duration",
|
|
65689
|
+
factor: .001,
|
|
65690
|
+
offset: 0
|
|
65691
|
+
},
|
|
65692
|
+
min: {
|
|
65693
|
+
dimension: "duration",
|
|
65694
|
+
factor: 60,
|
|
65695
|
+
offset: 0
|
|
65696
|
+
},
|
|
65697
|
+
h: {
|
|
65698
|
+
dimension: "duration",
|
|
65699
|
+
factor: 3600,
|
|
65700
|
+
offset: 0
|
|
65701
|
+
},
|
|
65702
|
+
d: {
|
|
65703
|
+
dimension: "duration",
|
|
65704
|
+
factor: 86400,
|
|
65705
|
+
offset: 0
|
|
65706
|
+
},
|
|
65707
|
+
B: {
|
|
65708
|
+
dimension: "information",
|
|
65709
|
+
factor: 1,
|
|
65710
|
+
offset: 0
|
|
65711
|
+
},
|
|
65712
|
+
KiB: {
|
|
65713
|
+
dimension: "information",
|
|
65714
|
+
factor: 1024,
|
|
65715
|
+
offset: 0
|
|
65716
|
+
},
|
|
65717
|
+
MiB: {
|
|
65718
|
+
dimension: "information",
|
|
65719
|
+
factor: 1024 ** 2,
|
|
65720
|
+
offset: 0
|
|
65721
|
+
},
|
|
65722
|
+
GiB: {
|
|
65723
|
+
dimension: "information",
|
|
65724
|
+
factor: 1024 ** 3,
|
|
65725
|
+
offset: 0
|
|
65726
|
+
},
|
|
65727
|
+
TiB: {
|
|
65728
|
+
dimension: "information",
|
|
65729
|
+
factor: 1024 ** 4,
|
|
65730
|
+
offset: 0
|
|
65731
|
+
},
|
|
65732
|
+
kB: {
|
|
65733
|
+
dimension: "information",
|
|
65734
|
+
factor: 1e3,
|
|
65735
|
+
offset: 0
|
|
65736
|
+
},
|
|
65737
|
+
MB: {
|
|
65738
|
+
dimension: "information",
|
|
65739
|
+
factor: 1e6,
|
|
65740
|
+
offset: 0
|
|
65741
|
+
},
|
|
65742
|
+
GB: {
|
|
65743
|
+
dimension: "information",
|
|
65744
|
+
factor: 1e9,
|
|
65745
|
+
offset: 0
|
|
65746
|
+
},
|
|
65747
|
+
"°": {
|
|
65748
|
+
dimension: "angle",
|
|
65749
|
+
factor: 1,
|
|
65750
|
+
offset: 0
|
|
65751
|
+
},
|
|
65752
|
+
dBFS: {
|
|
65753
|
+
dimension: "sound-level",
|
|
65754
|
+
factor: 1,
|
|
65755
|
+
offset: 0
|
|
65756
|
+
},
|
|
65757
|
+
dBm: {
|
|
65758
|
+
dimension: "signal-level",
|
|
65759
|
+
factor: 1,
|
|
65760
|
+
offset: 0
|
|
65761
|
+
},
|
|
65762
|
+
mired: {
|
|
65763
|
+
dimension: "colour-temperature",
|
|
65764
|
+
factor: 1,
|
|
65765
|
+
offset: 0
|
|
65766
|
+
},
|
|
65767
|
+
kbps: {
|
|
65768
|
+
dimension: "bitrate",
|
|
65769
|
+
factor: 1,
|
|
65770
|
+
offset: 0
|
|
65771
|
+
},
|
|
65772
|
+
Mbps: {
|
|
65773
|
+
dimension: "bitrate",
|
|
65774
|
+
factor: 1e3,
|
|
65775
|
+
offset: 0
|
|
65776
|
+
},
|
|
65777
|
+
fps: {
|
|
65778
|
+
dimension: "rate",
|
|
65779
|
+
factor: 1,
|
|
65780
|
+
offset: 0
|
|
65780
65781
|
}
|
|
65781
65782
|
};
|
|
65782
65783
|
/** Resolve a unit's `UnitSpec`, or `undefined` when the spelling is unknown. */
|
|
@@ -78987,7 +78988,6 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78987
78988
|
field: "value",
|
|
78988
78989
|
quantity: t("the reading", "il valore"),
|
|
78989
78990
|
label: t("Reading", "Valore"),
|
|
78990
|
-
unitField: "unit",
|
|
78991
78991
|
icon: "gauge"
|
|
78992
78992
|
}]
|
|
78993
78993
|
},
|
|
@@ -79123,7 +79123,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
79123
79123
|
field: "temperature",
|
|
79124
79124
|
quantity: t("the outdoor temperature", "la temperatura esterna"),
|
|
79125
79125
|
label: t("Temperature", "Temperatura"),
|
|
79126
|
-
|
|
79126
|
+
unit: "°C",
|
|
79127
79127
|
icon: "thermometer"
|
|
79128
79128
|
},
|
|
79129
79129
|
{
|
|
@@ -79139,7 +79139,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
79139
79139
|
field: "windSpeed",
|
|
79140
79140
|
quantity: t("the wind speed", "la velocità del vento"),
|
|
79141
79141
|
label: t("Wind", "Vento"),
|
|
79142
|
-
|
|
79142
|
+
unit: "m/s",
|
|
79143
79143
|
icon: "wind"
|
|
79144
79144
|
},
|
|
79145
79145
|
{
|
|
@@ -79147,7 +79147,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
79147
79147
|
field: "pressure",
|
|
79148
79148
|
quantity: t("the air pressure", "la pressione atmosferica"),
|
|
79149
79149
|
label: t("Pressure", "Pressione"),
|
|
79150
|
-
|
|
79150
|
+
unit: "hPa",
|
|
79151
79151
|
icon: "gauge"
|
|
79152
79152
|
}
|
|
79153
79153
|
]
|
|
@@ -82284,6 +82284,11 @@ var PulseOverrideDraftSchema = object({
|
|
|
82284
82284
|
targetId: string().min(1),
|
|
82285
82285
|
enabled: boolean(),
|
|
82286
82286
|
debounceMs: number().nonnegative(),
|
|
82287
|
+
edges: array(_enum([
|
|
82288
|
+
"rising",
|
|
82289
|
+
"button",
|
|
82290
|
+
"native-event"
|
|
82291
|
+
])).min(1).optional(),
|
|
82287
82292
|
sources: array(OverrideSourceSchema).min(1)
|
|
82288
82293
|
});
|
|
82289
82294
|
var SpanSourceDraftSchema = OverrideSourceSchema.extend({ mode: _enum([
|