@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.js
CHANGED
|
@@ -52902,7 +52902,7 @@ var DreameCameraStream = class extends TypedEmitter {
|
|
|
52902
52902
|
}
|
|
52903
52903
|
};
|
|
52904
52904
|
//#endregion
|
|
52905
|
-
//#region ../types/dist/event-category-
|
|
52905
|
+
//#region ../types/dist/event-category-DmZDPDf_.mjs
|
|
52906
52906
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
52907
52907
|
EventCategory["SystemBoot"] = "system.boot";
|
|
52908
52908
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -53529,7 +53529,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
53529
53529
|
* (a track was promoted to a stationary-registry entry) or departs (the
|
|
53530
53530
|
* object moved / was removed). Telemetry (D8): lossy, drives a UI refresh of
|
|
53531
53531
|
* the dedicated "Stationary" section — never the live event feed. Payload:
|
|
53532
|
-
* `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp }`.
|
|
53532
|
+
* `{ deviceId, entryId, className, phase:'appeared'|'departed', timestamp, observedAt, zones }`.
|
|
53533
53533
|
*/
|
|
53534
53534
|
EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
|
|
53535
53535
|
/**
|
|
@@ -58350,7 +58350,7 @@ var ZodIssueCode = {
|
|
|
58350
58350
|
var ZodFirstPartyTypeKind;
|
|
58351
58351
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
58352
58352
|
//#endregion
|
|
58353
|
-
//#region ../types/dist/sleep-
|
|
58353
|
+
//#region ../types/dist/sleep-Crlmu_tO.mjs
|
|
58354
58354
|
/**
|
|
58355
58355
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
58356
58356
|
* window to float samples (D455).
|
|
@@ -61660,11 +61660,11 @@ var CAP_NAMES = Object.freeze([
|
|
|
61660
61660
|
Object.freeze({
|
|
61661
61661
|
"air-quality-sensor": [
|
|
61662
61662
|
{
|
|
61663
|
-
"path": "
|
|
61663
|
+
"path": "co2",
|
|
61664
61664
|
"valueType": "number"
|
|
61665
61665
|
},
|
|
61666
61666
|
{
|
|
61667
|
-
"path": "
|
|
61667
|
+
"path": "voc",
|
|
61668
61668
|
"valueType": "number"
|
|
61669
61669
|
},
|
|
61670
61670
|
{
|
|
@@ -61714,7 +61714,7 @@ Object.freeze({
|
|
|
61714
61714
|
}
|
|
61715
61715
|
],
|
|
61716
61716
|
"ambient-light-sensor": [{
|
|
61717
|
-
"path": "
|
|
61717
|
+
"path": "illuminance",
|
|
61718
61718
|
"valueType": "number"
|
|
61719
61719
|
}],
|
|
61720
61720
|
"audio-metrics": [
|
|
@@ -61775,7 +61775,7 @@ Object.freeze({
|
|
|
61775
61775
|
],
|
|
61776
61776
|
"battery": [
|
|
61777
61777
|
{
|
|
61778
|
-
"path": "
|
|
61778
|
+
"path": "level",
|
|
61779
61779
|
"valueType": "number"
|
|
61780
61780
|
},
|
|
61781
61781
|
{
|
|
@@ -61797,7 +61797,7 @@ Object.freeze({
|
|
|
61797
61797
|
"valueType": "number"
|
|
61798
61798
|
},
|
|
61799
61799
|
{
|
|
61800
|
-
"path": "
|
|
61800
|
+
"path": "voltage",
|
|
61801
61801
|
"valueType": "number"
|
|
61802
61802
|
},
|
|
61803
61803
|
{
|
|
@@ -61818,7 +61818,7 @@ Object.freeze({
|
|
|
61818
61818
|
"valueType": "boolean"
|
|
61819
61819
|
}],
|
|
61820
61820
|
"brightness": [{
|
|
61821
|
-
"path": "
|
|
61821
|
+
"path": "level",
|
|
61822
61822
|
"valueType": "number"
|
|
61823
61823
|
}],
|
|
61824
61824
|
"broker": [{
|
|
@@ -62019,7 +62019,7 @@ Object.freeze({
|
|
|
62019
62019
|
"valueType": "number"
|
|
62020
62020
|
},
|
|
62021
62021
|
{
|
|
62022
|
-
"path": "
|
|
62022
|
+
"path": "colorTemperature",
|
|
62023
62023
|
"valueType": "number"
|
|
62024
62024
|
}
|
|
62025
62025
|
],
|
|
@@ -62198,15 +62198,15 @@ Object.freeze({
|
|
|
62198
62198
|
"valueType": "string"
|
|
62199
62199
|
},
|
|
62200
62200
|
{
|
|
62201
|
-
"path": "
|
|
62201
|
+
"path": "remaining",
|
|
62202
62202
|
"valueType": "number"
|
|
62203
62203
|
},
|
|
62204
62204
|
{
|
|
62205
|
-
"path": "
|
|
62205
|
+
"path": "delayedStart",
|
|
62206
62206
|
"valueType": "number"
|
|
62207
62207
|
},
|
|
62208
62208
|
{
|
|
62209
|
-
"path": "
|
|
62209
|
+
"path": "progress",
|
|
62210
62210
|
"valueType": "number"
|
|
62211
62211
|
},
|
|
62212
62212
|
{
|
|
@@ -62320,7 +62320,7 @@ Object.freeze({
|
|
|
62320
62320
|
],
|
|
62321
62321
|
"fan-control": [
|
|
62322
62322
|
{
|
|
62323
|
-
"path": "
|
|
62323
|
+
"path": "speed",
|
|
62324
62324
|
"valueType": "number"
|
|
62325
62325
|
},
|
|
62326
62326
|
{
|
|
@@ -62420,7 +62420,7 @@ Object.freeze({
|
|
|
62420
62420
|
}
|
|
62421
62421
|
],
|
|
62422
62422
|
"humidity-sensor": [{
|
|
62423
|
-
"path": "
|
|
62423
|
+
"path": "humidity",
|
|
62424
62424
|
"valueType": "number"
|
|
62425
62425
|
}],
|
|
62426
62426
|
"image": [{
|
|
@@ -62530,7 +62530,7 @@ Object.freeze({
|
|
|
62530
62530
|
"valueType": "number"
|
|
62531
62531
|
},
|
|
62532
62532
|
{
|
|
62533
|
-
"path": "
|
|
62533
|
+
"path": "progress",
|
|
62534
62534
|
"valueType": "number"
|
|
62535
62535
|
},
|
|
62536
62536
|
{
|
|
@@ -62609,11 +62609,11 @@ Object.freeze({
|
|
|
62609
62609
|
"valueType": "string"
|
|
62610
62610
|
},
|
|
62611
62611
|
{
|
|
62612
|
-
"path": "
|
|
62612
|
+
"path": "position",
|
|
62613
62613
|
"valueType": "number"
|
|
62614
62614
|
},
|
|
62615
62615
|
{
|
|
62616
|
-
"path": "
|
|
62616
|
+
"path": "duration",
|
|
62617
62617
|
"valueType": "number"
|
|
62618
62618
|
},
|
|
62619
62619
|
{
|
|
@@ -62715,11 +62715,11 @@ Object.freeze({
|
|
|
62715
62715
|
]
|
|
62716
62716
|
},
|
|
62717
62717
|
{
|
|
62718
|
-
"path": "
|
|
62718
|
+
"path": "signal",
|
|
62719
62719
|
"valueType": "number"
|
|
62720
62720
|
},
|
|
62721
62721
|
{
|
|
62722
|
-
"path": "
|
|
62722
|
+
"path": "rssi",
|
|
62723
62723
|
"valueType": "number"
|
|
62724
62724
|
},
|
|
62725
62725
|
{
|
|
@@ -62850,23 +62850,23 @@ Object.freeze({
|
|
|
62850
62850
|
],
|
|
62851
62851
|
"power-meter": [
|
|
62852
62852
|
{
|
|
62853
|
-
"path": "
|
|
62853
|
+
"path": "power",
|
|
62854
62854
|
"valueType": "number"
|
|
62855
62855
|
},
|
|
62856
62856
|
{
|
|
62857
|
-
"path": "
|
|
62857
|
+
"path": "energy",
|
|
62858
62858
|
"valueType": "number"
|
|
62859
62859
|
},
|
|
62860
62860
|
{
|
|
62861
|
-
"path": "
|
|
62861
|
+
"path": "voltage",
|
|
62862
62862
|
"valueType": "number"
|
|
62863
62863
|
},
|
|
62864
62864
|
{
|
|
62865
|
-
"path": "
|
|
62865
|
+
"path": "current",
|
|
62866
62866
|
"valueType": "number"
|
|
62867
62867
|
},
|
|
62868
62868
|
{
|
|
62869
|
-
"path": "
|
|
62869
|
+
"path": "apparentPower",
|
|
62870
62870
|
"valueType": "number"
|
|
62871
62871
|
},
|
|
62872
62872
|
{
|
|
@@ -62894,14 +62894,10 @@ Object.freeze({
|
|
|
62894
62894
|
{
|
|
62895
62895
|
"path": "gps.accuracyMeters",
|
|
62896
62896
|
"valueType": "number"
|
|
62897
|
-
},
|
|
62898
|
-
{
|
|
62899
|
-
"path": "batteryPercent",
|
|
62900
|
-
"valueType": "number"
|
|
62901
62897
|
}
|
|
62902
62898
|
],
|
|
62903
62899
|
"pressure-sensor": [{
|
|
62904
|
-
"path": "
|
|
62900
|
+
"path": "pressure",
|
|
62905
62901
|
"valueType": "number"
|
|
62906
62902
|
}],
|
|
62907
62903
|
"privacy-mask": [{
|
|
@@ -63215,7 +63211,7 @@ Object.freeze({
|
|
|
63215
63211
|
"valueType": "boolean"
|
|
63216
63212
|
}],
|
|
63217
63213
|
"temperature-sensor": [{
|
|
63218
|
-
"path": "
|
|
63214
|
+
"path": "temperature",
|
|
63219
63215
|
"valueType": "number"
|
|
63220
63216
|
}],
|
|
63221
63217
|
"update": [
|
|
@@ -63263,7 +63259,7 @@ Object.freeze({
|
|
|
63263
63259
|
"valueType": "string"
|
|
63264
63260
|
},
|
|
63265
63261
|
{
|
|
63266
|
-
"path": "
|
|
63262
|
+
"path": "progress",
|
|
63267
63263
|
"valueType": "number"
|
|
63268
63264
|
},
|
|
63269
63265
|
{
|
|
@@ -63762,7 +63758,7 @@ function errMsg(err) {
|
|
|
63762
63758
|
return String(err);
|
|
63763
63759
|
}
|
|
63764
63760
|
//#endregion
|
|
63765
|
-
//#region ../types/dist/composition-
|
|
63761
|
+
//#region ../types/dist/composition-CZImLpOI.mjs
|
|
63766
63762
|
/**
|
|
63767
63763
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
63768
63764
|
*
|
|
@@ -68526,6 +68522,14 @@ var AutomationConditionLeafSchema = object({
|
|
|
68526
68522
|
array(union([string(), number()]))
|
|
68527
68523
|
])
|
|
68528
68524
|
});
|
|
68525
|
+
var AutomationConditionStationaryPresentSchema = object({
|
|
68526
|
+
kind: literal("stationary-present"),
|
|
68527
|
+
deviceId: number().int().nonnegative(),
|
|
68528
|
+
/** Class names; a macro class matches every raw class that maps to it. */
|
|
68529
|
+
classes: array(string().min(1)).min(1).optional(),
|
|
68530
|
+
/** The parked object must be in at least one of these zones. */
|
|
68531
|
+
zones: array(string().min(1)).min(1).optional()
|
|
68532
|
+
});
|
|
68529
68533
|
/**
|
|
68530
68534
|
* The expression leaf, declared as a plain object rather than an intersection
|
|
68531
68535
|
* with {@link ExpressionSourceSchema}: a discriminated union has to be able to
|
|
@@ -68559,7 +68563,8 @@ var AutomationConditionSchema = lazy(() => discriminatedUnion("kind", [
|
|
|
68559
68563
|
child: AutomationConditionSchema
|
|
68560
68564
|
}),
|
|
68561
68565
|
AutomationConditionLeafSchema,
|
|
68562
|
-
AutomationConditionExpressionSchema
|
|
68566
|
+
AutomationConditionExpressionSchema,
|
|
68567
|
+
AutomationConditionStationaryPresentSchema
|
|
68563
68568
|
]));
|
|
68564
68569
|
/**
|
|
68565
68570
|
* What starts a run.
|
|
@@ -68613,6 +68618,17 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
|
|
|
68613
68618
|
/** Best-so-far confidence the track must reach. */
|
|
68614
68619
|
minScore: number().min(0).max(1).optional()
|
|
68615
68620
|
}),
|
|
68621
|
+
object({
|
|
68622
|
+
kind: literal("stationary"),
|
|
68623
|
+
deviceIds: array(number().int().nonnegative()).min(1),
|
|
68624
|
+
/** Class names; a macro class matches like the detection trigger. */
|
|
68625
|
+
classes: array(string().min(1)).min(1).optional(),
|
|
68626
|
+
/** The parked object must be in at least one of these zones. */
|
|
68627
|
+
zones: array(string().min(1)).min(1).optional(),
|
|
68628
|
+
/** `appeared`: it became parked. `departed`: the registry retired it.
|
|
68629
|
+
* The vocabulary of `PipelineAnalyticsStationaryChanged`. */
|
|
68630
|
+
phase: _enum(["appeared", "departed"])
|
|
68631
|
+
}),
|
|
68616
68632
|
object({
|
|
68617
68633
|
kind: literal("interval"),
|
|
68618
68634
|
minutes: number().int().min(1).max(1440)
|
|
@@ -68822,7 +68838,8 @@ var AutomationConditionTraceNodeSchema = object({
|
|
|
68822
68838
|
"any",
|
|
68823
68839
|
"not",
|
|
68824
68840
|
"condition",
|
|
68825
|
-
"expression"
|
|
68841
|
+
"expression",
|
|
68842
|
+
"stationary-present"
|
|
68826
68843
|
]),
|
|
68827
68844
|
outcome: TraceNodeOutcomeSchema,
|
|
68828
68845
|
reason: string(),
|
|
@@ -71721,7 +71738,7 @@ var CompositionEventPlanSchema = object({
|
|
|
71721
71738
|
stateField: string(),
|
|
71722
71739
|
fieldKey: string()
|
|
71723
71740
|
});
|
|
71724
|
-
/** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.
|
|
71741
|
+
/** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.temperature`. */
|
|
71725
71742
|
var CompositionProblemSchema = object({
|
|
71726
71743
|
code: _enum([
|
|
71727
71744
|
"reserved-variant",
|
|
@@ -72040,7 +72057,7 @@ var GROUP_TEMPLATES = [
|
|
|
72040
72057
|
summary: "Mean, median, min, max or sum of temperatures. Offline and unknown members are left out, never read as 0 °C.",
|
|
72041
72058
|
role: DeviceRole.TemperatureSensor,
|
|
72042
72059
|
outputCap: "temperature-sensor",
|
|
72043
|
-
outputField: "
|
|
72060
|
+
outputField: "temperature",
|
|
72044
72061
|
quantity: "temperature",
|
|
72045
72062
|
defaultAggregate: "mean",
|
|
72046
72063
|
empty: "null",
|
|
@@ -72051,7 +72068,7 @@ var GROUP_TEMPLATES = [
|
|
|
72051
72068
|
summary: "Humidity in percent. Offline and unknown members are left out, never read as 0 %.",
|
|
72052
72069
|
role: DeviceRole.HumiditySensor,
|
|
72053
72070
|
outputCap: "humidity-sensor",
|
|
72054
|
-
outputField: "
|
|
72071
|
+
outputField: "humidity",
|
|
72055
72072
|
quantity: "humidity",
|
|
72056
72073
|
defaultAggregate: "mean",
|
|
72057
72074
|
empty: "null",
|
|
@@ -72062,7 +72079,7 @@ var GROUP_TEMPLATES = [
|
|
|
72062
72079
|
summary: "Pressure in hectopascals. Offline and unknown members are left out, never read as 0 hPa.",
|
|
72063
72080
|
role: DeviceRole.PressureSensor,
|
|
72064
72081
|
outputCap: "pressure-sensor",
|
|
72065
|
-
outputField: "
|
|
72082
|
+
outputField: "pressure",
|
|
72066
72083
|
quantity: "pressure",
|
|
72067
72084
|
defaultAggregate: "mean",
|
|
72068
72085
|
empty: "null",
|
|
@@ -72073,7 +72090,7 @@ var GROUP_TEMPLATES = [
|
|
|
72073
72090
|
summary: "Illuminance in lux. Offline and unknown members are left out, never read as 0 lx.",
|
|
72074
72091
|
role: DeviceRole.AmbientLightSensor,
|
|
72075
72092
|
outputCap: "ambient-light-sensor",
|
|
72076
|
-
outputField: "
|
|
72093
|
+
outputField: "illuminance",
|
|
72077
72094
|
quantity: "illuminance",
|
|
72078
72095
|
defaultAggregate: "mean",
|
|
72079
72096
|
empty: "null",
|
|
@@ -72084,7 +72101,7 @@ var GROUP_TEMPLATES = [
|
|
|
72084
72101
|
summary: "Power in watts, summed by default. Nobody reporting omits the key rather than writing 0 W.",
|
|
72085
72102
|
role: DeviceRole.PowerSensor,
|
|
72086
72103
|
outputCap: "power-meter",
|
|
72087
|
-
outputField: "
|
|
72104
|
+
outputField: "power",
|
|
72088
72105
|
quantity: "power",
|
|
72089
72106
|
defaultAggregate: "sum",
|
|
72090
72107
|
empty: "omit",
|
|
@@ -72095,7 +72112,7 @@ var GROUP_TEMPLATES = [
|
|
|
72095
72112
|
summary: "Energy in kilowatt-hours, summed by default. Nobody reporting omits the key rather than writing 0 kWh.",
|
|
72096
72113
|
role: DeviceRole.EnergySensor,
|
|
72097
72114
|
outputCap: "power-meter",
|
|
72098
|
-
outputField: "
|
|
72115
|
+
outputField: "energy",
|
|
72099
72116
|
quantity: "energy",
|
|
72100
72117
|
defaultAggregate: "sum",
|
|
72101
72118
|
empty: "omit",
|
|
@@ -72106,7 +72123,7 @@ var GROUP_TEMPLATES = [
|
|
|
72106
72123
|
summary: "Battery charge in percent. Offline and unknown members are left out, never read as 0 %.",
|
|
72107
72124
|
role: DeviceRole.BatterySensor,
|
|
72108
72125
|
outputCap: "battery",
|
|
72109
|
-
outputField: "
|
|
72126
|
+
outputField: "level",
|
|
72110
72127
|
quantity: "percentage",
|
|
72111
72128
|
defaultAggregate: "mean",
|
|
72112
72129
|
empty: "null",
|
|
@@ -110649,9 +110666,9 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
|
|
|
110649
110666
|
*/
|
|
110650
110667
|
var AirQualitySensorStatusSchema = object({
|
|
110651
110668
|
/** Carbon dioxide concentration in ppm. */
|
|
110652
|
-
|
|
110669
|
+
co2: number().min(0).optional().meta(readingMeta("concentration-volume")),
|
|
110653
110670
|
/** Total volatile organic compounds in ppb. */
|
|
110654
|
-
|
|
110671
|
+
voc: number().min(0).optional().meta(readingMeta("concentration-ppb")),
|
|
110655
110672
|
/** Particulate matter ≤ 2.5 μm in µg/m³. */
|
|
110656
110673
|
pm25: number().min(0).optional().meta(readingMeta("concentration-mass")),
|
|
110657
110674
|
/** Particulate matter ≤ 10 μm in µg/m³. */
|
|
@@ -110684,12 +110701,12 @@ var airQualitySensorCapability = {
|
|
|
110684
110701
|
* History (D850): recorded series.
|
|
110685
110702
|
*/
|
|
110686
110703
|
history: { fields: {
|
|
110687
|
-
|
|
110704
|
+
co2: {
|
|
110688
110705
|
kind: "gauge",
|
|
110689
110706
|
unit: "ppm",
|
|
110690
110707
|
deadband: 5
|
|
110691
110708
|
},
|
|
110692
|
-
|
|
110709
|
+
voc: {
|
|
110693
110710
|
kind: "gauge",
|
|
110694
110711
|
unit: "ppb",
|
|
110695
110712
|
deadband: 5
|
|
@@ -110720,7 +110737,7 @@ var airQualitySensorCapability = {
|
|
|
110720
110737
|
*/
|
|
110721
110738
|
var AmbientLightSensorStatusSchema = object({
|
|
110722
110739
|
/** Current illuminance in lux (lx). `null` when the sample was refused (D393). */
|
|
110723
|
-
|
|
110740
|
+
illuminance: number().min(0).nullable().meta(readingMeta("illuminance", {
|
|
110724
110741
|
precision: 0,
|
|
110725
110742
|
label: "Illuminance"
|
|
110726
110743
|
})),
|
|
@@ -110749,7 +110766,7 @@ var ambientLightSensorCapability = {
|
|
|
110749
110766
|
/**
|
|
110750
110767
|
* History (D850): recorded series. Wide range, so a RELATIVE deadband (10 %).
|
|
110751
110768
|
*/
|
|
110752
|
-
history: { fields: {
|
|
110769
|
+
history: { fields: { illuminance: {
|
|
110753
110770
|
kind: "gauge",
|
|
110754
110771
|
unit: "lx",
|
|
110755
110772
|
deadbandPct: 10,
|
|
@@ -111062,7 +111079,7 @@ var BatteryStatusSchema = object({
|
|
|
111062
111079
|
* Consumers must SKIP a null rather than coerce it — `battery-band` already
|
|
111063
111080
|
* declines to band a non-finite reading, which is the correct shape.
|
|
111064
111081
|
*/
|
|
111065
|
-
|
|
111082
|
+
level: number().min(0).max(100).nullable().meta(readingMeta("percentage", { label: "Charge" })),
|
|
111066
111083
|
/**
|
|
111067
111084
|
* Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
|
|
111068
111085
|
* Reolink-specific for the Solar Panel 2 accessory (will become
|
|
@@ -111072,7 +111089,7 @@ var BatteryStatusSchema = object({
|
|
|
111072
111089
|
* `'unknown'` is the absence of an answer: the provider has not read the
|
|
111073
111090
|
* power fields yet, or the firmware reported neither. Before it existed,
|
|
111074
111091
|
* two unreadable fields produced `'none'`, and a camera nobody had reached
|
|
111075
|
-
* was drawn "on battery alone" — the same D315 defect `
|
|
111092
|
+
* was drawn "on battery alone" — the same D315 defect `level` closed
|
|
111076
111093
|
* by going nullable. Consumers SKIP it (no charger state published, no
|
|
111077
111094
|
* glyph, no HomeKit ChargingState) rather than coerce it either way.
|
|
111078
111095
|
*/
|
|
@@ -111096,7 +111113,7 @@ var BatteryStatusSchema = object({
|
|
|
111096
111113
|
* that only report charge. A second reading on this cap, not a second
|
|
111097
111114
|
* `numeric-sensor` on the same device.
|
|
111098
111115
|
*/
|
|
111099
|
-
|
|
111116
|
+
voltage: number().nullable().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
111100
111117
|
/**
|
|
111101
111118
|
* Ms epoch of the last time the device PROVED it was reachable — a
|
|
111102
111119
|
* completed firmware round-trip, an observed wake, or an inbound push
|
|
@@ -111130,7 +111147,7 @@ var BatteryStatusSchema = object({
|
|
|
111130
111147
|
/**
|
|
111131
111148
|
* True when the source is a BINARY low-battery indicator (HA
|
|
111132
111149
|
* `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
|
|
111133
|
-
* charge level — `
|
|
111150
|
+
* charge level — `level` is then a coarse stand-in (100 = normal,
|
|
111134
111151
|
* sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
|
|
111135
111152
|
* misleading exact percentage. Absent/false → genuine 0–100 % reading.
|
|
111136
111153
|
*/
|
|
@@ -111150,15 +111167,15 @@ var BATTERY_DEVICE_TYPES = [
|
|
|
111150
111167
|
var batteryCustomize = {
|
|
111151
111168
|
version: 1,
|
|
111152
111169
|
targets: [{
|
|
111153
|
-
id: "
|
|
111170
|
+
id: "level",
|
|
111154
111171
|
cardinality: "scalar",
|
|
111155
111172
|
vocabulary: {
|
|
111156
111173
|
cap: "battery",
|
|
111157
|
-
stateField: "
|
|
111174
|
+
stateField: "level"
|
|
111158
111175
|
},
|
|
111159
111176
|
deviceTypes: BATTERY_DEVICE_TYPES,
|
|
111160
111177
|
apply: "add",
|
|
111161
|
-
path: "
|
|
111178
|
+
path: "level",
|
|
111162
111179
|
sources: [{
|
|
111163
111180
|
kind: "field",
|
|
111164
111181
|
valueKinds: ["number", "string"],
|
|
@@ -111252,7 +111269,7 @@ onStatusChanged: { data: object({
|
|
|
111252
111269
|
schema: BatteryStatusSchema,
|
|
111253
111270
|
kind: "push",
|
|
111254
111271
|
empty: {
|
|
111255
|
-
|
|
111272
|
+
level: null,
|
|
111256
111273
|
charging: "unknown",
|
|
111257
111274
|
sleeping: false,
|
|
111258
111275
|
lastUpdated: 0
|
|
@@ -111279,11 +111296,11 @@ onStatusChanged: { data: object({
|
|
|
111279
111296
|
* History (D850): recorded series. The generic capture replaces the `battery` series of `pipeline-analytics:stats-5m`.
|
|
111280
111297
|
*/
|
|
111281
111298
|
history: { fields: {
|
|
111282
|
-
|
|
111299
|
+
level: {
|
|
111283
111300
|
kind: "gauge",
|
|
111284
111301
|
unit: "%"
|
|
111285
111302
|
},
|
|
111286
|
-
|
|
111303
|
+
voltage: {
|
|
111287
111304
|
kind: "gauge",
|
|
111288
111305
|
unit: "V"
|
|
111289
111306
|
}
|
|
@@ -111343,14 +111360,14 @@ var binaryCapability = {
|
|
|
111343
111360
|
* controls to this single-method surface.
|
|
111344
111361
|
*
|
|
111345
111362
|
* The cap is intentionally minimal: a single `setBrightness({deviceId,
|
|
111346
|
-
*
|
|
111363
|
+
* level})` mutation plus the auto-injected `getStatus`. Drivers
|
|
111347
111364
|
* that expose richer controls (color temperature, scenes, schedules)
|
|
111348
111365
|
* should surface those via the device's `getSettingsUISchema()`
|
|
111349
111366
|
* instead of bloating this cap.
|
|
111350
111367
|
*/
|
|
111351
111368
|
var BrightnessStatusSchema = object({
|
|
111352
111369
|
/** Current level as 0..100 inclusive. Firmware-reported. */
|
|
111353
|
-
|
|
111370
|
+
level: number().min(0).max(100).meta(readingMeta("percentage")),
|
|
111354
111371
|
/** Ms epoch of the last operator-driven change. Useful for UI freshness. */
|
|
111355
111372
|
lastChangedAt: number()
|
|
111356
111373
|
});
|
|
@@ -111362,7 +111379,7 @@ var brightnessCapability = {
|
|
|
111362
111379
|
deviceTypes: [DeviceType.Light],
|
|
111363
111380
|
methods: { setBrightness: method(object({
|
|
111364
111381
|
deviceId: number().int().nonnegative(),
|
|
111365
|
-
|
|
111382
|
+
level: number().min(0).max(100)
|
|
111366
111383
|
}), _void(), {
|
|
111367
111384
|
kind: "mutation",
|
|
111368
111385
|
auth: "protected"
|
|
@@ -111375,7 +111392,7 @@ var brightnessCapability = {
|
|
|
111375
111392
|
*/
|
|
111376
111393
|
onBrightnessChanged: { data: object({
|
|
111377
111394
|
deviceId: number(),
|
|
111378
|
-
|
|
111395
|
+
level: number().min(0).max(100),
|
|
111379
111396
|
lastChangedAt: number()
|
|
111380
111397
|
}) } },
|
|
111381
111398
|
status: {
|
|
@@ -111398,7 +111415,7 @@ onBrightnessChanged: { data: object({
|
|
|
111398
111415
|
/**
|
|
111399
111416
|
* History (D850): recorded series. Actuator tier: level keeps every change.
|
|
111400
111417
|
*/
|
|
111401
|
-
history: { fields: {
|
|
111418
|
+
history: { fields: { level: {
|
|
111402
111419
|
kind: "gauge",
|
|
111403
111420
|
unit: "%",
|
|
111404
111421
|
minIntervalMs: 0
|
|
@@ -112012,11 +112029,11 @@ var ColorInputSchema = discriminatedUnion("mode", [
|
|
|
112012
112029
|
}),
|
|
112013
112030
|
object({
|
|
112014
112031
|
mode: literal("mired"),
|
|
112015
|
-
|
|
112032
|
+
colorTemperature: number().int().min(50).max(1e3)
|
|
112016
112033
|
})
|
|
112017
112034
|
]);
|
|
112018
112035
|
var ColorStatusSchema = object({
|
|
112019
|
-
/** Active color mode — which of `rgb` / `hsv` / `
|
|
112036
|
+
/** Active color mode — which of `rgb` / `hsv` / `colorTemperature` reflects
|
|
112020
112037
|
* the bulb's current state. */
|
|
112021
112038
|
mode: _enum([
|
|
112022
112039
|
"rgb",
|
|
@@ -112028,7 +112045,7 @@ var ColorStatusSchema = object({
|
|
|
112028
112045
|
/** Populated when `mode === 'hsv'`. */
|
|
112029
112046
|
hsv: HsvTripletSchema.optional(),
|
|
112030
112047
|
/** Populated when `mode === 'mired'`. */
|
|
112031
|
-
|
|
112048
|
+
colorTemperature: number().int().optional().meta(readingMeta("colour-temperature")),
|
|
112032
112049
|
/** Ms epoch of the last operator-driven change. */
|
|
112033
112050
|
lastChangedAt: number()
|
|
112034
112051
|
});
|
|
@@ -112060,7 +112077,7 @@ onColorChanged: { data: object({
|
|
|
112060
112077
|
]),
|
|
112061
112078
|
rgb: RgbTripletSchema.optional(),
|
|
112062
112079
|
hsv: HsvTripletSchema.optional(),
|
|
112063
|
-
|
|
112080
|
+
colorTemperature: number().int().optional(),
|
|
112064
112081
|
lastChangedAt: number()
|
|
112065
112082
|
}) } },
|
|
112066
112083
|
status: {
|
|
@@ -112949,11 +112966,11 @@ var DishwasherStatusSchema = object({
|
|
|
112949
112966
|
/** Feature keys of the programs the appliance currently offers — drives the UI selector. */
|
|
112950
112967
|
availablePrograms: array(string()),
|
|
112951
112968
|
/** Seconds remaining on the active cycle, or null when not running / not known. */
|
|
112952
|
-
|
|
112969
|
+
remaining: number().int().nonnegative().nullable().meta(readingMeta("duration")),
|
|
112953
112970
|
/** Seconds the delayed start is set to (time until the cycle starts), or null. */
|
|
112954
|
-
|
|
112971
|
+
delayedStart: number().int().nonnegative().nullable().meta(readingMeta("duration")),
|
|
112955
112972
|
/** Cycle completion 0..100, or null when not applicable. */
|
|
112956
|
-
|
|
112973
|
+
progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
112957
112974
|
/** True when the door is reported open; null when the door state is not known. */
|
|
112958
112975
|
doorOpen: boolean().nullable(),
|
|
112959
112976
|
/** True when the door is latched (locked) during a cycle; null when not reported. */
|
|
@@ -113172,14 +113189,14 @@ var dishwasherCapability = {
|
|
|
113172
113189
|
runtimeState: DishwasherStatusSchema,
|
|
113173
113190
|
durability: "session",
|
|
113174
113191
|
history: { fields: {
|
|
113175
|
-
|
|
113192
|
+
progress: {
|
|
113176
113193
|
kind: "gauge",
|
|
113177
113194
|
unit: "%",
|
|
113178
113195
|
deadband: 2
|
|
113179
113196
|
},
|
|
113180
113197
|
state: { kind: "enum" },
|
|
113181
113198
|
operationState: { kind: "enum" },
|
|
113182
|
-
|
|
113199
|
+
remaining: {
|
|
113183
113200
|
kind: "gauge",
|
|
113184
113201
|
unit: "s",
|
|
113185
113202
|
minIntervalMs: 6e4
|
|
@@ -113770,7 +113787,7 @@ var FanDirectionSchema = _enum(["forward", "reverse"]);
|
|
|
113770
113787
|
var FanControlStatusSchema = object({
|
|
113771
113788
|
/** Active speed as 0..100 inclusive. Null when the device has no
|
|
113772
113789
|
* speed surface (single-speed fan). */
|
|
113773
|
-
|
|
113790
|
+
speed: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
113774
113791
|
/** Speed granularity the device accepts (HA `percentage_step`, e.g. 25 for
|
|
113775
113792
|
* a 4-speed fan). Absent when unknown — the UI then falls back to step 1. */
|
|
113776
113793
|
percentageStep: number().positive().optional().meta(readingMeta("percentage")),
|
|
@@ -113797,7 +113814,7 @@ var fanControlCapability = {
|
|
|
113797
113814
|
methods: {
|
|
113798
113815
|
setPercentage: method(object({
|
|
113799
113816
|
deviceId: number().int().nonnegative(),
|
|
113800
|
-
|
|
113817
|
+
speed: number().min(0).max(100)
|
|
113801
113818
|
}), _void(), {
|
|
113802
113819
|
kind: "mutation",
|
|
113803
113820
|
auth: "protected"
|
|
@@ -113830,7 +113847,7 @@ var fanControlCapability = {
|
|
|
113830
113847
|
},
|
|
113831
113848
|
/**
|
|
113832
113849
|
* Runtime-state slice — mirrored by the kernel. UI fan speed
|
|
113833
|
-
* sliders read `
|
|
113850
|
+
* sliders read `speed` for live updates.
|
|
113834
113851
|
*/
|
|
113835
113852
|
runtimeState: FanControlStatusSchema,
|
|
113836
113853
|
/**
|
|
@@ -113844,7 +113861,7 @@ var fanControlCapability = {
|
|
|
113844
113861
|
* History (D850): recorded series. Actuator tier: speed keeps every change.
|
|
113845
113862
|
*/
|
|
113846
113863
|
history: { fields: {
|
|
113847
|
-
|
|
113864
|
+
speed: {
|
|
113848
113865
|
kind: "gauge",
|
|
113849
113866
|
unit: "%",
|
|
113850
113867
|
minIntervalMs: 0
|
|
@@ -114289,7 +114306,7 @@ var humidifierCapability = {
|
|
|
114289
114306
|
*/
|
|
114290
114307
|
var HumiditySensorStatusSchema = object({
|
|
114291
114308
|
/** Current relative humidity, 0..100. `null` when the sample was refused (D393). */
|
|
114292
|
-
|
|
114309
|
+
humidity: number().min(0).max(100).nullable().meta(readingMeta("humidity", {
|
|
114293
114310
|
precision: 0,
|
|
114294
114311
|
label: "Humidity"
|
|
114295
114312
|
})),
|
|
@@ -114318,7 +114335,7 @@ var humiditySensorCapability = {
|
|
|
114318
114335
|
/**
|
|
114319
114336
|
* History (D850): recorded series.
|
|
114320
114337
|
*/
|
|
114321
|
-
history: { fields: {
|
|
114338
|
+
history: { fields: { humidity: {
|
|
114322
114339
|
kind: "gauge",
|
|
114323
114340
|
unit: "%",
|
|
114324
114341
|
deadband: .5
|
|
@@ -114958,7 +114975,7 @@ var LawnMowerControlStatusSchema = object({
|
|
|
114958
114975
|
batteryLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
114959
114976
|
/** 0..100 mowing-completion percentage of the current task, or null when no
|
|
114960
114977
|
* task is active / progress is unavailable. */
|
|
114961
|
-
|
|
114978
|
+
progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
114962
114979
|
/** Current device/event code (dynamic — mostly status, sometimes an error),
|
|
114963
114980
|
* or null when unknown. */
|
|
114964
114981
|
currentCode: number().nullable().meta(readingMeta("none")),
|
|
@@ -115458,7 +115475,7 @@ var lockControlCapability = {
|
|
|
115458
115475
|
volatileStateFields: ["lastChangedAt"]
|
|
115459
115476
|
};
|
|
115460
115477
|
/**
|
|
115461
|
-
* A monotonic total between resets (D944). Energy uses `power-meter.
|
|
115478
|
+
* A monotonic total between resets (D944). Energy uses `power-meter.energy`
|
|
115462
115479
|
* so dashboards keep one series; every other instantaneous reading lands here.
|
|
115463
115480
|
* `value` is the time integral in the source quantity's accumulated base
|
|
115464
115481
|
* (base-unit seconds, or kWh on the power meter). `null` is a gap, never zero.
|
|
@@ -115552,10 +115569,10 @@ var MediaPlayerStatusSchema = object({
|
|
|
115552
115569
|
currentMedia: MediaInfoSchema.nullable(),
|
|
115553
115570
|
/** Current playback position in ms. Null when not seekable or
|
|
115554
115571
|
* nothing is playing. Pair with `DeviceFeature.MediaPlayerSeek`. */
|
|
115555
|
-
|
|
115572
|
+
position: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
|
|
115556
115573
|
/** Total duration of the current media in ms. Null when unknown
|
|
115557
115574
|
* (live stream) or nothing is playing. */
|
|
115558
|
-
|
|
115575
|
+
duration: number().int().nonnegative().nullable().meta(readingMeta("duration-ms")),
|
|
115559
115576
|
/** Shuffle toggle. Null when no shuffle surface.
|
|
115560
115577
|
* Pair with `DeviceFeature.MediaPlayerShuffle`. */
|
|
115561
115578
|
shuffle: boolean().nullable(),
|
|
@@ -115594,7 +115611,7 @@ var mediaPlayerCapability = {
|
|
|
115594
115611
|
}),
|
|
115595
115612
|
seek: method(object({
|
|
115596
115613
|
deviceId: number().int().nonnegative(),
|
|
115597
|
-
|
|
115614
|
+
position: number().int().nonnegative()
|
|
115598
115615
|
}), _void(), {
|
|
115599
115616
|
kind: "mutation",
|
|
115600
115617
|
auth: "protected"
|
|
@@ -115666,7 +115683,7 @@ var mediaPlayerCapability = {
|
|
|
115666
115683
|
/**
|
|
115667
115684
|
* History (D850): volume (a level an operator or an automation sets; the
|
|
115668
115685
|
* default 10 s floor folds a slider drag into its end value) and mute.
|
|
115669
|
-
* `
|
|
115686
|
+
* `position` is not recorded: it moves continuously while playing.
|
|
115670
115687
|
*/
|
|
115671
115688
|
history: { fields: {
|
|
115672
115689
|
volumeLevel: {
|
|
@@ -116765,9 +116782,9 @@ var NetworkLinkStatusSchema = object({
|
|
|
116765
116782
|
* one whose reading has not landed must not be drawn at 0 %. Consumers
|
|
116766
116783
|
* SKIP a null rather than coerce it.
|
|
116767
116784
|
*/
|
|
116768
|
-
|
|
116785
|
+
signal: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
116769
116786
|
/** Raw received signal strength in dBm, when the firmware reports one. */
|
|
116770
|
-
|
|
116787
|
+
rssi: number().optional().meta(readingMeta("signal-level")),
|
|
116771
116788
|
/** Network name of a wireless link, when the firmware reports it. */
|
|
116772
116789
|
ssid: string().optional(),
|
|
116773
116790
|
/** Ms epoch of the last observation. Lets consumers reason about freshness. */
|
|
@@ -116776,7 +116793,7 @@ var NetworkLinkStatusSchema = object({
|
|
|
116776
116793
|
/** The slice a provider seeds before its first read: nothing is known yet. */
|
|
116777
116794
|
var NETWORK_LINK_UNKNOWN = {
|
|
116778
116795
|
type: "unknown",
|
|
116779
|
-
|
|
116796
|
+
signal: null,
|
|
116780
116797
|
lastUpdated: 0
|
|
116781
116798
|
};
|
|
116782
116799
|
/**
|
|
@@ -116837,13 +116854,13 @@ onStatusChanged: { data: object({
|
|
|
116837
116854
|
* History (D850): recorded series.
|
|
116838
116855
|
*/
|
|
116839
116856
|
history: { fields: {
|
|
116840
|
-
|
|
116857
|
+
signal: {
|
|
116841
116858
|
kind: "gauge",
|
|
116842
116859
|
unit: "%",
|
|
116843
116860
|
deadband: 3,
|
|
116844
116861
|
minIntervalMs: 6e4
|
|
116845
116862
|
},
|
|
116846
|
-
|
|
116863
|
+
rssi: {
|
|
116847
116864
|
kind: "gauge",
|
|
116848
116865
|
unit: "dBm",
|
|
116849
116866
|
deadband: 2,
|
|
@@ -118163,16 +118180,16 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
|
|
|
118163
118180
|
* in real-world devices.
|
|
118164
118181
|
*/
|
|
118165
118182
|
var PowerMeterStatusSchema = object({
|
|
118166
|
-
/** Instantaneous power draw
|
|
118167
|
-
|
|
118183
|
+
/** Instantaneous power draw (watts). */
|
|
118184
|
+
power: number().optional().meta(readingMeta("power", { label: "Power" })),
|
|
118168
118185
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
118169
|
-
|
|
118170
|
-
/** Voltage
|
|
118171
|
-
|
|
118186
|
+
energy: number().optional().meta(readingMeta("energy", { label: "Energy" })),
|
|
118187
|
+
/** Voltage (volts). */
|
|
118188
|
+
voltage: number().optional().meta(readingMeta("voltage", { label: "Voltage" })),
|
|
118172
118189
|
/** Current in amperes. */
|
|
118173
|
-
|
|
118190
|
+
current: number().optional().meta(readingMeta("current", { label: "Current" })),
|
|
118174
118191
|
/** Apparent power in volt-amperes. */
|
|
118175
|
-
|
|
118192
|
+
apparentPower: number().optional().meta(readingMeta("apparent-power")),
|
|
118176
118193
|
/** Power factor (0..1) if reported. */
|
|
118177
118194
|
powerFactor: number().min(0).max(1).optional().meta(readingMeta("ratio")),
|
|
118178
118195
|
/** Ms epoch when the slice was last updated. */
|
|
@@ -118230,14 +118247,14 @@ function powerTarget(id, unit) {
|
|
|
118230
118247
|
advancedExpression: true
|
|
118231
118248
|
};
|
|
118232
118249
|
}
|
|
118233
|
-
/** "Power and energy" extension:
|
|
118250
|
+
/** "Power and energy" extension: power, energy, voltage and current from other devices (D951). */
|
|
118234
118251
|
var powerMeterCustomize = {
|
|
118235
118252
|
version: 1,
|
|
118236
118253
|
targets: [
|
|
118237
|
-
powerTarget("
|
|
118238
|
-
powerTarget("
|
|
118239
|
-
powerTarget("
|
|
118240
|
-
powerTarget("
|
|
118254
|
+
powerTarget("power", "W"),
|
|
118255
|
+
powerTarget("energy", "kWh"),
|
|
118256
|
+
powerTarget("voltage", "V"),
|
|
118257
|
+
powerTarget("current", "A")
|
|
118241
118258
|
]
|
|
118242
118259
|
};
|
|
118243
118260
|
var powerMeterCapability = {
|
|
@@ -118253,41 +118270,41 @@ var powerMeterCapability = {
|
|
|
118253
118270
|
},
|
|
118254
118271
|
runtimeState: PowerMeterStatusSchema,
|
|
118255
118272
|
/**
|
|
118256
|
-
* Runtime-state durability: **restored** — as `numeric-sensor`; `
|
|
118273
|
+
* Runtime-state durability: **restored** — as `numeric-sensor`; `energy` is an accumulator whose restored value is the baseline.
|
|
118257
118274
|
*
|
|
118258
118275
|
* See `RuntimeStateDurability`. Enforced by
|
|
118259
118276
|
* `scripts/check-runtime-state-durability.ts`.
|
|
118260
118277
|
*/
|
|
118261
118278
|
durability: "restored",
|
|
118262
118279
|
/**
|
|
118263
|
-
* History (D850): recorded series. Gauges are floored at 30 s; `
|
|
118280
|
+
* History (D850): recorded series. Gauges are floored at 30 s; `energy` is the one monotonic meter (counter).
|
|
118264
118281
|
*/
|
|
118265
118282
|
history: { fields: {
|
|
118266
|
-
|
|
118283
|
+
power: {
|
|
118267
118284
|
kind: "gauge",
|
|
118268
118285
|
unit: "W",
|
|
118269
118286
|
deadband: 1,
|
|
118270
118287
|
minIntervalMs: 3e4
|
|
118271
118288
|
},
|
|
118272
|
-
|
|
118289
|
+
energy: {
|
|
118273
118290
|
kind: "counter",
|
|
118274
118291
|
unit: "kWh",
|
|
118275
118292
|
deadband: .01,
|
|
118276
118293
|
minIntervalMs: 6e4
|
|
118277
118294
|
},
|
|
118278
|
-
|
|
118295
|
+
voltage: {
|
|
118279
118296
|
kind: "gauge",
|
|
118280
118297
|
unit: "V",
|
|
118281
118298
|
deadband: 1,
|
|
118282
118299
|
minIntervalMs: 3e4
|
|
118283
118300
|
},
|
|
118284
|
-
|
|
118301
|
+
current: {
|
|
118285
118302
|
kind: "gauge",
|
|
118286
118303
|
unit: "A",
|
|
118287
118304
|
deadband: .05,
|
|
118288
118305
|
minIntervalMs: 3e4
|
|
118289
118306
|
},
|
|
118290
|
-
|
|
118307
|
+
apparentPower: {
|
|
118291
118308
|
kind: "gauge",
|
|
118292
118309
|
unit: "VA",
|
|
118293
118310
|
deadband: 1,
|
|
@@ -118337,9 +118354,6 @@ var PresenceStatusSchema = object({
|
|
|
118337
118354
|
location: string().nullable(),
|
|
118338
118355
|
/** GPS coordinates when available. Null otherwise. */
|
|
118339
118356
|
gps: GpsLocationSchema.nullable(),
|
|
118340
|
-
/** Optional battery level of the tracking device (0..100). Null
|
|
118341
|
-
* when not reported. */
|
|
118342
|
-
batteryPercent: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
118343
118357
|
/** Ms epoch when the slice was last updated. */
|
|
118344
118358
|
lastChangedAt: number()
|
|
118345
118359
|
});
|
|
@@ -118368,14 +118382,7 @@ var presenceCapability = {
|
|
|
118368
118382
|
* `scripts/check-runtime-state-durability.ts`.
|
|
118369
118383
|
*/
|
|
118370
118384
|
durability: "restored",
|
|
118371
|
-
|
|
118372
|
-
* History (D850): recorded series.
|
|
118373
|
-
*/
|
|
118374
|
-
history: { fields: { batteryPercent: {
|
|
118375
|
-
kind: "gauge",
|
|
118376
|
-
unit: "%",
|
|
118377
|
-
deadband: 1
|
|
118378
|
-
} } },
|
|
118385
|
+
history: "none",
|
|
118379
118386
|
/** Clock fields: written, but excluded from the compare that decides
|
|
118380
118387
|
* whether persisting is worth a SQLite commit. */
|
|
118381
118388
|
volatileStateFields: ["lastChangedAt"]
|
|
@@ -118390,7 +118397,7 @@ var presenceCapability = {
|
|
|
118390
118397
|
*/
|
|
118391
118398
|
var PressureSensorStatusSchema = object({
|
|
118392
118399
|
/** Current pressure in hPa. `null` when the sample was refused (D393). */
|
|
118393
|
-
|
|
118400
|
+
pressure: number().nullable().meta(readingMeta("pressure", { precision: 0 })),
|
|
118394
118401
|
/** Ms epoch when the slice was last updated. */
|
|
118395
118402
|
lastFetchedAt: number()
|
|
118396
118403
|
});
|
|
@@ -118416,7 +118423,7 @@ var pressureSensorCapability = {
|
|
|
118416
118423
|
/**
|
|
118417
118424
|
* History (D850): recorded series.
|
|
118418
118425
|
*/
|
|
118419
|
-
history: { fields: {
|
|
118426
|
+
history: { fields: { pressure: {
|
|
118420
118427
|
kind: "gauge",
|
|
118421
118428
|
unit: "hPa",
|
|
118422
118429
|
deadband: .1
|
|
@@ -122123,7 +122130,7 @@ var tamperCapability = {
|
|
|
122123
122130
|
*/
|
|
122124
122131
|
var TemperatureSensorStatusSchema = object({
|
|
122125
122132
|
/** Current temperature in Celsius. `null` when the sample was refused (D393). */
|
|
122126
|
-
|
|
122133
|
+
temperature: number().nullable().meta(readingMeta("temperature", {
|
|
122127
122134
|
precision: 1,
|
|
122128
122135
|
label: "Temperature"
|
|
122129
122136
|
})),
|
|
@@ -122152,7 +122159,7 @@ var temperatureSensorCapability = {
|
|
|
122152
122159
|
/**
|
|
122153
122160
|
* History (D850): recorded series.
|
|
122154
122161
|
*/
|
|
122155
|
-
history: { fields: {
|
|
122162
|
+
history: { fields: { temperature: {
|
|
122156
122163
|
kind: "gauge",
|
|
122157
122164
|
unit: "°C",
|
|
122158
122165
|
deadband: .1
|
|
@@ -122449,7 +122456,7 @@ var VacuumControlStatusSchema = object({
|
|
|
122449
122456
|
/** Speed tokens the hardware accepts — drives the UI selector. */
|
|
122450
122457
|
availableFanSpeeds: array(string()),
|
|
122451
122458
|
/** 0..100 cleaning-completion percentage of the current task, or null. */
|
|
122452
|
-
|
|
122459
|
+
progress: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
122453
122460
|
/** Current error code (0 / null = no error). */
|
|
122454
122461
|
errorCode: number().nullable().meta(readingMeta("none")),
|
|
122455
122462
|
/** Human label for {@link errorCode}, or null when none / undecodable. */
|
|
@@ -124531,7 +124538,7 @@ var BaseDevice = class {
|
|
|
124531
124538
|
* `device-local-state.ts`. Drivers access via:
|
|
124532
124539
|
*
|
|
124533
124540
|
* `this.state.battery.sleeping = true` // patches the battery slice
|
|
124534
|
-
* `const pct = this.state.battery.
|
|
124541
|
+
* `const pct = this.state.battery.level` // reads the battery slice
|
|
124535
124542
|
* `this.state.deviceStatus.online = true` // mirrors `markOnline(true)`
|
|
124536
124543
|
*
|
|
124537
124544
|
* Adding a new cap with `runtimeState:` automatically extends this
|
|
@@ -124571,7 +124578,7 @@ var BaseDevice = class {
|
|
|
124571
124578
|
* shape; drivers don't redeclare it, they just write through.
|
|
124572
124579
|
*
|
|
124573
124580
|
* Read: `this.runtimeState.getCapState('battery')` →
|
|
124574
|
-
* `{
|
|
124581
|
+
* `{level, charging, sleeping, lastUpdated}` for any
|
|
124575
124582
|
* provider that registers `batteryCapability`.
|
|
124576
124583
|
* Write: `this.runtimeState.setCapState('battery', { … })`.
|
|
124577
124584
|
*
|
|
@@ -135790,7 +135797,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135790
135797
|
label: t("Full brightness", "Luminosità massima"),
|
|
135791
135798
|
phrase: t("Set {device} to full brightness", "Porta {device} alla massima luminosità"),
|
|
135792
135799
|
icon: "sun",
|
|
135793
|
-
args: {
|
|
135800
|
+
args: { level: 100 }
|
|
135794
135801
|
},
|
|
135795
135802
|
{
|
|
135796
135803
|
id: "brightness.half",
|
|
@@ -135798,7 +135805,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135798
135805
|
label: t("Half brightness", "Luminosità a metà"),
|
|
135799
135806
|
phrase: t("Dim {device} to half", "Abbassa {device} a metà luminosità"),
|
|
135800
135807
|
icon: "sun-dim",
|
|
135801
|
-
args: {
|
|
135808
|
+
args: { level: 50 }
|
|
135802
135809
|
},
|
|
135803
135810
|
{
|
|
135804
135811
|
id: "brightness.off",
|
|
@@ -135806,16 +135813,16 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135806
135813
|
label: t("Brightness off", "Luminosità a zero"),
|
|
135807
135814
|
phrase: t("Dim {device} to zero", "Abbassa {device} a zero"),
|
|
135808
135815
|
icon: "lightbulb-off",
|
|
135809
|
-
args: {
|
|
135816
|
+
args: { level: 0 }
|
|
135810
135817
|
},
|
|
135811
135818
|
{
|
|
135812
135819
|
id: "brightness.set",
|
|
135813
135820
|
method: "setBrightness",
|
|
135814
135821
|
label: t("Set brightness", "Imposta la luminosità"),
|
|
135815
|
-
phrase: t("Set the brightness of {device} to {
|
|
135822
|
+
phrase: t("Set the brightness of {device} to {level}", "Imposta la luminosità di {device} a {level}"),
|
|
135816
135823
|
icon: "sun-medium",
|
|
135817
135824
|
openArgs: [{
|
|
135818
|
-
key: "
|
|
135825
|
+
key: "level",
|
|
135819
135826
|
label: PERCENT,
|
|
135820
135827
|
offer: {
|
|
135821
135828
|
kind: "number",
|
|
@@ -135829,13 +135836,13 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135829
135836
|
],
|
|
135830
135837
|
state: [{
|
|
135831
135838
|
kind: "numeric",
|
|
135832
|
-
field: "
|
|
135839
|
+
field: "level",
|
|
135833
135840
|
quantity: t("the brightness", "la luminosità"),
|
|
135834
135841
|
label: t("Brightness", "Luminosità"),
|
|
135835
135842
|
unit: "%",
|
|
135836
135843
|
icon: "sun"
|
|
135837
135844
|
}],
|
|
135838
|
-
events: { onBrightnessChanged: { notOperatorFacing: "the `
|
|
135845
|
+
events: { onBrightnessChanged: { notOperatorFacing: "the `level` state trigger reads the same change" } }
|
|
135839
135846
|
},
|
|
135840
135847
|
color: {
|
|
135841
135848
|
scope: "device",
|
|
@@ -135849,7 +135856,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135849
135856
|
icon: "sun",
|
|
135850
135857
|
args: { color: {
|
|
135851
135858
|
mode: "mired",
|
|
135852
|
-
|
|
135859
|
+
colorTemperature: 370
|
|
135853
135860
|
} }
|
|
135854
135861
|
},
|
|
135855
135862
|
{
|
|
@@ -135860,7 +135867,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
135860
135867
|
icon: "snowflake",
|
|
135861
135868
|
args: { color: {
|
|
135862
135869
|
mode: "mired",
|
|
135863
|
-
|
|
135870
|
+
colorTemperature: 200
|
|
135864
135871
|
} }
|
|
135865
135872
|
},
|
|
135866
135873
|
{
|
|
@@ -136474,7 +136481,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
136474
136481
|
label: t("Fan off", "Ventilatore spento"),
|
|
136475
136482
|
phrase: t("Stop {device}", "Ferma {device}"),
|
|
136476
136483
|
icon: "power-off",
|
|
136477
|
-
args: {
|
|
136484
|
+
args: { speed: 0 }
|
|
136478
136485
|
},
|
|
136479
136486
|
{
|
|
136480
136487
|
id: "fan.full",
|
|
@@ -136482,16 +136489,16 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
136482
136489
|
label: t("Fan full", "Ventilatore al massimo"),
|
|
136483
136490
|
phrase: t("Run {device} at full speed", "Porta {device} alla massima velocità"),
|
|
136484
136491
|
icon: "fan",
|
|
136485
|
-
args: {
|
|
136492
|
+
args: { speed: 100 }
|
|
136486
136493
|
},
|
|
136487
136494
|
{
|
|
136488
136495
|
id: "fan.speed",
|
|
136489
136496
|
method: "setPercentage",
|
|
136490
136497
|
label: t("Set speed", "Imposta la velocità"),
|
|
136491
|
-
phrase: t("Set the speed of {device} to {
|
|
136498
|
+
phrase: t("Set the speed of {device} to {speed}", "Imposta la velocità di {device} al {speed}"),
|
|
136492
136499
|
icon: "fan",
|
|
136493
136500
|
openArgs: [{
|
|
136494
|
-
key: "
|
|
136501
|
+
key: "speed",
|
|
136495
136502
|
label: t("Speed", "Velocità"),
|
|
136496
136503
|
offer: {
|
|
136497
136504
|
kind: "number",
|
|
@@ -136553,7 +136560,7 @@ var ACTUATOR_CAP_VOCABULARY = {
|
|
|
136553
136560
|
],
|
|
136554
136561
|
state: [{
|
|
136555
136562
|
kind: "numeric",
|
|
136556
|
-
field: "
|
|
136563
|
+
field: "speed",
|
|
136557
136564
|
quantity: t("the speed", "la velocità"),
|
|
136558
136565
|
label: t("Speed", "Velocità"),
|
|
136559
136566
|
unit: "%",
|
|
@@ -137351,7 +137358,7 @@ var APPLIANCE_CAP_VOCABULARY = {
|
|
|
137351
137358
|
},
|
|
137352
137359
|
{
|
|
137353
137360
|
kind: "numeric",
|
|
137354
|
-
field: "
|
|
137361
|
+
field: "progress",
|
|
137355
137362
|
quantity: t("the cycle progress", "l’avanzamento del lavaggio"),
|
|
137356
137363
|
label: t("Progress", "Avanzamento"),
|
|
137357
137364
|
unit: "%",
|
|
@@ -137709,10 +137716,10 @@ var APPLIANCE_CAP_VOCABULARY = {
|
|
|
137709
137716
|
id: "media.seek",
|
|
137710
137717
|
method: "seek",
|
|
137711
137718
|
label: t("Seek", "Vai al punto"),
|
|
137712
|
-
phrase: t("Move {device} to {
|
|
137719
|
+
phrase: t("Move {device} to {position}", "Porta {device} al punto {position}"),
|
|
137713
137720
|
icon: "fast-forward",
|
|
137714
137721
|
openArgs: [{
|
|
137715
|
-
key: "
|
|
137722
|
+
key: "position",
|
|
137716
137723
|
label: t("Position", "Posizione"),
|
|
137717
137724
|
offer: {
|
|
137718
137725
|
kind: "number",
|
|
@@ -138761,7 +138768,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
138761
138768
|
state: [
|
|
138762
138769
|
{
|
|
138763
138770
|
kind: "numeric",
|
|
138764
|
-
field: "
|
|
138771
|
+
field: "co2",
|
|
138765
138772
|
quantity: t("the CO₂", "la CO₂"),
|
|
138766
138773
|
label: t("CO₂", "CO₂"),
|
|
138767
138774
|
unit: "ppm",
|
|
@@ -138769,7 +138776,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
138769
138776
|
},
|
|
138770
138777
|
{
|
|
138771
138778
|
kind: "numeric",
|
|
138772
|
-
field: "
|
|
138779
|
+
field: "voc",
|
|
138773
138780
|
quantity: t("the VOC level", "il livello di COV"),
|
|
138774
138781
|
label: t("VOC", "COV"),
|
|
138775
138782
|
unit: "ppb",
|
|
@@ -138805,7 +138812,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
138805
138812
|
noun: t("Light level", "Luminosità ambiente"),
|
|
138806
138813
|
state: [{
|
|
138807
138814
|
kind: "numeric",
|
|
138808
|
-
field: "
|
|
138815
|
+
field: "illuminance",
|
|
138809
138816
|
quantity: t("the light level", "la luminosità"),
|
|
138810
138817
|
label: t("Illuminance", "Illuminamento"),
|
|
138811
138818
|
unit: "lx",
|
|
@@ -139008,7 +139015,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139008
139015
|
noun: t("Humidity", "Umidità"),
|
|
139009
139016
|
state: [{
|
|
139010
139017
|
kind: "numeric",
|
|
139011
|
-
field: "
|
|
139018
|
+
field: "humidity",
|
|
139012
139019
|
quantity: t("the humidity", "l’umidità"),
|
|
139013
139020
|
label: t("Humidity", "Umidità"),
|
|
139014
139021
|
unit: "%",
|
|
@@ -139056,7 +139063,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139056
139063
|
state: [
|
|
139057
139064
|
{
|
|
139058
139065
|
kind: "numeric",
|
|
139059
|
-
field: "
|
|
139066
|
+
field: "power",
|
|
139060
139067
|
quantity: t("the power draw", "il consumo"),
|
|
139061
139068
|
label: t("Power", "Potenza"),
|
|
139062
139069
|
unit: "W",
|
|
@@ -139064,7 +139071,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139064
139071
|
},
|
|
139065
139072
|
{
|
|
139066
139073
|
kind: "numeric",
|
|
139067
|
-
field: "
|
|
139074
|
+
field: "energy",
|
|
139068
139075
|
quantity: t("the energy used", "l’energia consumata"),
|
|
139069
139076
|
label: t("Energy", "Energia"),
|
|
139070
139077
|
unit: "kWh",
|
|
@@ -139072,7 +139079,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139072
139079
|
},
|
|
139073
139080
|
{
|
|
139074
139081
|
kind: "numeric",
|
|
139075
|
-
field: "
|
|
139082
|
+
field: "voltage",
|
|
139076
139083
|
quantity: t("the voltage", "la tensione"),
|
|
139077
139084
|
label: t("Voltage", "Tensione"),
|
|
139078
139085
|
unit: "V",
|
|
@@ -139080,7 +139087,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139080
139087
|
},
|
|
139081
139088
|
{
|
|
139082
139089
|
kind: "numeric",
|
|
139083
|
-
field: "
|
|
139090
|
+
field: "current",
|
|
139084
139091
|
quantity: t("the current", "la corrente"),
|
|
139085
139092
|
label: t("Current", "Corrente"),
|
|
139086
139093
|
unit: "A",
|
|
@@ -139097,13 +139104,6 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139097
139104
|
label: t("Where", "Posizione"),
|
|
139098
139105
|
phrase: t("When {device} is at {value}", "Quando {device} è in {value}"),
|
|
139099
139106
|
icon: "map-pin"
|
|
139100
|
-
}, {
|
|
139101
|
-
kind: "numeric",
|
|
139102
|
-
field: "batteryPercent",
|
|
139103
|
-
quantity: t("the phone battery", "la batteria del telefono"),
|
|
139104
|
-
label: t("Battery", "Batteria"),
|
|
139105
|
-
unit: "%",
|
|
139106
|
-
icon: "battery"
|
|
139107
139107
|
}]
|
|
139108
139108
|
},
|
|
139109
139109
|
"pressure-sensor": {
|
|
@@ -139111,7 +139111,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139111
139111
|
noun: t("Pressure", "Pressione"),
|
|
139112
139112
|
state: [{
|
|
139113
139113
|
kind: "numeric",
|
|
139114
|
-
field: "
|
|
139114
|
+
field: "pressure",
|
|
139115
139115
|
quantity: t("the pressure", "la pressione"),
|
|
139116
139116
|
label: t("Pressure", "Pressione"),
|
|
139117
139117
|
unit: "hPa",
|
|
@@ -139147,7 +139147,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139147
139147
|
noun: t("Temperature", "Temperatura"),
|
|
139148
139148
|
state: [{
|
|
139149
139149
|
kind: "numeric",
|
|
139150
|
-
field: "
|
|
139150
|
+
field: "temperature",
|
|
139151
139151
|
quantity: t("the temperature", "la temperatura"),
|
|
139152
139152
|
label: t("Temperature", "Temperatura"),
|
|
139153
139153
|
unit: "°C",
|
|
@@ -139218,7 +139218,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139218
139218
|
state: [
|
|
139219
139219
|
{
|
|
139220
139220
|
kind: "numeric",
|
|
139221
|
-
field: "
|
|
139221
|
+
field: "level",
|
|
139222
139222
|
quantity: t("the battery level", "il livello della batteria"),
|
|
139223
139223
|
label: t("Battery", "Batteria"),
|
|
139224
139224
|
unit: "%",
|
|
@@ -139260,7 +139260,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139260
139260
|
icon: "battery-charging"
|
|
139261
139261
|
}
|
|
139262
139262
|
],
|
|
139263
|
-
events: { onStatusChanged: { notOperatorFacing: "the
|
|
139263
|
+
events: { onStatusChanged: { notOperatorFacing: "the level / sleeping / charging state triggers each read one field of this change" } },
|
|
139264
139264
|
extraEvents: [{
|
|
139265
139265
|
category: EventCategory.DeviceAwake,
|
|
139266
139266
|
label: t("Woke up", "Risvegliato"),
|
|
@@ -139278,7 +139278,7 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
139278
139278
|
noun: t("Network link", "Collegamento di rete"),
|
|
139279
139279
|
state: [{
|
|
139280
139280
|
kind: "numeric",
|
|
139281
|
-
field: "
|
|
139281
|
+
field: "signal",
|
|
139282
139282
|
quantity: t("the signal strength", "l’intensità del segnale"),
|
|
139283
139283
|
label: t("Signal", "Segnale"),
|
|
139284
139284
|
unit: "%",
|
|
@@ -146257,7 +146257,7 @@ function clampLevel(level) {
|
|
|
146257
146257
|
function cameraBatterySlice(facts) {
|
|
146258
146258
|
const charging = facts.charging === null ? "unknown" : facts.charging === CHARGING_STATUS_CHARGING ? "dc" : "none";
|
|
146259
146259
|
return {
|
|
146260
|
-
|
|
146260
|
+
level: clampLevel(facts.level),
|
|
146261
146261
|
charging,
|
|
146262
146262
|
sleeping: !facts.streamOpen,
|
|
146263
146263
|
lastUpdated: facts.now,
|
|
@@ -146666,7 +146666,7 @@ function networkLinkFromBars(bars, now) {
|
|
|
146666
146666
|
if (bars === null || !Number.isFinite(bars)) return null;
|
|
146667
146667
|
return {
|
|
146668
146668
|
type: "wifi",
|
|
146669
|
-
|
|
146669
|
+
signal: bars === 0 ? null : signalPercentFromBars(bars, 4),
|
|
146670
146670
|
lastUpdated: now
|
|
146671
146671
|
};
|
|
146672
146672
|
}
|
|
@@ -193869,7 +193869,7 @@ var SHADOW_POLL_MS = 12e4;
|
|
|
193869
193869
|
var COLD_START = {
|
|
193870
193870
|
activity: "idle",
|
|
193871
193871
|
batteryLevel: null,
|
|
193872
|
-
|
|
193872
|
+
progress: null,
|
|
193873
193873
|
currentCode: null,
|
|
193874
193874
|
currentCodeLabel: null,
|
|
193875
193875
|
severity: "info",
|
|
@@ -193983,11 +193983,11 @@ var DreameMowerDevice = class extends DreameChildDevice {
|
|
|
193983
193983
|
const status = mower.status;
|
|
193984
193984
|
const code = mower.faultRaw;
|
|
193985
193985
|
const livePct = clampPercent(mower.mowingProgressPct);
|
|
193986
|
-
const prevPct = this.runtimeState.getCapState(CAP_NAME$9)?.
|
|
193986
|
+
const prevPct = this.runtimeState.getCapState(CAP_NAME$9)?.progress;
|
|
193987
193987
|
const slice = {
|
|
193988
193988
|
activity: mapMowerStatusToActivity(status),
|
|
193989
193989
|
batteryLevel: clampBatteryLevel(mower.battery),
|
|
193990
|
-
|
|
193990
|
+
progress: livePct ?? prevPct ?? null,
|
|
193991
193991
|
currentCode: code,
|
|
193992
193992
|
currentCodeLabel: code !== null ? MowerFault[code] ?? null : null,
|
|
193993
193993
|
severity: mower.faultSeverity,
|
|
@@ -194927,7 +194927,7 @@ var CONTROL_COLD_START = {
|
|
|
194927
194927
|
batteryLevel: null,
|
|
194928
194928
|
fanSpeed: null,
|
|
194929
194929
|
availableFanSpeeds: [],
|
|
194930
|
-
|
|
194930
|
+
progress: null,
|
|
194931
194931
|
errorCode: null,
|
|
194932
194932
|
errorLabel: null,
|
|
194933
194933
|
lastChangedAt: 0
|
|
@@ -195081,7 +195081,7 @@ var DreameVacuumDevice = class extends DreameChildDevice {
|
|
|
195081
195081
|
batteryLevel: clampBatteryLevel$1(vacuum.battery),
|
|
195082
195082
|
fanSpeed: suctionLevelToken(vacuum.suction),
|
|
195083
195083
|
availableFanSpeeds: supportedFanSpeedTokens(vacuum.supportedSuctionLevels),
|
|
195084
|
-
|
|
195084
|
+
progress: clampPercent$1(vacuum.taskProgressPct),
|
|
195085
195085
|
errorCode: vacuum.errorCode,
|
|
195086
195086
|
errorLabel: vacuumErrorLabel(vacuum.errorCode),
|
|
195087
195087
|
lastChangedAt: Date.now()
|