@camstack/addon-provider-dreame 0.2.160 → 0.2.161
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 +6 -0
- package/dist/addon.js +171 -171
- package/dist/addon.mjs +171 -171
- package/package.json +1 -1
package/dist/addon.mjs
CHANGED
|
@@ -52899,7 +52899,7 @@ var DreameCameraStream = class extends TypedEmitter {
|
|
|
52899
52899
|
}
|
|
52900
52900
|
};
|
|
52901
52901
|
//#endregion
|
|
52902
|
-
//#region ../types/dist/event-category-
|
|
52902
|
+
//#region ../types/dist/event-category-DmZDPDf_.mjs
|
|
52903
52903
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
52904
52904
|
EventCategory["SystemBoot"] = "system.boot";
|
|
52905
52905
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -53526,7 +53526,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
53526
53526
|
* (a track was promoted to a stationary-registry entry) or departs (the
|
|
53527
53527
|
* object moved / was removed). Telemetry (D8): lossy, drives a UI refresh of
|
|
53528
53528
|
* the dedicated "Stationary" section — never the live event feed. Payload:
|
|
53529
|
-
* `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp }`.
|
|
53529
|
+
* `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp, observedAt, zones }`.
|
|
53530
53530
|
*/
|
|
53531
53531
|
EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
|
|
53532
53532
|
/**
|
|
@@ -58347,7 +58347,7 @@ var ZodIssueCode = {
|
|
|
58347
58347
|
var ZodFirstPartyTypeKind;
|
|
58348
58348
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
58349
58349
|
//#endregion
|
|
58350
|
-
//#region ../types/dist/sleep-
|
|
58350
|
+
//#region ../types/dist/sleep-Crlmu_tO.mjs
|
|
58351
58351
|
/**
|
|
58352
58352
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
58353
58353
|
* window to float samples (D455).
|
|
@@ -61657,11 +61657,11 @@ var CAP_NAMES = Object.freeze([
|
|
|
61657
61657
|
Object.freeze({
|
|
61658
61658
|
"air-quality-sensor": [
|
|
61659
61659
|
{
|
|
61660
|
-
"path": "
|
|
61660
|
+
"path": "co2",
|
|
61661
61661
|
"valueType": "number"
|
|
61662
61662
|
},
|
|
61663
61663
|
{
|
|
61664
|
-
"path": "
|
|
61664
|
+
"path": "voc",
|
|
61665
61665
|
"valueType": "number"
|
|
61666
61666
|
},
|
|
61667
61667
|
{
|
|
@@ -61711,7 +61711,7 @@ Object.freeze({
|
|
|
61711
61711
|
}
|
|
61712
61712
|
],
|
|
61713
61713
|
"ambient-light-sensor": [{
|
|
61714
|
-
"path": "
|
|
61714
|
+
"path": "illuminance",
|
|
61715
61715
|
"valueType": "number"
|
|
61716
61716
|
}],
|
|
61717
61717
|
"audio-metrics": [
|
|
@@ -61772,7 +61772,7 @@ Object.freeze({
|
|
|
61772
61772
|
],
|
|
61773
61773
|
"battery": [
|
|
61774
61774
|
{
|
|
61775
|
-
"path": "
|
|
61775
|
+
"path": "level",
|
|
61776
61776
|
"valueType": "number"
|
|
61777
61777
|
},
|
|
61778
61778
|
{
|
|
@@ -61794,7 +61794,7 @@ Object.freeze({
|
|
|
61794
61794
|
"valueType": "number"
|
|
61795
61795
|
},
|
|
61796
61796
|
{
|
|
61797
|
-
"path": "
|
|
61797
|
+
"path": "voltage",
|
|
61798
61798
|
"valueType": "number"
|
|
61799
61799
|
},
|
|
61800
61800
|
{
|
|
@@ -61815,7 +61815,7 @@ Object.freeze({
|
|
|
61815
61815
|
"valueType": "boolean"
|
|
61816
61816
|
}],
|
|
61817
61817
|
"brightness": [{
|
|
61818
|
-
"path": "
|
|
61818
|
+
"path": "level",
|
|
61819
61819
|
"valueType": "number"
|
|
61820
61820
|
}],
|
|
61821
61821
|
"broker": [{
|
|
@@ -62016,7 +62016,7 @@ Object.freeze({
|
|
|
62016
62016
|
"valueType": "number"
|
|
62017
62017
|
},
|
|
62018
62018
|
{
|
|
62019
|
-
"path": "
|
|
62019
|
+
"path": "colorTemperature",
|
|
62020
62020
|
"valueType": "number"
|
|
62021
62021
|
}
|
|
62022
62022
|
],
|
|
@@ -62195,15 +62195,15 @@ Object.freeze({
|
|
|
62195
62195
|
"valueType": "string"
|
|
62196
62196
|
},
|
|
62197
62197
|
{
|
|
62198
|
-
"path": "
|
|
62198
|
+
"path": "remaining",
|
|
62199
62199
|
"valueType": "number"
|
|
62200
62200
|
},
|
|
62201
62201
|
{
|
|
62202
|
-
"path": "
|
|
62202
|
+
"path": "delayedStart",
|
|
62203
62203
|
"valueType": "number"
|
|
62204
62204
|
},
|
|
62205
62205
|
{
|
|
62206
|
-
"path": "
|
|
62206
|
+
"path": "progress",
|
|
62207
62207
|
"valueType": "number"
|
|
62208
62208
|
},
|
|
62209
62209
|
{
|
|
@@ -62317,7 +62317,7 @@ Object.freeze({
|
|
|
62317
62317
|
],
|
|
62318
62318
|
"fan-control": [
|
|
62319
62319
|
{
|
|
62320
|
-
"path": "
|
|
62320
|
+
"path": "speed",
|
|
62321
62321
|
"valueType": "number"
|
|
62322
62322
|
},
|
|
62323
62323
|
{
|
|
@@ -62417,7 +62417,7 @@ Object.freeze({
|
|
|
62417
62417
|
}
|
|
62418
62418
|
],
|
|
62419
62419
|
"humidity-sensor": [{
|
|
62420
|
-
"path": "
|
|
62420
|
+
"path": "humidity",
|
|
62421
62421
|
"valueType": "number"
|
|
62422
62422
|
}],
|
|
62423
62423
|
"image": [{
|
|
@@ -62527,7 +62527,7 @@ Object.freeze({
|
|
|
62527
62527
|
"valueType": "number"
|
|
62528
62528
|
},
|
|
62529
62529
|
{
|
|
62530
|
-
"path": "
|
|
62530
|
+
"path": "progress",
|
|
62531
62531
|
"valueType": "number"
|
|
62532
62532
|
},
|
|
62533
62533
|
{
|
|
@@ -62606,11 +62606,11 @@ Object.freeze({
|
|
|
62606
62606
|
"valueType": "string"
|
|
62607
62607
|
},
|
|
62608
62608
|
{
|
|
62609
|
-
"path": "
|
|
62609
|
+
"path": "position",
|
|
62610
62610
|
"valueType": "number"
|
|
62611
62611
|
},
|
|
62612
62612
|
{
|
|
62613
|
-
"path": "
|
|
62613
|
+
"path": "duration",
|
|
62614
62614
|
"valueType": "number"
|
|
62615
62615
|
},
|
|
62616
62616
|
{
|
|
@@ -62712,11 +62712,11 @@ Object.freeze({
|
|
|
62712
62712
|
]
|
|
62713
62713
|
},
|
|
62714
62714
|
{
|
|
62715
|
-
"path": "
|
|
62715
|
+
"path": "signal",
|
|
62716
62716
|
"valueType": "number"
|
|
62717
62717
|
},
|
|
62718
62718
|
{
|
|
62719
|
-
"path": "
|
|
62719
|
+
"path": "rssi",
|
|
62720
62720
|
"valueType": "number"
|
|
62721
62721
|
},
|
|
62722
62722
|
{
|
|
@@ -62847,23 +62847,23 @@ Object.freeze({
|
|
|
62847
62847
|
],
|
|
62848
62848
|
"power-meter": [
|
|
62849
62849
|
{
|
|
62850
|
-
"path": "
|
|
62850
|
+
"path": "power",
|
|
62851
62851
|
"valueType": "number"
|
|
62852
62852
|
},
|
|
62853
62853
|
{
|
|
62854
|
-
"path": "
|
|
62854
|
+
"path": "energy",
|
|
62855
62855
|
"valueType": "number"
|
|
62856
62856
|
},
|
|
62857
62857
|
{
|
|
62858
|
-
"path": "
|
|
62858
|
+
"path": "voltage",
|
|
62859
62859
|
"valueType": "number"
|
|
62860
62860
|
},
|
|
62861
62861
|
{
|
|
62862
|
-
"path": "
|
|
62862
|
+
"path": "current",
|
|
62863
62863
|
"valueType": "number"
|
|
62864
62864
|
},
|
|
62865
62865
|
{
|
|
62866
|
-
"path": "
|
|
62866
|
+
"path": "apparentPower",
|
|
62867
62867
|
"valueType": "number"
|
|
62868
62868
|
},
|
|
62869
62869
|
{
|
|
@@ -62891,14 +62891,10 @@ Object.freeze({
|
|
|
62891
62891
|
{
|
|
62892
62892
|
"path": "gps.accuracyMeters",
|
|
62893
62893
|
"valueType": "number"
|
|
62894
|
-
},
|
|
62895
|
-
{
|
|
62896
|
-
"path": "batteryPercent",
|
|
62897
|
-
"valueType": "number"
|
|
62898
62894
|
}
|
|
62899
62895
|
],
|
|
62900
62896
|
"pressure-sensor": [{
|
|
62901
|
-
"path": "
|
|
62897
|
+
"path": "pressure",
|
|
62902
62898
|
"valueType": "number"
|
|
62903
62899
|
}],
|
|
62904
62900
|
"privacy-mask": [{
|
|
@@ -63212,7 +63208,7 @@ Object.freeze({
|
|
|
63212
63208
|
"valueType": "boolean"
|
|
63213
63209
|
}],
|
|
63214
63210
|
"temperature-sensor": [{
|
|
63215
|
-
"path": "
|
|
63211
|
+
"path": "temperature",
|
|
63216
63212
|
"valueType": "number"
|
|
63217
63213
|
}],
|
|
63218
63214
|
"update": [
|
|
@@ -63260,7 +63256,7 @@ Object.freeze({
|
|
|
63260
63256
|
"valueType": "string"
|
|
63261
63257
|
},
|
|
63262
63258
|
{
|
|
63263
|
-
"path": "
|
|
63259
|
+
"path": "progress",
|
|
63264
63260
|
"valueType": "number"
|
|
63265
63261
|
},
|
|
63266
63262
|
{
|
|
@@ -63759,7 +63755,7 @@ function errMsg(err) {
|
|
|
63759
63755
|
return String(err);
|
|
63760
63756
|
}
|
|
63761
63757
|
//#endregion
|
|
63762
|
-
//#region ../types/dist/composition-
|
|
63758
|
+
//#region ../types/dist/composition-CZImLpOI.mjs
|
|
63763
63759
|
/**
|
|
63764
63760
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
63765
63761
|
*
|
|
@@ -68523,6 +68519,14 @@ var AutomationConditionLeafSchema = object({
|
|
|
68523
68519
|
array(union([string(), number()]))
|
|
68524
68520
|
])
|
|
68525
68521
|
});
|
|
68522
|
+
var AutomationConditionStationaryPresentSchema = object({
|
|
68523
|
+
kind: literal("stationary-present"),
|
|
68524
|
+
deviceId: number().int().nonnegative(),
|
|
68525
|
+
/** Class names; a macro class matches every raw class that maps to it. */
|
|
68526
|
+
classes: array(string().min(1)).min(1).optional(),
|
|
68527
|
+
/** The parked object must be in at least one of these zones. */
|
|
68528
|
+
zones: array(string().min(1)).min(1).optional()
|
|
68529
|
+
});
|
|
68526
68530
|
/**
|
|
68527
68531
|
* The expression leaf, declared as a plain object rather than an intersection
|
|
68528
68532
|
* with {@link ExpressionSourceSchema}: a discriminated union has to be able to
|
|
@@ -68556,7 +68560,8 @@ var AutomationConditionSchema = lazy(() => discriminatedUnion("kind", [
|
|
|
68556
68560
|
child: AutomationConditionSchema
|
|
68557
68561
|
}),
|
|
68558
68562
|
AutomationConditionLeafSchema,
|
|
68559
|
-
AutomationConditionExpressionSchema
|
|
68563
|
+
AutomationConditionExpressionSchema,
|
|
68564
|
+
AutomationConditionStationaryPresentSchema
|
|
68560
68565
|
]));
|
|
68561
68566
|
/**
|
|
68562
68567
|
* What starts a run.
|
|
@@ -68610,6 +68615,17 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
|
|
|
68610
68615
|
/** Best-so-far confidence the track must reach. */
|
|
68611
68616
|
minScore: number().min(0).max(1).optional()
|
|
68612
68617
|
}),
|
|
68618
|
+
object({
|
|
68619
|
+
kind: literal("stationary"),
|
|
68620
|
+
deviceIds: array(number().int().nonnegative()).min(1),
|
|
68621
|
+
/** Class names; a macro class matches like the detection trigger. */
|
|
68622
|
+
classes: array(string().min(1)).min(1).optional(),
|
|
68623
|
+
/** The parked object must be in at least one of these zones. */
|
|
68624
|
+
zones: array(string().min(1)).min(1).optional(),
|
|
68625
|
+
/** `appeared`: it became parked. `departed`: the registry retired it.
|
|
68626
|
+
* The vocabulary of `PipelineAnalyticsStationaryChanged`. */
|
|
68627
|
+
phase: _enum(["appeared", "departed"])
|
|
68628
|
+
}),
|
|
68613
68629
|
object({
|
|
68614
68630
|
kind: literal("interval"),
|
|
68615
68631
|
minutes: number().int().min(1).max(1440)
|
|
@@ -68819,7 +68835,8 @@ var AutomationConditionTraceNodeSchema = object({
|
|
|
68819
68835
|
"any",
|
|
68820
68836
|
"not",
|
|
68821
68837
|
"condition",
|
|
68822
|
-
"expression"
|
|
68838
|
+
"expression",
|
|
68839
|
+
"stationary-present"
|
|
68823
68840
|
]),
|
|
68824
68841
|
outcome: TraceNodeOutcomeSchema,
|
|
68825
68842
|
reason: string(),
|
|
@@ -71718,7 +71735,7 @@ var CompositionEventPlanSchema = object({
|
|
|
71718
71735
|
stateField: string(),
|
|
71719
71736
|
fieldKey: string()
|
|
71720
71737
|
});
|
|
71721
|
-
/** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.
|
|
71738
|
+
/** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.temperature`. */
|
|
71722
71739
|
var CompositionProblemSchema = object({
|
|
71723
71740
|
code: _enum([
|
|
71724
71741
|
"reserved-variant",
|
|
@@ -72037,7 +72054,7 @@ var GROUP_TEMPLATES = [
|
|
|
72037
72054
|
summary: "Mean, median, min, max or sum of temperatures. Offline and unknown members are left out, never read as 0 °C.",
|
|
72038
72055
|
role: DeviceRole.TemperatureSensor,
|
|
72039
72056
|
outputCap: "temperature-sensor",
|
|
72040
|
-
outputField: "
|
|
72057
|
+
outputField: "temperature",
|
|
72041
72058
|
quantity: "temperature",
|
|
72042
72059
|
defaultAggregate: "mean",
|
|
72043
72060
|
empty: "null",
|
|
@@ -72048,7 +72065,7 @@ var GROUP_TEMPLATES = [
|
|
|
72048
72065
|
summary: "Humidity in percent. Offline and unknown members are left out, never read as 0 %.",
|
|
72049
72066
|
role: DeviceRole.HumiditySensor,
|
|
72050
72067
|
outputCap: "humidity-sensor",
|
|
72051
|
-
outputField: "
|
|
72068
|
+
outputField: "humidity",
|
|
72052
72069
|
quantity: "humidity",
|
|
72053
72070
|
defaultAggregate: "mean",
|
|
72054
72071
|
empty: "null",
|
|
@@ -72059,7 +72076,7 @@ var GROUP_TEMPLATES = [
|
|
|
72059
72076
|
summary: "Pressure in hectopascals. Offline and unknown members are left out, never read as 0 hPa.",
|
|
72060
72077
|
role: DeviceRole.PressureSensor,
|
|
72061
72078
|
outputCap: "pressure-sensor",
|
|
72062
|
-
outputField: "
|
|
72079
|
+
outputField: "pressure",
|
|
72063
72080
|
quantity: "pressure",
|
|
72064
72081
|
defaultAggregate: "mean",
|
|
72065
72082
|
empty: "null",
|
|
@@ -72070,7 +72087,7 @@ var GROUP_TEMPLATES = [
|
|
|
72070
72087
|
summary: "Illuminance in lux. Offline and unknown members are left out, never read as 0 lx.",
|
|
72071
72088
|
role: DeviceRole.AmbientLightSensor,
|
|
72072
72089
|
outputCap: "ambient-light-sensor",
|
|
72073
|
-
outputField: "
|
|
72090
|
+
outputField: "illuminance",
|
|
72074
72091
|
quantity: "illuminance",
|
|
72075
72092
|
defaultAggregate: "mean",
|
|
72076
72093
|
empty: "null",
|
|
@@ -72081,7 +72098,7 @@ var GROUP_TEMPLATES = [
|
|
|
72081
72098
|
summary: "Power in watts, summed by default. Nobody reporting omits the key rather than writing 0 W.",
|
|
72082
72099
|
role: DeviceRole.PowerSensor,
|
|
72083
72100
|
outputCap: "power-meter",
|
|
72084
|
-
outputField: "
|
|
72101
|
+
outputField: "power",
|
|
72085
72102
|
quantity: "power",
|
|
72086
72103
|
defaultAggregate: "sum",
|
|
72087
72104
|
empty: "omit",
|
|
@@ -72092,7 +72109,7 @@ var GROUP_TEMPLATES = [
|
|
|
72092
72109
|
summary: "Energy in kilowatt-hours, summed by default. Nobody reporting omits the key rather than writing 0 kWh.",
|
|
72093
72110
|
role: DeviceRole.EnergySensor,
|
|
72094
72111
|
outputCap: "power-meter",
|
|
72095
|
-
outputField: "
|
|
72112
|
+
outputField: "energy",
|
|
72096
72113
|
quantity: "energy",
|
|
72097
72114
|
defaultAggregate: "sum",
|
|
72098
72115
|
empty: "omit",
|
|
@@ -72103,7 +72120,7 @@ var GROUP_TEMPLATES = [
|
|
|
72103
72120
|
summary: "Battery charge in percent. Offline and unknown members are left out, never read as 0 %.",
|
|
72104
72121
|
role: DeviceRole.BatterySensor,
|
|
72105
72122
|
outputCap: "battery",
|
|
72106
|
-
outputField: "
|
|
72123
|
+
outputField: "level",
|
|
72107
72124
|
quantity: "percentage",
|
|
72108
72125
|
defaultAggregate: "mean",
|
|
72109
72126
|
empty: "null",
|
|
@@ -110646,9 +110663,9 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
|
|
|
110646
110663
|
*/
|
|
110647
110664
|
var AirQualitySensorStatusSchema = object({
|
|
110648
110665
|
/** Carbon dioxide concentration in ppm. */
|
|
110649
|
-
|
|
110666
|
+
co2: number().min(0).optional().meta(readingMeta("concentration-volume")),
|
|
110650
110667
|
/** Total volatile organic compounds in ppb. */
|
|
110651
|
-
|
|
110668
|
+
voc: number().min(0).optional().meta(readingMeta("concentration-ppb")),
|
|
110652
110669
|
/** Particulate matter ≤ 2.5 μm in µg/m³. */
|
|
110653
110670
|
pm25: number().min(0).optional().meta(readingMeta("concentration-mass")),
|
|
110654
110671
|
/** Particulate matter ≤ 10 μm in µg/m³. */
|
|
@@ -110681,12 +110698,12 @@ var airQualitySensorCapability = {
|
|
|
110681
110698
|
* History (D850): recorded series.
|
|
110682
110699
|
*/
|
|
110683
110700
|
history: { fields: {
|
|
110684
|
-
|
|
110701
|
+
co2: {
|
|
110685
110702
|
kind: "gauge",
|
|
110686
110703
|
unit: "ppm",
|
|
110687
110704
|
deadband: 5
|
|
110688
110705
|
},
|
|
110689
|
-
|
|
110706
|
+
voc: {
|
|
110690
110707
|
kind: "gauge",
|
|
110691
110708
|
unit: "ppb",
|
|
110692
110709
|
deadband: 5
|
|
@@ -110717,7 +110734,7 @@ var airQualitySensorCapability = {
|
|
|
110717
110734
|
*/
|
|
110718
110735
|
var AmbientLightSensorStatusSchema = object({
|
|
110719
110736
|
/** Current illuminance in lux (lx). `null` when the sample was refused (D393). */
|
|
110720
|
-
|
|
110737
|
+
illuminance: number().min(0).nullable().meta(readingMeta("illuminance", {
|
|
110721
110738
|
precision: 0,
|
|
110722
110739
|
label: "Illuminance"
|
|
110723
110740
|
})),
|
|
@@ -110746,7 +110763,7 @@ var ambientLightSensorCapability = {
|
|
|
110746
110763
|
/**
|
|
110747
110764
|
* History (D850): recorded series. Wide range, so a RELATIVE deadband (10 %).
|
|
110748
110765
|
*/
|
|
110749
|
-
history: { fields: {
|
|
110766
|
+
history: { fields: { illuminance: {
|
|
110750
110767
|
kind: "gauge",
|
|
110751
110768
|
unit: "lx",
|
|
110752
110769
|
deadbandPct: 10,
|
|
@@ -111059,7 +111076,7 @@ var BatteryStatusSchema = object({
|
|
|
111059
111076
|
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
111060
111077
|
* declines to band a non-finite reading, which is the correct shape.
|
|
111061
111078
|
*/
|
|
111062
|
-
|
|
111079
|
+
level: number().min(0).max(100).nullable().meta(readingMeta("percentage", { label: "Charge" })),
|
|
111063
111080
|
/**
|
|
111064
111081
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
111065
111082
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
|
@@ -111069,7 +111086,7 @@ var BatteryStatusSchema = object({
|
|
|
111069
111086
|
* `'unknown'` is the absence of an answer: the provider has not read the
|
|
111070
111087
|
* power fields yet, or the firmware reported neither. Before it existed,
|
|
111071
111088
|
* two unreadable fields produced `'none'`, and a camera nobody had reached
|
|
111072
|
-
* was drawn "on battery alone" — the same D315 defect `
|
|
111089
|
+
* was drawn "on battery alone" — the same D315 defect `level` closed
|
|
111073
111090
|
* by going nullable. Consumers SKIP it (no charger state published, no
|
|
111074
111091
|
* glyph, no HomeKit ChargingState) rather than coerce it either way.
|
|
111075
111092
|
*/
|
|
@@ -111093,7 +111110,7 @@ var BatteryStatusSchema = object({
|
|
|
111093
111110
|
* that only report charge. A second reading on this cap, not a second
|
|
111094
111111
|
* `numeric-sensor` on the same device.
|
|
111095
111112
|
*/
|
|
111096
|
-
|
|
111113
|
+
voltage: number().nullable().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
111097
111114
|
/**
|
|
111098
111115
|
* Ms epoch of the last time the device PROVED it was reachable — a
|
|
111099
111116
|
* completed firmware round-trip, an observed wake, or an inbound push
|
|
@@ -111127,7 +111144,7 @@ var BatteryStatusSchema = object({
|
|
|
111127
111144
|
/**
|
|
111128
111145
|
* True when the source is a BINARY low-battery indicator (HA
|
|
111129
111146
|
* `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
|
|
111130
|
-
* charge level — `
|
|
111147
|
+
* charge level — `level` is then a coarse stand-in (100 = normal,
|
|
111131
111148
|
* sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
|
|
111132
111149
|
* misleading exact percentage. Absent/false → genuine 0–100 % reading.
|
|
111133
111150
|
*/
|
|
@@ -111147,15 +111164,15 @@ var BATTERY_DEVICE_TYPES = [
|
|
|
111147
111164
|
var batteryCustomize = {
|
|
111148
111165
|
version: 1,
|
|
111149
111166
|
targets: [{
|
|
111150
|
-
id: "
|
|
111167
|
+
id: "level",
|
|
111151
111168
|
cardinality: "scalar",
|
|
111152
111169
|
vocabulary: {
|
|
111153
111170
|
cap: "battery",
|
|
111154
|
-
stateField: "
|
|
111171
|
+
stateField: "level"
|
|
111155
111172
|
},
|
|
111156
111173
|
deviceTypes: BATTERY_DEVICE_TYPES,
|
|
111157
111174
|
apply: "add",
|
|
111158
|
-
path: "
|
|
111175
|
+
path: "level",
|
|
111159
111176
|
sources: [{
|
|
111160
111177
|
kind: "field",
|
|
111161
111178
|
valueKinds: ["number", "string"],
|
|
@@ -111249,7 +111266,7 @@ onStatusChanged: { data: object({
|
|
|
111249
111266
|
schema: BatteryStatusSchema,
|
|
111250
111267
|
kind: "push",
|
|
111251
111268
|
empty: {
|
|
111252
|
-
|
|
111269
|
+
level: null,
|
|
111253
111270
|
charging: "unknown",
|
|
111254
111271
|
sleeping: false,
|
|
111255
111272
|
lastUpdated: 0
|
|
@@ -111276,11 +111293,11 @@ onStatusChanged: { data: object({
|
|
|
111276
111293
|
* History (D850): recorded series. The generic capture replaces the `battery` series of `pipeline-analytics:stats-5m`.
|
|
111277
111294
|
*/
|
|
111278
111295
|
history: { fields: {
|
|
111279
|
-
|
|
111296
|
+
level: {
|
|
111280
111297
|
kind: "gauge",
|
|
111281
111298
|
unit: "%"
|
|
111282
111299
|
},
|
|
111283
|
-
|
|
111300
|
+
voltage: {
|
|
111284
111301
|
kind: "gauge",
|
|
111285
111302
|
unit: "V"
|
|
111286
111303
|
}
|
|
@@ -111340,14 +111357,14 @@ var binaryCapability = {
|
|
|
111340
111357
|
* controls to this single-method surface.
|
|
111341
111358
|
*
|
|
111342
111359
|
* The cap is intentionally minimal: a single `setBrightness({deviceId,
|
|
111343
|
-
*
|
|
111360
|
+
* level})` mutation plus the auto-injected `getStatus`. Drivers
|
|
111344
111361
|
* that expose richer controls (color temperature, scenes, schedules)
|
|
111345
111362
|
* should surface those via the device's `getSettingsUISchema()`
|
|
111346
111363
|
* instead of bloating this cap.
|
|
111347
111364
|
*/
|
|
111348
111365
|
var BrightnessStatusSchema = object({
|
|
111349
111366
|
/** Current level as 0..100 inclusive. Firmware-reported. */
|
|
111350
|
-
|
|
111367
|
+
level: number().min(0).max(100).meta(readingMeta("percentage")),
|
|
111351
111368
|
/** Ms epoch of the last operator-driven change. Useful for UI freshness. */
|
|
111352
111369
|
lastChangedAt: number()
|
|
111353
111370
|
});
|
|
@@ -111359,7 +111376,7 @@ var brightnessCapability = {
|
|
|
111359
111376
|
deviceTypes: [DeviceType.Light],
|
|
111360
111377
|
methods: { setBrightness: method(object({
|
|
111361
111378
|
deviceId: number().int().nonnegative(),
|
|
111362
|
-
|
|
111379
|
+
level: number().min(0).max(100)
|
|
111363
111380
|
}), _void(), {
|
|
111364
111381
|
kind: "mutation",
|
|
111365
111382
|
auth: "protected"
|
|
@@ -111372,7 +111389,7 @@ var brightnessCapability = {
|
|
|
111372
111389
|
*/
|
|
111373
111390
|
onBrightnessChanged: { data: object({
|
|
111374
111391
|
deviceId: number(),
|
|
111375
|
-
|
|
111392
|
+
level: number().min(0).max(100),
|
|
111376
111393
|
lastChangedAt: number()
|
|
111377
111394
|
}) } },
|
|
111378
111395
|
status: {
|
|
@@ -111395,7 +111412,7 @@ onBrightnessChanged: { data: object({
|
|
|
111395
111412
|
/**
|
|
111396
111413
|
* History (D850): recorded series. Actuator tier: level keeps every change.
|
|
111397
111414
|
*/
|
|
111398
|
-
history: { fields: {
|
|
111415
|
+
history: { fields: { level: {
|
|
111399
111416
|
kind: "gauge",
|
|
111400
111417
|
unit: "%",
|
|
111401
111418
|
minIntervalMs: 0
|
|
@@ -112009,11 +112026,11 @@ var ColorInputSchema = discriminatedUnion("mode", [
|
|
|
112009
112026
|
}),
|
|
112010
112027
|
object({
|
|
112011
112028
|
mode: literal("mired"),
|
|
112012
|
-
|
|
112029
|
+
colorTemperature: number().int().min(50).max(1e3)
|
|
112013
112030
|
})
|
|
112014
112031
|
]);
|
|
112015
112032
|
var ColorStatusSchema = object({
|
|
112016
|
-
/** Active color mode — which of `rgb` / `hsv` / `
|
|
112033
|
+
/** Active color mode — which of `rgb` / `hsv` / `colorTemperature` reflects
|
|
112017
112034
|
* the bulb's current state. */
|
|
112018
112035
|
mode: _enum([
|
|
112019
112036
|
"rgb",
|
|
@@ -112025,7 +112042,7 @@ var ColorStatusSchema = object({
|
|
|
112025
112042
|
/** Populated when `mode === 'hsv'`. */
|
|
112026
112043
|
hsv: HsvTripletSchema.optional(),
|
|
112027
112044
|
/** Populated when `mode === 'mired'`. */
|
|
112028
|
-
|
|
112045
|
+
colorTemperature: number().int().optional().meta(readingMeta("colour-temperature")),
|
|
112029
112046
|
/** Ms epoch of the last operator-driven change. */
|
|
112030
112047
|
lastChangedAt: number()
|
|
112031
112048
|
});
|
|
@@ -112057,7 +112074,7 @@ onColorChanged: { data: object({
|
|
|
112057
112074
|
]),
|
|
112058
112075
|
rgb: RgbTripletSchema.optional(),
|
|
112059
112076
|
hsv: HsvTripletSchema.optional(),
|
|
112060
|
-
|
|
112077
|
+
colorTemperature: number().int().optional(),
|
|
112061
112078
|
lastChangedAt: number()
|
|
112062
112079
|
}) } },
|
|
112063
112080
|
status: {
|
|
@@ -112946,11 +112963,11 @@ var DishwasherStatusSchema = object({
|
|
|
112946
112963
|
/** Feature keys of the programs the appliance currently offers — drives the UI selector. */
|
|
112947
112964
|
availablePrograms: array(string()),
|
|
112948
112965
|
/** Seconds remaining on the active cycle, or null when not running / not known. */
|
|
112949
|
-
|
|
112966
|
+
remaining: number().int().nonnegative().nullable().meta(readingMeta("duration")),
|
|
112950
112967
|
/** Seconds the delayed start is set to (time until the cycle starts), or null. */
|
|
112951
|
-
|
|
112968
|
+
delayedStart: number().int().nonnegative().nullable().meta(readingMeta("duration")),
|
|
112952
112969
|
/** Cycle completion 0..100, or null when not applicable. */
|
|
112953
|
-
|
|
112970
|
+
progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
112954
112971
|
/** True when the door is reported open; null when the door state is not known. */
|
|
112955
112972
|
doorOpen: boolean().nullable(),
|
|
112956
112973
|
/** True when the door is latched (locked) during a cycle; null when not reported. */
|
|
@@ -113169,14 +113186,14 @@ var dishwasherCapability = {
|
|
|
113169
113186
|
runtimeState: DishwasherStatusSchema,
|
|
113170
113187
|
durability: "session",
|
|
113171
113188
|
history: { fields: {
|
|
113172
|
-
|
|
113189
|
+
progress: {
|
|
113173
113190
|
kind: "gauge",
|
|
113174
113191
|
unit: "%",
|
|
113175
113192
|
deadband: 2
|
|
113176
113193
|
},
|
|
113177
113194
|
state: { kind: "enum" },
|
|
113178
113195
|
operationState: { kind: "enum" },
|
|
113179
|
-
|
|
113196
|
+
remaining: {
|
|
113180
113197
|
kind: "gauge",
|
|
113181
113198
|
unit: "s",
|
|
113182
113199
|
minIntervalMs: 6e4
|
|
@@ -113767,7 +113784,7 @@ var FanDirectionSchema = _enum(["forward", "reverse"]);
|
|
|
113767
113784
|
var FanControlStatusSchema = object({
|
|
113768
113785
|
/** Active speed as 0..100 inclusive. Null when the device has no
|
|
113769
113786
|
* speed surface (single-speed fan). */
|
|
113770
|
-
|
|
113787
|
+
speed: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
113771
113788
|
/** Speed granularity the device accepts (HA `percentage_step`, e.g. 25 for
|
|
113772
113789
|
* a 4-speed fan). Absent when unknown — the UI then falls back to step 1. */
|
|
113773
113790
|
percentageStep: number().positive().optional().meta(readingMeta("percentage")),
|
|
@@ -113794,7 +113811,7 @@ var fanControlCapability = {
|
|
|
113794
113811
|
methods: {
|
|
113795
113812
|
setPercentage: method(object({
|
|
113796
113813
|
deviceId: number().int().nonnegative(),
|
|
113797
|
-
|
|
113814
|
+
speed: number().min(0).max(100)
|
|
113798
113815
|
}), _void(), {
|
|
113799
113816
|
kind: "mutation",
|
|
113800
113817
|
auth: "protected"
|
|
@@ -113827,7 +113844,7 @@ var fanControlCapability = {
|
|
|
113827
113844
|
},
|
|
113828
113845
|
/**
|
|
113829
113846
|
* Runtime-state slice — mirrored by the kernel. UI fan speed
|
|
113830
|
-
* sliders read `
|
|
113847
|
+
* sliders read `speed` for live updates.
|
|
113831
113848
|
*/
|
|
113832
113849
|
runtimeState: FanControlStatusSchema,
|
|
113833
113850
|
/**
|
|
@@ -113841,7 +113858,7 @@ var fanControlCapability = {
|
|
|
113841
113858
|
* History (D850): recorded series. Actuator tier: speed keeps every change.
|
|
113842
113859
|
*/
|
|
113843
113860
|
history: { fields: {
|
|
113844
|
-
|
|
113861
|
+
speed: {
|
|
113845
113862
|
kind: "gauge",
|
|
113846
113863
|
unit: "%",
|
|
113847
113864
|
minIntervalMs: 0
|
|
@@ -114286,7 +114303,7 @@ var humidifierCapability = {
|
|
|
114286
114303
|
*/
|
|
114287
114304
|
var HumiditySensorStatusSchema = object({
|
|
114288
114305
|
/** Current relative humidity, 0..100. `null` when the sample was refused (D393). */
|
|
114289
|
-
|
|
114306
|
+
humidity: number().min(0).max(100).nullable().meta(readingMeta("humidity", {
|
|
114290
114307
|
precision: 0,
|
|
114291
114308
|
label: "Humidity"
|
|
114292
114309
|
})),
|
|
@@ -114315,7 +114332,7 @@ var humiditySensorCapability = {
|
|
|
114315
114332
|
/**
|
|
114316
114333
|
* History (D850): recorded series.
|
|
114317
114334
|
*/
|
|
114318
|
-
history: { fields: {
|
|
114335
|
+
history: { fields: { humidity: {
|
|
114319
114336
|
kind: "gauge",
|
|
114320
114337
|
unit: "%",
|
|
114321
114338
|
deadband: .5
|
|
@@ -114955,7 +114972,7 @@ var LawnMowerControlStatusSchema = object({
|
|
|
114955
114972
|
batteryLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
114956
114973
|
/** 0..100 mowing-completion percentage of the current task, or null when no
|
|
114957
114974
|
* task is active / progress is unavailable. */
|
|
114958
|
-
|
|
114975
|
+
progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
114959
114976
|
/** Current device/event code (dynamic — mostly status, sometimes an error),
|
|
114960
114977
|
* or null when unknown. */
|
|
114961
114978
|
currentCode: number().nullable().meta(readingMeta("none")),
|
|
@@ -115455,7 +115472,7 @@ var lockControlCapability = {
|
|
|
115455
115472
|
volatileStateFields: ["lastChangedAt"]
|
|
115456
115473
|
};
|
|
115457
115474
|
/**
|
|
115458
|
-
* A monotonic total between resets (D944). Energy uses `power-meter.
|
|
115475
|
+
* A monotonic total between resets (D944). Energy uses `power-meter.energy`
|
|
115459
115476
|
* so dashboards keep one series; every other instantaneous reading lands here.
|
|
115460
115477
|
* `value` is the time integral in the source quantity's accumulated base
|
|
115461
115478
|
* (base-unit seconds, or kWh on the power meter). `null` is a gap, never zero.
|
|
@@ -115549,10 +115566,10 @@ var MediaPlayerStatusSchema = object({
|
|
|
115549
115566
|
currentMedia: MediaInfoSchema.nullable(),
|
|
115550
115567
|
/** Current playback position in ms. Null when not seekable or
|
|
115551
115568
|
* nothing is playing. Pair with `DeviceFeature.MediaPlayerSeek`. */
|
|
115552
|
-
|
|
115569
|
+
position: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
|
|
115553
115570
|
/** Total duration of the current media in ms. Null when unknown
|
|
115554
115571
|
* (live stream) or nothing is playing. */
|
|
115555
|
-
|
|
115572
|
+
duration: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
|
|
115556
115573
|
/** Shuffle toggle. Null when no shuffle surface.
|
|
115557
115574
|
* Pair with `DeviceFeature.MediaPlayerShuffle`. */
|
|
115558
115575
|
shuffle: boolean().nullable(),
|
|
@@ -115591,7 +115608,7 @@ var mediaPlayerCapability = {
|
|
|
115591
115608
|
}),
|
|
115592
115609
|
seek: method(object({
|
|
115593
115610
|
deviceId: number().int().nonnegative(),
|
|
115594
|
-
|
|
115611
|
+
position: number().int().nonnegative()
|
|
115595
115612
|
}), _void(), {
|
|
115596
115613
|
kind: "mutation",
|
|
115597
115614
|
auth: "protected"
|
|
@@ -115663,7 +115680,7 @@ var mediaPlayerCapability = {
|
|
|
115663
115680
|
/**
|
|
115664
115681
|
* History (D850): volume (a level an operator or an automation sets; the
|
|
115665
115682
|
* default 10 s floor folds a slider drag into its end value) and mute.
|
|
115666
|
-
* `
|
|
115683
|
+
* `position` is not recorded: it moves continuously while playing.
|
|
115667
115684
|
*/
|
|
115668
115685
|
history: { fields: {
|
|
115669
115686
|
volumeLevel: {
|
|
@@ -116762,9 +116779,9 @@ var NetworkLinkStatusSchema = object({
|
|
|
116762
116779
|
* one whose reading has not landed must not be drawn at 0 %. Consumers
|
|
116763
116780
|
* SKIP a null rather than coerce it.
|
|
116764
116781
|
*/
|
|
116765
|
-
|
|
116782
|
+
signal: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
116766
116783
|
/** Raw received signal strength in dBm, when the firmware reports one. */
|
|
116767
|
-
|
|
116784
|
+
rssi: number().optional().meta(readingMeta("signal-level")),
|
|
116768
116785
|
/** Network name of a wireless link, when the firmware reports it. */
|
|
116769
116786
|
ssid: string().optional(),
|
|
116770
116787
|
/** Ms epoch of the last observation. Lets consumers reason about freshness. */
|
|
@@ -116773,7 +116790,7 @@ var NetworkLinkStatusSchema = object({
|
|
|
116773
116790
|
/** The slice a provider seeds before its first read: nothing is known yet. */
|
|
116774
116791
|
var NETWORK_LINK_UNKNOWN = {
|
|
116775
116792
|
type: "unknown",
|
|
116776
|
-
|
|
116793
|
+
signal: null,
|
|
116777
116794
|
lastUpdated: 0
|
|
116778
116795
|
};
|
|
116779
116796
|
/**
|
|
@@ -116834,13 +116851,13 @@ onStatusChanged: { data: object({
|
|
|
116834
116851
|
* History (D850): recorded series.
|
|
116835
116852
|
*/
|
|
116836
116853
|
history: { fields: {
|
|
116837
|
-
|
|
116854
|
+
signal: {
|
|
116838
116855
|
kind: "gauge",
|
|
116839
116856
|
unit: "%",
|
|
116840
116857
|
deadband: 3,
|
|
116841
116858
|
minIntervalMs: 6e4
|
|
116842
116859
|
},
|
|
116843
|
-
|
|
116860
|
+
rssi: {
|
|
116844
116861
|
kind: "gauge",
|
|
116845
116862
|
unit: "dBm",
|
|
116846
116863
|
deadband: 2,
|
|
@@ -118160,16 +118177,16 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
|
|
|
118160
118177
|
* in real-world devices.
|
|
118161
118178
|
*/
|
|
118162
118179
|
var PowerMeterStatusSchema = object({
|
|
118163
|
-
/** Instantaneous power draw
|
|
118164
|
-
|
|
118180
|
+
/** Instantaneous power draw (watts). */
|
|
118181
|
+
power: number().optional().meta(readingMeta("power", { label: "Power" })),
|
|
118165
118182
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
118166
|
-
|
|
118167
|
-
/** Voltage
|
|
118168
|
-
|
|
118183
|
+
energy: number().optional().meta(readingMeta("energy", { label: "Energy" })),
|
|
118184
|
+
/** Voltage (volts). */
|
|
118185
|
+
voltage: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
118169
118186
|
/** Current in amperes. */
|
|
118170
|
-
|
|
118187
|
+
current: number().optional().meta(readingMeta("current", { label: "Current" })),
|
|
118171
118188
|
/** Apparent power in volt-amperes. */
|
|
118172
|
-
|
|
118189
|
+
apparentPower: number().optional().meta(readingMeta("apparent-power")),
|
|
118173
118190
|
/** Power factor (0..1) if reported. */
|
|
118174
118191
|
powerFactor: number().min(0).max(1).optional().meta(readingMeta("ratio")),
|
|
118175
118192
|
/** Ms epoch when the slice was last updated. */
|
|
@@ -118227,14 +118244,14 @@ function powerTarget(id, unit) {
|
|
|
118227
118244
|
advancedExpression: true
|
|
118228
118245
|
};
|
|
118229
118246
|
}
|
|
118230
|
-
/** "Power and energy" extension:
|
|
118247
|
+
/** "Power and energy" extension: power, energy, voltage and current from other devices (D951). */
|
|
118231
118248
|
var powerMeterCustomize = {
|
|
118232
118249
|
version: 1,
|
|
118233
118250
|
targets: [
|
|
118234
|
-
powerTarget("
|
|
118235
|
-
powerTarget("
|
|
118236
|
-
powerTarget("
|
|
118237
|
-
powerTarget("
|
|
118251
|
+
powerTarget("power", "W"),
|
|
118252
|
+
powerTarget("energy", "kWh"),
|
|
118253
|
+
powerTarget("voltage", "V"),
|
|
118254
|
+
powerTarget("current", "A")
|
|
118238
118255
|
]
|
|
118239
118256
|
};
|
|
118240
118257
|
var powerMeterCapability = {
|
|
@@ -118250,41 +118267,41 @@ var powerMeterCapability = {
|
|
|
118250
118267
|
},
|
|
118251
118268
|
runtimeState: PowerMeterStatusSchema,
|
|
118252
118269
|
/**
|
|
118253
|
-
* Runtime-state durability: **restored** — as `numeric-sensor`; `
|
|
118270
|
+
* Runtime-state durability: **restored** — as `numeric-sensor`; `energy` is an accumulator whose restored value is the baseline.
|
|
118254
118271
|
*
|
|
118255
118272
|
* See `RuntimeStateDurability`. Enforced by
|
|
118256
118273
|
* `scripts/check-runtime-state-durability.ts`.
|
|
118257
118274
|
*/
|
|
118258
118275
|
durability: "restored",
|
|
118259
118276
|
/**
|
|
118260
|
-
* History (D850): recorded series. Gauges are floored at 30 s; `
|
|
118277
|
+
* History (D850): recorded series. Gauges are floored at 30 s; `energy` is the one monotonic meter (counter).
|
|
118261
118278
|
*/
|
|
118262
118279
|
history: { fields: {
|
|
118263
|
-
|
|
118280
|
+
power: {
|
|
118264
118281
|
kind: "gauge",
|
|
118265
118282
|
unit: "W",
|
|
118266
118283
|
deadband: 1,
|
|
118267
118284
|
minIntervalMs: 3e4
|
|
118268
118285
|
},
|
|
118269
|
-
|
|
118286
|
+
energy: {
|
|
118270
118287
|
kind: "counter",
|
|
118271
118288
|
unit: "kWh",
|
|
118272
118289
|
deadband: .01,
|
|
118273
118290
|
minIntervalMs: 6e4
|
|
118274
118291
|
},
|
|
118275
|
-
|
|
118292
|
+
voltage: {
|
|
118276
118293
|
kind: "gauge",
|
|
118277
118294
|
unit: "V",
|
|
118278
118295
|
deadband: 1,
|
|
118279
118296
|
minIntervalMs: 3e4
|
|
118280
118297
|
},
|
|
118281
|
-
|
|
118298
|
+
current: {
|
|
118282
118299
|
kind: "gauge",
|
|
118283
118300
|
unit: "A",
|
|
118284
118301
|
deadband: .05,
|
|
118285
118302
|
minIntervalMs: 3e4
|
|
118286
118303
|
},
|
|
118287
|
-
|
|
118304
|
+
apparentPower: {
|
|
118288
118305
|
kind: "gauge",
|
|
118289
118306
|
unit: "VA",
|
|
118290
118307
|
deadband: 1,
|
|
@@ -118334,9 +118351,6 @@ var PresenceStatusSchema = object({
|
|
|
118334
118351
|
location: string().nullable(),
|
|
118335
118352
|
/** GPS coordinates when available. Null otherwise. */
|
|
118336
118353
|
gps: GpsLocationSchema.nullable(),
|
|
118337
|
-
/** Optional battery level of the tracking device (0..100). Null
|
|
118338
|
-
* when not reported. */
|
|
118339
|
-
batteryPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
118340
118354
|
/** Ms epoch when the slice was last updated. */
|
|
118341
118355
|
lastChangedAt: number()
|
|
118342
118356
|
});
|
|
@@ -118365,14 +118379,7 @@ var presenceCapability = {
|
|
|
118365
118379
|
* `scripts/check-runtime-state-durability.ts`.
|
|
118366
118380
|
*/
|
|
118367
118381
|
durability: "restored",
|
|
118368
|
-
|
|
118369
|
-
* History (D850): recorded series.
|
|
118370
|
-
*/
|
|
118371
|
-
history: { fields: { batteryPercent: {
|
|
118372
|
-
kind: "gauge",
|
|
118373
|
-
unit: "%",
|
|
118374
|
-
deadband: 1
|
|
118375
|
-
} } },
|
|
118382
|
+
history: "none",
|
|
118376
118383
|
/** Clock fields: written, but excluded from the compare that decides
|
|
118377
118384
|
* whether persisting is worth a SQLite commit. */
|
|
118378
118385
|
volatileStateFields: ["lastChangedAt"]
|
|
@@ -118387,7 +118394,7 @@ var presenceCapability = {
|
|
|
118387
118394
|
*/
|
|
118388
118395
|
var PressureSensorStatusSchema = object({
|
|
118389
118396
|
/** Current pressure in hPa. `null` when the sample was refused (D393). */
|
|
118390
|
-
|
|
118397
|
+
pressure: number().nullable().meta(readingMeta("pressure", { precision: 0 })),
|
|
118391
118398
|
/** Ms epoch when the slice was last updated. */
|
|
118392
118399
|
lastFetchedAt: number()
|
|
118393
118400
|
});
|
|
@@ -118413,7 +118420,7 @@ var pressureSensorCapability = {
|
|
|
118413
118420
|
/**
|
|
118414
118421
|
* History (D850): recorded series.
|
|
118415
118422
|
*/
|
|
118416
|
-
history: { fields: {
|
|
118423
|
+
history: { fields: { pressure: {
|
|
118417
118424
|
kind: "gauge",
|
|
118418
118425
|
unit: "hPa",
|
|
118419
118426
|
deadband: .1
|
|
@@ -122120,7 +122127,7 @@ var tamperCapability = {
|
|
|
122120
122127
|
*/
|
|
122121
122128
|
var TemperatureSensorStatusSchema = object({
|
|
122122
122129
|
/** Current temperature in Celsius. `null` when the sample was refused (D393). */
|
|
122123
|
-
|
|
122130
|
+
temperature: number().nullable().meta(readingMeta("temperature", {
|
|
122124
122131
|
precision: 1,
|
|
122125
122132
|
label: "Temperature"
|
|
122126
122133
|
})),
|
|
@@ -122149,7 +122156,7 @@ var temperatureSensorCapability = {
|
|
|
122149
122156
|
/**
|
|
122150
122157
|
* History (D850): recorded series.
|
|
122151
122158
|
*/
|
|
122152
|
-
history: { fields: {
|
|
122159
|
+
history: { fields: { temperature: {
|
|
122153
122160
|
kind: "gauge",
|
|
122154
122161
|
unit: "°C",
|
|
122155
122162
|
deadband: .1
|
|
@@ -122446,7 +122453,7 @@ var VacuumControlStatusSchema = object({
|
|
|
122446
122453
|
/** Speed tokens the hardware accepts — drives the UI selector. */
|
|
122447
122454
|
availableFanSpeeds: array(string()),
|
|
122448
122455
|
/** 0..100 cleaning-completion percentage of the current task, or null. */
|
|
122449
|
-
|
|
122456
|
+
progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
122450
122457
|
/** Current error code (0 / null = no error). */
|
|
122451
122458
|
errorCode: number().nullable().meta(readingMeta("none")),
|
|
122452
122459
|
/** Human label for {@link errorCode}, or null when none / undecodable. */
|
|
@@ -124528,7 +124535,7 @@ var BaseDevice = class {
|
|
|
124528
124535
|
* `device-local-state.ts`. Drivers access via:
|
|
124529
124536
|
*
|
|
124530
124537
|
* `this.state.battery.sleeping = true` // patches the battery slice
|
|
124531
|
-
* `const pct = this.state.battery.
|
|
124538
|
+
* `const pct = this.state.battery.level` // reads the battery slice
|
|
124532
124539
|
* `this.state.deviceStatus.online = true` // mirrors `markOnline(true)`
|
|
124533
124540
|
*
|
|
124534
124541
|
* Adding a new cap with `runtimeState:` automatically extends this
|
|
@@ -124568,7 +124575,7 @@ var BaseDevice = class {
|
|
|
124568
124575
|
* shape; drivers don't redeclare it, they just write through.
|
|
124569
124576
|
*
|
|
124570
124577
|
* Read: `this.runtimeState.getCapState('battery')` →
|
|
124571
|
-
* `{
|
|
124578
|
+
* `{level, charging, sleeping, lastUpdated}` for any
|
|
124572
124579
|
* provider that registers `batteryCapability`.
|
|
124573
124580
|
* Write: `this.runtimeState.setCapState('battery', { … })`.
|
|
124574
124581
|
*
|
|
@@ -135787,7 +135794,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135787
135794
|
label: t("Full brightness", "Luminosità massima"),
|
|
135788
135795
|
phrase: t("Set {device} to full brightness", "Porta {device} alla massima luminosità"),
|
|
135789
135796
|
icon: "sun",
|
|
135790
|
-
args: {
|
|
135797
|
+
args: { level: 100 }
|
|
135791
135798
|
},
|
|
135792
135799
|
{
|
|
135793
135800
|
id: "brightness.half",
|
|
@@ -135795,7 +135802,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135795
135802
|
label: t("Half brightness", "Luminosità a metà"),
|
|
135796
135803
|
phrase: t("Dim {device} to half", "Abbassa {device} a metà luminosità"),
|
|
135797
135804
|
icon: "sun-dim",
|
|
135798
|
-
args: {
|
|
135805
|
+
args: { level: 50 }
|
|
135799
135806
|
},
|
|
135800
135807
|
{
|
|
135801
135808
|
id: "brightness.off",
|
|
@@ -135803,16 +135810,16 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135803
135810
|
label: t("Brightness off", "Luminosità a zero"),
|
|
135804
135811
|
phrase: t("Dim {device} to zero", "Abbassa {device} a zero"),
|
|
135805
135812
|
icon: "lightbulb-off",
|
|
135806
|
-
args: {
|
|
135813
|
+
args: { level: 0 }
|
|
135807
135814
|
},
|
|
135808
135815
|
{
|
|
135809
135816
|
id: "brightness.set",
|
|
135810
135817
|
method: "setBrightness",
|
|
135811
135818
|
label: t("Set brightness", "Imposta la luminosità"),
|
|
135812
|
-
phrase: t("Set the brightness of {device} to {
|
|
135819
|
+
phrase: t("Set the brightness of {device} to {level}", "Imposta la luminosità di {device} a {level}"),
|
|
135813
135820
|
icon: "sun-medium",
|
|
135814
135821
|
openArgs: [{
|
|
135815
|
-
key: "
|
|
135822
|
+
key: "level",
|
|
135816
135823
|
label: PERCENT,
|
|
135817
135824
|
offer: {
|
|
135818
135825
|
kind: "number",
|
|
@@ -135826,13 +135833,13 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135826
135833
|
],
|
|
135827
135834
|
state: [{
|
|
135828
135835
|
kind: "numeric",
|
|
135829
|
-
field: "
|
|
135836
|
+
field: "level",
|
|
135830
135837
|
quantity: t("the brightness", "la luminosità"),
|
|
135831
135838
|
label: t("Brightness", "Luminosità"),
|
|
135832
135839
|
unit: "%",
|
|
135833
135840
|
icon: "sun"
|
|
135834
135841
|
}],
|
|
135835
|
-
events: { onBrightnessChanged: { notOperatorFacing: "the `
|
|
135842
|
+
events: { onBrightnessChanged: { notOperatorFacing: "the `level` state trigger reads the same change" } }
|
|
135836
135843
|
},
|
|
135837
135844
|
color: {
|
|
135838
135845
|
scope: "device",
|
|
@@ -135846,7 +135853,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135846
135853
|
icon: "sun",
|
|
135847
135854
|
args: { color: {
|
|
135848
135855
|
mode: "mired",
|
|
135849
|
-
|
|
135856
|
+
colorTemperature: 370
|
|
135850
135857
|
} }
|
|
135851
135858
|
},
|
|
135852
135859
|
{
|
|
@@ -135857,7 +135864,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135857
135864
|
icon: "snowflake",
|
|
135858
135865
|
args: { color: {
|
|
135859
135866
|
mode: "mired",
|
|
135860
|
-
|
|
135867
|
+
colorTemperature: 200
|
|
135861
135868
|
} }
|
|
135862
135869
|
},
|
|
135863
135870
|
{
|
|
@@ -136471,7 +136478,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
136471
136478
|
label: t("Fan off", "Ventilatore spento"),
|
|
136472
136479
|
phrase: t("Stop {device}", "Ferma {device}"),
|
|
136473
136480
|
icon: "power-off",
|
|
136474
|
-
args: {
|
|
136481
|
+
args: { speed: 0 }
|
|
136475
136482
|
},
|
|
136476
136483
|
{
|
|
136477
136484
|
id: "fan.full",
|
|
@@ -136479,16 +136486,16 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
136479
136486
|
label: t("Fan full", "Ventilatore al massimo"),
|
|
136480
136487
|
phrase: t("Run {device} at full speed", "Porta {device} alla massima velocità"),
|
|
136481
136488
|
icon: "fan",
|
|
136482
|
-
args: {
|
|
136489
|
+
args: { speed: 100 }
|
|
136483
136490
|
},
|
|
136484
136491
|
{
|
|
136485
136492
|
id: "fan.speed",
|
|
136486
136493
|
method: "setPercentage",
|
|
136487
136494
|
label: t("Set speed", "Imposta la velocità"),
|
|
136488
|
-
phrase: t("Set the speed of {device} to {
|
|
136495
|
+
phrase: t("Set the speed of {device} to {speed}", "Imposta la velocità di {device} al {speed}"),
|
|
136489
136496
|
icon: "fan",
|
|
136490
136497
|
openArgs: [{
|
|
136491
|
-
key: "
|
|
136498
|
+
key: "speed",
|
|
136492
136499
|
label: t("Speed", "Velocità"),
|
|
136493
136500
|
offer: {
|
|
136494
136501
|
kind: "number",
|
|
@@ -136550,7 +136557,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
136550
136557
|
],
|
|
136551
136558
|
state: [{
|
|
136552
136559
|
kind: "numeric",
|
|
136553
|
-
field: "
|
|
136560
|
+
field: "speed",
|
|
136554
136561
|
quantity: t("the speed", "la velocità"),
|
|
136555
136562
|
label: t("Speed", "Velocità"),
|
|
136556
136563
|
unit: "%",
|
|
@@ -137348,7 +137355,7 @@ var APPLIANCE_CAP_VOCABULARY = {
|
|
|
137348
137355
|
},
|
|
137349
137356
|
{
|
|
137350
137357
|
kind: "numeric",
|
|
137351
|
-
field: "
|
|
137358
|
+
field: "progress",
|
|
137352
137359
|
quantity: t("the cycle progress", "l’avanzamento del lavaggio"),
|
|
137353
137360
|
label: t("Progress", "Avanzamento"),
|
|
137354
137361
|
unit: "%",
|
|
@@ -137706,10 +137713,10 @@ var APPLIANCE_CAP_VOCABULARY = {
|
|
|
137706
137713
|
id: "media.seek",
|
|
137707
137714
|
method: "seek",
|
|
137708
137715
|
label: t("Seek", "Vai al punto"),
|
|
137709
|
-
phrase: t("Move {device} to {
|
|
137716
|
+
phrase: t("Move {device} to {position}", "Porta {device} al punto {position}"),
|
|
137710
137717
|
icon: "fast-forward",
|
|
137711
137718
|
openArgs: [{
|
|
137712
|
-
key: "
|
|
137719
|
+
key: "position",
|
|
137713
137720
|
label: t("Position", "Posizione"),
|
|
137714
137721
|
offer: {
|
|
137715
137722
|
kind: "number",
|
|
@@ -138758,7 +138765,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
138758
138765
|
state: [
|
|
138759
138766
|
{
|
|
138760
138767
|
kind: "numeric",
|
|
138761
|
-
field: "
|
|
138768
|
+
field: "co2",
|
|
138762
138769
|
quantity: t("the CO₂", "la CO₂"),
|
|
138763
138770
|
label: t("CO₂", "CO₂"),
|
|
138764
138771
|
unit: "ppm",
|
|
@@ -138766,7 +138773,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
138766
138773
|
},
|
|
138767
138774
|
{
|
|
138768
138775
|
kind: "numeric",
|
|
138769
|
-
field: "
|
|
138776
|
+
field: "voc",
|
|
138770
138777
|
quantity: t("the VOC level", "il livello di COV"),
|
|
138771
138778
|
label: t("VOC", "COV"),
|
|
138772
138779
|
unit: "ppb",
|
|
@@ -138802,7 +138809,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
138802
138809
|
noun: t("Light level", "Luminosità ambiente"),
|
|
138803
138810
|
state: [{
|
|
138804
138811
|
kind: "numeric",
|
|
138805
|
-
field: "
|
|
138812
|
+
field: "illuminance",
|
|
138806
138813
|
quantity: t("the light level", "la luminosità"),
|
|
138807
138814
|
label: t("Illuminance", "Illuminamento"),
|
|
138808
138815
|
unit: "lx",
|
|
@@ -139005,7 +139012,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139005
139012
|
noun: t("Humidity", "Umidità"),
|
|
139006
139013
|
state: [{
|
|
139007
139014
|
kind: "numeric",
|
|
139008
|
-
field: "
|
|
139015
|
+
field: "humidity",
|
|
139009
139016
|
quantity: t("the humidity", "l’umidità"),
|
|
139010
139017
|
label: t("Humidity", "Umidità"),
|
|
139011
139018
|
unit: "%",
|
|
@@ -139053,7 +139060,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139053
139060
|
state: [
|
|
139054
139061
|
{
|
|
139055
139062
|
kind: "numeric",
|
|
139056
|
-
field: "
|
|
139063
|
+
field: "power",
|
|
139057
139064
|
quantity: t("the power draw", "il consumo"),
|
|
139058
139065
|
label: t("Power", "Potenza"),
|
|
139059
139066
|
unit: "W",
|
|
@@ -139061,7 +139068,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139061
139068
|
},
|
|
139062
139069
|
{
|
|
139063
139070
|
kind: "numeric",
|
|
139064
|
-
field: "
|
|
139071
|
+
field: "energy",
|
|
139065
139072
|
quantity: t("the energy used", "l’energia consumata"),
|
|
139066
139073
|
label: t("Energy", "Energia"),
|
|
139067
139074
|
unit: "kWh",
|
|
@@ -139069,7 +139076,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139069
139076
|
},
|
|
139070
139077
|
{
|
|
139071
139078
|
kind: "numeric",
|
|
139072
|
-
field: "
|
|
139079
|
+
field: "voltage",
|
|
139073
139080
|
quantity: t("the voltage", "la tensione"),
|
|
139074
139081
|
label: t("Voltage", "Tensione"),
|
|
139075
139082
|
unit: "V",
|
|
@@ -139077,7 +139084,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139077
139084
|
},
|
|
139078
139085
|
{
|
|
139079
139086
|
kind: "numeric",
|
|
139080
|
-
field: "
|
|
139087
|
+
field: "current",
|
|
139081
139088
|
quantity: t("the current", "la corrente"),
|
|
139082
139089
|
label: t("Current", "Corrente"),
|
|
139083
139090
|
unit: "A",
|
|
@@ -139094,13 +139101,6 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139094
139101
|
label: t("Where", "Posizione"),
|
|
139095
139102
|
phrase: t("When {device} is at {value}", "Quando {device} è in {value}"),
|
|
139096
139103
|
icon: "map-pin"
|
|
139097
|
-
}, {
|
|
139098
|
-
kind: "numeric",
|
|
139099
|
-
field: "batteryPercent",
|
|
139100
|
-
quantity: t("the phone battery", "la batteria del telefono"),
|
|
139101
|
-
label: t("Battery", "Batteria"),
|
|
139102
|
-
unit: "%",
|
|
139103
|
-
icon: "battery"
|
|
139104
139104
|
}]
|
|
139105
139105
|
},
|
|
139106
139106
|
"pressure-sensor": {
|
|
@@ -139108,7 +139108,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139108
139108
|
noun: t("Pressure", "Pressione"),
|
|
139109
139109
|
state: [{
|
|
139110
139110
|
kind: "numeric",
|
|
139111
|
-
field: "
|
|
139111
|
+
field: "pressure",
|
|
139112
139112
|
quantity: t("the pressure", "la pressione"),
|
|
139113
139113
|
label: t("Pressure", "Pressione"),
|
|
139114
139114
|
unit: "hPa",
|
|
@@ -139144,7 +139144,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139144
139144
|
noun: t("Temperature", "Temperatura"),
|
|
139145
139145
|
state: [{
|
|
139146
139146
|
kind: "numeric",
|
|
139147
|
-
field: "
|
|
139147
|
+
field: "temperature",
|
|
139148
139148
|
quantity: t("the temperature", "la temperatura"),
|
|
139149
139149
|
label: t("Temperature", "Temperatura"),
|
|
139150
139150
|
unit: "°C",
|
|
@@ -139215,7 +139215,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139215
139215
|
state: [
|
|
139216
139216
|
{
|
|
139217
139217
|
kind: "numeric",
|
|
139218
|
-
field: "
|
|
139218
|
+
field: "level",
|
|
139219
139219
|
quantity: t("the battery level", "il livello della batteria"),
|
|
139220
139220
|
label: t("Battery", "Batteria"),
|
|
139221
139221
|
unit: "%",
|
|
@@ -139257,7 +139257,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139257
139257
|
icon: "battery-charging"
|
|
139258
139258
|
}
|
|
139259
139259
|
],
|
|
139260
|
-
events: { onStatusChanged: { notOperatorFacing: "the
|
|
139260
|
+
events: { onStatusChanged: { notOperatorFacing: "the level / sleeping / charging state triggers each read one field of this change" } },
|
|
139261
139261
|
extraEvents: [{
|
|
139262
139262
|
category: EventCategory.DeviceAwake,
|
|
139263
139263
|
label: t("Woke up", "Risvegliato"),
|
|
@@ -139275,7 +139275,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139275
139275
|
noun: t("Network link", "Collegamento di rete"),
|
|
139276
139276
|
state: [{
|
|
139277
139277
|
kind: "numeric",
|
|
139278
|
-
field: "
|
|
139278
|
+
field: "signal",
|
|
139279
139279
|
quantity: t("the signal strength", "l’intensità del segnale"),
|
|
139280
139280
|
label: t("Signal", "Segnale"),
|
|
139281
139281
|
unit: "%",
|
|
@@ -146254,7 +146254,7 @@ function clampLevel(level) {
|
|
|
146254
146254
|
function cameraBatterySlice(facts) {
|
|
146255
146255
|
const charging = facts.charging === null ? "unknown" : facts.charging === CHARGING_STATUS_CHARGING ? "dc" : "none";
|
|
146256
146256
|
return {
|
|
146257
|
-
|
|
146257
|
+
level: clampLevel(facts.level),
|
|
146258
146258
|
charging,
|
|
146259
146259
|
sleeping: !facts.streamOpen,
|
|
146260
146260
|
lastUpdated: facts.now,
|
|
@@ -146663,7 +146663,7 @@ function networkLinkFromBars(bars, now) {
|
|
|
146663
146663
|
if (bars === null || !Number.isFinite(bars)) return null;
|
|
146664
146664
|
return {
|
|
146665
146665
|
type: "wifi",
|
|
146666
|
-
|
|
146666
|
+
signal: bars === 0 ? null : signalPercentFromBars(bars, 4),
|
|
146667
146667
|
lastUpdated: now
|
|
146668
146668
|
};
|
|
146669
146669
|
}
|
|
@@ -193866,7 +193866,7 @@ var SHADOW_POLL_MS = 12e4;
|
|
|
193866
193866
|
var COLD_START = {
|
|
193867
193867
|
activity: "idle",
|
|
193868
193868
|
batteryLevel: null,
|
|
193869
|
-
|
|
193869
|
+
progress: null,
|
|
193870
193870
|
currentCode: null,
|
|
193871
193871
|
currentCodeLabel: null,
|
|
193872
193872
|
severity: "info",
|
|
@@ -193980,11 +193980,11 @@ var DreameMowerDevice = class extends DreameChildDevice {
|
|
|
193980
193980
|
const status = mower.status;
|
|
193981
193981
|
const code = mower.faultRaw;
|
|
193982
193982
|
const livePct = clampPercent(mower.mowingProgressPct);
|
|
193983
|
-
const prevPct = this.runtimeState.getCapState(CAP_NAME$9)?.
|
|
193983
|
+
const prevPct = this.runtimeState.getCapState(CAP_NAME$9)?.progress;
|
|
193984
193984
|
const slice = {
|
|
193985
193985
|
activity: mapMowerStatusToActivity(status),
|
|
193986
193986
|
batteryLevel: clampBatteryLevel(mower.battery),
|
|
193987
|
-
|
|
193987
|
+
progress: livePct ?? prevPct ?? null,
|
|
193988
193988
|
currentCode: code,
|
|
193989
193989
|
currentCodeLabel: code !== null ? MowerFault[code] ?? null : null,
|
|
193990
193990
|
severity: mower.faultSeverity,
|
|
@@ -194924,7 +194924,7 @@ var CONTROL_COLD_START = {
|
|
|
194924
194924
|
batteryLevel: null,
|
|
194925
194925
|
fanSpeed: null,
|
|
194926
194926
|
availableFanSpeeds: [],
|
|
194927
|
-
|
|
194927
|
+
progress: null,
|
|
194928
194928
|
errorCode: null,
|
|
194929
194929
|
errorLabel: null,
|
|
194930
194930
|
lastChangedAt: 0
|
|
@@ -195078,7 +195078,7 @@ var DreameVacuumDevice = class extends DreameChildDevice {
|
|
|
195078
195078
|
batteryLevel: clampBatteryLevel$1(vacuum.battery),
|
|
195079
195079
|
fanSpeed: suctionLevelToken(vacuum.suction),
|
|
195080
195080
|
availableFanSpeeds: supportedFanSpeedTokens(vacuum.supportedSuctionLevels),
|
|
195081
|
-
|
|
195081
|
+
progress: clampPercent$1(vacuum.taskProgressPct),
|
|
195082
195082
|
errorCode: vacuum.errorCode,
|
|
195083
195083
|
errorLabel: vacuumErrorLabel(vacuum.errorCode),
|
|
195084
195084
|
lastChangedAt: Date.now()
|