@camstack/addon-provider-homeassistant 1.2.633 → 1.2.635
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/addon.js +83 -60
- package/dist/addon.mjs +83 -60
- package/dist/{dist-BVojc0hA.mjs → dist-CYl0u8cF.mjs} +1038 -247
- package/dist/{dist-DVkAN1CW.js → dist-C_PMvyYa.js} +1038 -247
- package/dist/ha-export/ha-export.addon.js +28 -24
- package/dist/ha-export/ha-export.addon.mjs +28 -24
- package/package.json +1 -1
package/dist/addon.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as lawnMowerControlCapability, $t as union, A as buttonCapability, At as weatherCapability, B as coverCapability, Bt as defineRecordKinds, C as batteryCapability, Ct as tryConvertDelta, D as brokerCapability, Dt as valveCapability, E as brightnessCapability, Et as vacuumControlCapability, F as connectivityCapability, G as eventEmitterCapability, Gt as array, H as deviceAdoptionCapability, It as RecordSecretUnavailableError, J as gasCapability, Jt as literal, K as fanControlCapability, Kt as boolean, Lt as baseUnitOf, M as carbonMonoxideCapability, Mt as DeviceRole, N as climateControlCapability, Nt as DeviceType, O as buildAddonRouteProvider, Ot as vibrationCapability, P as colorCapability, Pt as errMsg, Q as ingestReading, Qt as string, R as contactCapability, Rt as createEvent, S as automationControlCapability, St as temperatureSensorCapability, T as binaryCapability, Tt as updateCapability, V as deviceAdminLinkCapability, Vt as entryBody, W as enumSensorCapability, Wt as _enum, X as humiditySensorCapability, Xt as object, Y as humidifierCapability, Yt as number, Z as imageCapability, Zt as record, _ as accessoriesCapability, _t as runningStateCapability, at as notifierCapability, b as alarmPanelCapability, bt as switchCapability, ct as parseAdminBase, dt as presenceCapability, en as unknown, et as lockControlCapability, ft as pressureSensorCapability, g as TargetSchema, gt as runningFromVacuumState, h as RUNNING_STATE_COLD, ht as runningFromMediaPlayer, it as notificationOutputCapability, j as calendarSourceCapability, jt as DeviceFeature, k as buildDeviceAdminUrl, kt as waterHeaterCapability, lt as powerMeterCapability, mt as runningFromLawnMower, n as BaseDevice, nn as EventCategory, nt as motionCapability, ot as numericSensorCapability, pt as quantityFromUnit, q as floodCapability, qt as discriminatedUnion, r as BaseDeviceProvider, rt as normalizeUnit, tn as url, tt as mediaPlayerCapability, u as EnumSensorDateTimeFormatSchema, ut as prepareNotification, v as addonRoutesCapability, vt as scriptRunnerCapability, w as bestLocationMatch, wt as tryConvertUnit, x as ambientLightSensorCapability, xt as tamperCapability, y as airQualitySensorCapability, yt as smokeCapability, z as controlCapability, zt as defineEntryKind } from "./dist-
|
|
1
|
+
import { $ as lawnMowerControlCapability, $t as union, A as buttonCapability, At as weatherCapability, B as coverCapability, Bt as defineRecordKinds, C as batteryCapability, Ct as tryConvertDelta, D as brokerCapability, Dt as valveCapability, E as brightnessCapability, Et as vacuumControlCapability, F as connectivityCapability, G as eventEmitterCapability, Gt as array, H as deviceAdoptionCapability, It as RecordSecretUnavailableError, J as gasCapability, Jt as literal, K as fanControlCapability, Kt as boolean, Lt as baseUnitOf, M as carbonMonoxideCapability, Mt as DeviceRole, N as climateControlCapability, Nt as DeviceType, O as buildAddonRouteProvider, Ot as vibrationCapability, P as colorCapability, Pt as errMsg, Q as ingestReading, Qt as string, R as contactCapability, Rt as createEvent, S as automationControlCapability, St as temperatureSensorCapability, T as binaryCapability, Tt as updateCapability, V as deviceAdminLinkCapability, Vt as entryBody, W as enumSensorCapability, Wt as _enum, X as humiditySensorCapability, Xt as object, Y as humidifierCapability, Yt as number, Z as imageCapability, Zt as record, _ as accessoriesCapability, _t as runningStateCapability, at as notifierCapability, b as alarmPanelCapability, bt as switchCapability, ct as parseAdminBase, dt as presenceCapability, en as unknown, et as lockControlCapability, ft as pressureSensorCapability, g as TargetSchema, gt as runningFromVacuumState, h as RUNNING_STATE_COLD, ht as runningFromMediaPlayer, it as notificationOutputCapability, j as calendarSourceCapability, jt as DeviceFeature, k as buildDeviceAdminUrl, kt as waterHeaterCapability, lt as powerMeterCapability, mt as runningFromLawnMower, n as BaseDevice, nn as EventCategory, nt as motionCapability, ot as numericSensorCapability, pt as quantityFromUnit, q as floodCapability, qt as discriminatedUnion, r as BaseDeviceProvider, rt as normalizeUnit, tn as url, tt as mediaPlayerCapability, u as EnumSensorDateTimeFormatSchema, ut as prepareNotification, v as addonRoutesCapability, vt as scriptRunnerCapability, w as bestLocationMatch, wt as tryConvertUnit, x as ambientLightSensorCapability, xt as tamperCapability, y as airQualitySensorCapability, yt as smokeCapability, z as controlCapability, zt as defineEntryKind } from "./dist-CYl0u8cF.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
|
|
4
4
|
//#region src/ha-admin-link.ts
|
|
@@ -128,10 +128,10 @@ var haSourceSchemaFields = {
|
|
|
128
128
|
features: array(string()).optional(),
|
|
129
129
|
/** Sibling meter sensors whose readings this entity carries as `power-meter` (D951). */
|
|
130
130
|
meterEntities: object({
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
131
|
+
power: string().optional(),
|
|
132
|
+
energy: string().optional(),
|
|
133
|
+
voltage: string().optional(),
|
|
134
|
+
current: string().optional()
|
|
135
135
|
}).optional()
|
|
136
136
|
};
|
|
137
137
|
/** Project a persisted config blob into a typed source, or null when the
|
|
@@ -331,26 +331,26 @@ function takeReading(logger, deviceId, value, rawUnit, quantity) {
|
|
|
331
331
|
*/
|
|
332
332
|
/** The `power-meter` status field a reading lands in. */
|
|
333
333
|
var METER_FIELDS = [
|
|
334
|
-
"
|
|
335
|
-
"
|
|
336
|
-
"
|
|
337
|
-
"
|
|
334
|
+
"power",
|
|
335
|
+
"energy",
|
|
336
|
+
"voltage",
|
|
337
|
+
"current"
|
|
338
338
|
];
|
|
339
339
|
var METER_BY_DEVICE_CLASS = {
|
|
340
340
|
power: {
|
|
341
|
-
field: "
|
|
341
|
+
field: "power",
|
|
342
342
|
quantity: "power"
|
|
343
343
|
},
|
|
344
344
|
energy: {
|
|
345
|
-
field: "
|
|
345
|
+
field: "energy",
|
|
346
346
|
quantity: "energy"
|
|
347
347
|
},
|
|
348
348
|
voltage: {
|
|
349
|
-
field: "
|
|
349
|
+
field: "voltage",
|
|
350
350
|
quantity: "voltage"
|
|
351
351
|
},
|
|
352
352
|
current: {
|
|
353
|
-
field: "
|
|
353
|
+
field: "current",
|
|
354
354
|
quantity: "current"
|
|
355
355
|
}
|
|
356
356
|
};
|
|
@@ -952,10 +952,10 @@ var SUPPORTED_CAP_NAMES$1 = [
|
|
|
952
952
|
];
|
|
953
953
|
/** Map a supported cap to its canonical "value" field. */
|
|
954
954
|
var VALUE_FIELD = {
|
|
955
|
-
"temperature-sensor": "
|
|
956
|
-
"humidity-sensor": "
|
|
957
|
-
"ambient-light-sensor": "
|
|
958
|
-
"pressure-sensor": "
|
|
955
|
+
"temperature-sensor": "temperature",
|
|
956
|
+
"humidity-sensor": "humidity",
|
|
957
|
+
"ambient-light-sensor": "illuminance",
|
|
958
|
+
"pressure-sensor": "pressure",
|
|
959
959
|
"numeric-sensor": "value"
|
|
960
960
|
};
|
|
961
961
|
/** Typed sensors already name their quantity. The generic sensor learns it. */
|
|
@@ -1079,7 +1079,7 @@ var HaNumericSensorDevice = class extends HaBaseChildDevice {
|
|
|
1079
1079
|
switch (name) {
|
|
1080
1080
|
case "temperature-sensor": {
|
|
1081
1081
|
const COLD_START = {
|
|
1082
|
-
|
|
1082
|
+
temperature: 0,
|
|
1083
1083
|
lastFetchedAt: 0
|
|
1084
1084
|
};
|
|
1085
1085
|
this.ctx.registerNativeCap(temperatureSensorCapability, { getStatus: async () => this.readSlice(COLD_START) });
|
|
@@ -1087,7 +1087,7 @@ var HaNumericSensorDevice = class extends HaBaseChildDevice {
|
|
|
1087
1087
|
}
|
|
1088
1088
|
case "humidity-sensor": {
|
|
1089
1089
|
const COLD_START = {
|
|
1090
|
-
|
|
1090
|
+
humidity: 0,
|
|
1091
1091
|
lastFetchedAt: 0
|
|
1092
1092
|
};
|
|
1093
1093
|
this.ctx.registerNativeCap(humiditySensorCapability, { getStatus: async () => this.readSlice(COLD_START) });
|
|
@@ -1095,7 +1095,7 @@ var HaNumericSensorDevice = class extends HaBaseChildDevice {
|
|
|
1095
1095
|
}
|
|
1096
1096
|
case "ambient-light-sensor": {
|
|
1097
1097
|
const COLD_START = {
|
|
1098
|
-
|
|
1098
|
+
illuminance: 0,
|
|
1099
1099
|
lastFetchedAt: 0
|
|
1100
1100
|
};
|
|
1101
1101
|
this.ctx.registerNativeCap(ambientLightSensorCapability, { getStatus: async () => this.readSlice(COLD_START) });
|
|
@@ -1103,7 +1103,7 @@ var HaNumericSensorDevice = class extends HaBaseChildDevice {
|
|
|
1103
1103
|
}
|
|
1104
1104
|
case "pressure-sensor": {
|
|
1105
1105
|
const COLD_START = {
|
|
1106
|
-
|
|
1106
|
+
pressure: 0,
|
|
1107
1107
|
lastFetchedAt: 0
|
|
1108
1108
|
};
|
|
1109
1109
|
this.ctx.registerNativeCap(pressureSensorCapability, { getStatus: async () => this.readSlice(COLD_START) });
|
|
@@ -1399,7 +1399,7 @@ var HaLightDevice = class extends HaBaseChildDevice {
|
|
|
1399
1399
|
lastChangedAt: 0
|
|
1400
1400
|
});
|
|
1401
1401
|
if (this.capSet.has("brightness")) this.runtimeState.setCapState("brightness", {
|
|
1402
|
-
|
|
1402
|
+
level: 0,
|
|
1403
1403
|
lastChangedAt: 0
|
|
1404
1404
|
});
|
|
1405
1405
|
if (this.capSet.has("color")) this.runtimeState.setCapState("color", {
|
|
@@ -1419,7 +1419,7 @@ var HaLightDevice = class extends HaBaseChildDevice {
|
|
|
1419
1419
|
if (haBrightness !== null) {
|
|
1420
1420
|
const percentage = Math.max(0, Math.min(100, Math.round(haBrightness / 255 * 100)));
|
|
1421
1421
|
this.runtimeState.setCapState("brightness", {
|
|
1422
|
-
percentage,
|
|
1422
|
+
level: percentage,
|
|
1423
1423
|
lastChangedAt
|
|
1424
1424
|
});
|
|
1425
1425
|
}
|
|
@@ -1449,11 +1449,11 @@ var HaLightDevice = class extends HaBaseChildDevice {
|
|
|
1449
1449
|
this.ctx.registerNativeCap(brightnessCapability, {
|
|
1450
1450
|
getStatus: async () => {
|
|
1451
1451
|
return this.runtimeState.getCapState("brightness") ?? {
|
|
1452
|
-
|
|
1452
|
+
level: 0,
|
|
1453
1453
|
lastChangedAt: 0
|
|
1454
1454
|
};
|
|
1455
1455
|
},
|
|
1456
|
-
setBrightness: async ({ percentage }) => {
|
|
1456
|
+
setBrightness: async ({ level: percentage }) => {
|
|
1457
1457
|
await this.callHaService("light", "turn_on", { brightness_pct: percentage });
|
|
1458
1458
|
}
|
|
1459
1459
|
});
|
|
@@ -1512,7 +1512,7 @@ function decodeColorSlice(colorMode, attrs, lastChangedAt) {
|
|
|
1512
1512
|
const mireds = readNumberAttr$6(attrs, "color_temp");
|
|
1513
1513
|
if (mireds !== null) return {
|
|
1514
1514
|
mode: "mired",
|
|
1515
|
-
mireds,
|
|
1515
|
+
colorTemperature: mireds,
|
|
1516
1516
|
lastChangedAt
|
|
1517
1517
|
};
|
|
1518
1518
|
return null;
|
|
@@ -1530,7 +1530,7 @@ function colorInputToHaServiceData(color) {
|
|
|
1530
1530
|
hs_color: [color.hsv.h, color.hsv.s],
|
|
1531
1531
|
brightness_pct: color.hsv.v
|
|
1532
1532
|
};
|
|
1533
|
-
case "mired": return { color_temp: color.
|
|
1533
|
+
case "mired": return { color_temp: color.colorTemperature };
|
|
1534
1534
|
}
|
|
1535
1535
|
}
|
|
1536
1536
|
//#endregion
|
|
@@ -2158,7 +2158,7 @@ function readNumberAttr$3(attrs, key) {
|
|
|
2158
2158
|
//#endregion
|
|
2159
2159
|
//#region src/devices/ha-fan-device.ts
|
|
2160
2160
|
var FAN_COLD_START = {
|
|
2161
|
-
|
|
2161
|
+
speed: null,
|
|
2162
2162
|
preset: "",
|
|
2163
2163
|
availablePresets: [],
|
|
2164
2164
|
direction: null,
|
|
@@ -2194,7 +2194,7 @@ var HaFanDevice = class extends HaBaseChildDevice {
|
|
|
2194
2194
|
});
|
|
2195
2195
|
const attrs = state.attributes;
|
|
2196
2196
|
const slice = {
|
|
2197
|
-
|
|
2197
|
+
speed: readNumberAttr$2(attrs, "percentage"),
|
|
2198
2198
|
percentageStep: readNumberAttr$2(attrs, "percentage_step") ?? void 0,
|
|
2199
2199
|
preset: readStringAttr$4(attrs, "preset_mode") ?? "",
|
|
2200
2200
|
availablePresets: readStringArray$1(attrs, "preset_modes"),
|
|
@@ -2222,7 +2222,7 @@ var HaFanDevice = class extends HaBaseChildDevice {
|
|
|
2222
2222
|
getStatus: async () => {
|
|
2223
2223
|
return this.runtimeState.getCapState("fan-control") ?? FAN_COLD_START;
|
|
2224
2224
|
},
|
|
2225
|
-
setPercentage: async ({ percentage }) => {
|
|
2225
|
+
setPercentage: async ({ speed: percentage }) => {
|
|
2226
2226
|
await this.callHaService("fan", "set_percentage", { percentage });
|
|
2227
2227
|
},
|
|
2228
2228
|
setPreset: async ({ preset }) => {
|
|
@@ -2264,7 +2264,7 @@ var COLD_START$12 = {
|
|
|
2264
2264
|
batteryLevel: null,
|
|
2265
2265
|
fanSpeed: null,
|
|
2266
2266
|
availableFanSpeeds: [],
|
|
2267
|
-
|
|
2267
|
+
progress: null,
|
|
2268
2268
|
errorCode: null,
|
|
2269
2269
|
errorLabel: null,
|
|
2270
2270
|
lastChangedAt: 0
|
|
@@ -2301,7 +2301,7 @@ var HaVacuumDevice = class extends HaBaseChildDevice {
|
|
|
2301
2301
|
batteryLevel,
|
|
2302
2302
|
fanSpeed,
|
|
2303
2303
|
availableFanSpeeds,
|
|
2304
|
-
|
|
2304
|
+
progress: null,
|
|
2305
2305
|
errorCode: null,
|
|
2306
2306
|
errorLabel: lifecycleState === "error" ? readStringAttr$3(state.attributes, "error") : null,
|
|
2307
2307
|
lastChangedAt
|
|
@@ -2366,7 +2366,7 @@ function readStringArrayAttr(attrs, key) {
|
|
|
2366
2366
|
var COLD_START$11 = {
|
|
2367
2367
|
activity: "idle",
|
|
2368
2368
|
batteryLevel: null,
|
|
2369
|
-
|
|
2369
|
+
progress: null,
|
|
2370
2370
|
currentCode: null,
|
|
2371
2371
|
currentCodeLabel: null,
|
|
2372
2372
|
severity: "info",
|
|
@@ -2396,7 +2396,7 @@ var HaLawnMowerDevice = class extends HaBaseChildDevice {
|
|
|
2396
2396
|
if (activity !== null) this.runtimeState.setCapState("lawn-mower-control", {
|
|
2397
2397
|
activity,
|
|
2398
2398
|
batteryLevel,
|
|
2399
|
-
|
|
2399
|
+
progress: readNumericAttr$1(state.attributes, "mowing_progress"),
|
|
2400
2400
|
currentCode: null,
|
|
2401
2401
|
currentCodeLabel: null,
|
|
2402
2402
|
severity: activity === "error" ? "error" : "info",
|
|
@@ -2447,8 +2447,8 @@ var COLD_START$10 = {
|
|
|
2447
2447
|
source: "",
|
|
2448
2448
|
availableSources: [],
|
|
2449
2449
|
currentMedia: null,
|
|
2450
|
-
|
|
2451
|
-
|
|
2450
|
+
position: null,
|
|
2451
|
+
duration: null,
|
|
2452
2452
|
shuffle: null,
|
|
2453
2453
|
repeat: null,
|
|
2454
2454
|
lastChangedAt: 0
|
|
@@ -2478,8 +2478,8 @@ var HaMediaPlayerDevice = class extends HaBaseChildDevice {
|
|
|
2478
2478
|
source: readStringAttr$2(attrs, "source") ?? "",
|
|
2479
2479
|
availableSources: readStringArray(attrs, "source_list"),
|
|
2480
2480
|
currentMedia: buildCurrentMedia(attrs),
|
|
2481
|
-
|
|
2482
|
-
|
|
2481
|
+
position: readDurationMs(attrs, "media_position"),
|
|
2482
|
+
duration: readDurationMs(attrs, "media_duration"),
|
|
2483
2483
|
shuffle: readBooleanAttr(attrs, "shuffle"),
|
|
2484
2484
|
repeat: readRepeat(attrs["repeat"]),
|
|
2485
2485
|
lastChangedAt
|
|
@@ -2512,7 +2512,7 @@ var HaMediaPlayerDevice = class extends HaBaseChildDevice {
|
|
|
2512
2512
|
previous: async () => {
|
|
2513
2513
|
await this.callHaService("media_player", "media_previous_track");
|
|
2514
2514
|
},
|
|
2515
|
-
seek: async ({ positionMs }) => {
|
|
2515
|
+
seek: async ({ position: positionMs }) => {
|
|
2516
2516
|
await this.callHaService("media_player", "media_seek", { seek_position: positionMs / 1e3 });
|
|
2517
2517
|
},
|
|
2518
2518
|
setVolume: async ({ volumeLevel }) => {
|
|
@@ -2681,11 +2681,17 @@ function deriveAvailableModes(attrs) {
|
|
|
2681
2681
|
}
|
|
2682
2682
|
//#endregion
|
|
2683
2683
|
//#region src/devices/ha-presence-device.ts
|
|
2684
|
+
/** No reading yet: unknown, never 0 % (D393). */
|
|
2685
|
+
var COLD_BATTERY = {
|
|
2686
|
+
level: null,
|
|
2687
|
+
charging: "unknown",
|
|
2688
|
+
sleeping: false,
|
|
2689
|
+
lastUpdated: 0
|
|
2690
|
+
};
|
|
2684
2691
|
var COLD_START$8 = {
|
|
2685
2692
|
state: "unknown",
|
|
2686
2693
|
location: null,
|
|
2687
2694
|
gps: null,
|
|
2688
|
-
batteryPercent: null,
|
|
2689
2695
|
lastChangedAt: 0
|
|
2690
2696
|
};
|
|
2691
2697
|
/**
|
|
@@ -2695,14 +2701,17 @@ var COLD_START$8 = {
|
|
|
2695
2701
|
*
|
|
2696
2702
|
* HA attributes consumed:
|
|
2697
2703
|
* - `latitude` / `longitude` / `gps_accuracy` → gps envelope
|
|
2698
|
-
* - `battery_level` →
|
|
2704
|
+
* - `battery_level` → the `battery` cap (a presence provider never reports
|
|
2705
|
+
* battery on the presence status)
|
|
2699
2706
|
* - `friendly_name` and the state value drive the `location` label
|
|
2700
2707
|
*/
|
|
2701
2708
|
var HaPresenceDevice = class extends HaBaseChildDevice {
|
|
2702
2709
|
constructor(ctx) {
|
|
2703
2710
|
super(ctx);
|
|
2704
2711
|
this.registerPresenceCap();
|
|
2712
|
+
this.registerBatteryCap();
|
|
2705
2713
|
this.runtimeState.setCapState("presence", COLD_START$8);
|
|
2714
|
+
if (this.runtimeState.getCapState("battery") === void 0) this.runtimeState.setCapState("battery", COLD_BATTERY);
|
|
2706
2715
|
}
|
|
2707
2716
|
handleStatePush(state) {
|
|
2708
2717
|
if (state.state === "unavailable") return;
|
|
@@ -2720,10 +2729,24 @@ var HaPresenceDevice = class extends HaBaseChildDevice {
|
|
|
2720
2729
|
longitude: lon,
|
|
2721
2730
|
accuracyMeters: acc ?? 0
|
|
2722
2731
|
} : null,
|
|
2723
|
-
batteryPercent: battery,
|
|
2724
2732
|
lastChangedAt
|
|
2725
2733
|
};
|
|
2726
2734
|
this.runtimeState.setCapState("presence", slice);
|
|
2735
|
+
if (battery !== null) this.runtimeState.setCapState("battery", {
|
|
2736
|
+
level: Math.min(100, Math.max(0, battery)),
|
|
2737
|
+
charging: "unknown",
|
|
2738
|
+
sleeping: false,
|
|
2739
|
+
lastUpdated: lastChangedAt
|
|
2740
|
+
});
|
|
2741
|
+
}
|
|
2742
|
+
registerBatteryCap() {
|
|
2743
|
+
this.ctx.registerNativeCap(batteryCapability, {
|
|
2744
|
+
getStatus: async () => this.runtimeState.getCapState("battery") ?? COLD_BATTERY,
|
|
2745
|
+
wakeForStream: async () => ({
|
|
2746
|
+
awoke: true,
|
|
2747
|
+
durationMs: 0
|
|
2748
|
+
})
|
|
2749
|
+
});
|
|
2727
2750
|
}
|
|
2728
2751
|
registerPresenceCap() {
|
|
2729
2752
|
this.ctx.registerNativeCap(presenceCapability, { getStatus: async () => {
|
|
@@ -3199,7 +3222,7 @@ var HaNotifierDevice = class extends HaBaseChildDevice {
|
|
|
3199
3222
|
var COLD_START$4 = { lastFetchedAt: 0 };
|
|
3200
3223
|
/**
|
|
3201
3224
|
* HA-backed power-meter sensor child. Multi-field cap — the slice
|
|
3202
|
-
* carries `
|
|
3225
|
+
* carries `power` / `voltage` / `current` / `energy` etc., but each HA
|
|
3203
3226
|
* `sensor.*` entity surfaces ONE metric (device_class = `power` /
|
|
3204
3227
|
* `voltage` / `current` / `energy`). The class populates the field
|
|
3205
3228
|
* corresponding to the entity's device_class.
|
|
@@ -3262,22 +3285,22 @@ function applyDeviceClass$1(prev, deviceClass, value, lastFetchedAt) {
|
|
|
3262
3285
|
switch (deviceClass) {
|
|
3263
3286
|
case "power": return {
|
|
3264
3287
|
...prev,
|
|
3265
|
-
|
|
3288
|
+
power: value,
|
|
3266
3289
|
lastFetchedAt
|
|
3267
3290
|
};
|
|
3268
3291
|
case "energy": return {
|
|
3269
3292
|
...prev,
|
|
3270
|
-
|
|
3293
|
+
energy: value,
|
|
3271
3294
|
lastFetchedAt
|
|
3272
3295
|
};
|
|
3273
3296
|
case "voltage": return {
|
|
3274
3297
|
...prev,
|
|
3275
|
-
|
|
3298
|
+
voltage: value,
|
|
3276
3299
|
lastFetchedAt
|
|
3277
3300
|
};
|
|
3278
3301
|
case "current": return {
|
|
3279
3302
|
...prev,
|
|
3280
|
-
|
|
3303
|
+
current: value,
|
|
3281
3304
|
lastFetchedAt
|
|
3282
3305
|
};
|
|
3283
3306
|
default: return null;
|
|
@@ -3343,12 +3366,12 @@ function applyDeviceClass(prev, deviceClass, value, lastFetchedAt) {
|
|
|
3343
3366
|
switch (deviceClass) {
|
|
3344
3367
|
case "co2": return {
|
|
3345
3368
|
...prev,
|
|
3346
|
-
|
|
3369
|
+
co2: value,
|
|
3347
3370
|
lastFetchedAt
|
|
3348
3371
|
};
|
|
3349
3372
|
case "volatile_organic_compounds": return {
|
|
3350
3373
|
...prev,
|
|
3351
|
-
|
|
3374
|
+
voc: value,
|
|
3352
3375
|
lastFetchedAt
|
|
3353
3376
|
};
|
|
3354
3377
|
case "pm25":
|
|
@@ -3853,10 +3876,10 @@ var containerEntitySchema = object({
|
|
|
3853
3876
|
dateTimeFormat: EnumSensorDateTimeFormatSchema.optional(),
|
|
3854
3877
|
entityCategory: _enum(["config", "diagnostic"]).optional(),
|
|
3855
3878
|
meterEntities: object({
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3879
|
+
power: string().optional(),
|
|
3880
|
+
energy: string().optional(),
|
|
3881
|
+
voltage: string().optional(),
|
|
3882
|
+
current: string().optional()
|
|
3860
3883
|
}).optional(),
|
|
3861
3884
|
foldedInto: string().optional()
|
|
3862
3885
|
});
|
|
@@ -4040,10 +4063,10 @@ var haEntitySchema = object({
|
|
|
4040
4063
|
entityCategory: _enum(["config", "diagnostic"]).optional(),
|
|
4041
4064
|
/** Sibling meter sensors this entity reads as its own power-meter (D951). */
|
|
4042
4065
|
meterEntities: object({
|
|
4043
|
-
|
|
4044
|
-
|
|
4045
|
-
|
|
4046
|
-
|
|
4066
|
+
power: string().optional(),
|
|
4067
|
+
energy: string().optional(),
|
|
4068
|
+
voltage: string().optional(),
|
|
4069
|
+
current: string().optional()
|
|
4047
4070
|
}).optional(),
|
|
4048
4071
|
/** Set on a meter sensor folded into another entity: sectioned as Diagnostic. */
|
|
4049
4072
|
foldedInto: string().optional()
|
|
@@ -4118,7 +4141,7 @@ function deriveBatteryStatus(entities, entityId, state, now) {
|
|
|
4118
4141
|
if (isBinaryBattery(battery)) {
|
|
4119
4142
|
if (state.state !== "on" && state.state !== "off") return null;
|
|
4120
4143
|
return {
|
|
4121
|
-
|
|
4144
|
+
level: state.state === "on" ? BINARY_BATTERY_LOW_PCT : BINARY_BATTERY_NORMAL_PCT,
|
|
4122
4145
|
charging: "none",
|
|
4123
4146
|
sleeping: false,
|
|
4124
4147
|
lastUpdated: now,
|
|
@@ -4128,7 +4151,7 @@ function deriveBatteryStatus(entities, entityId, state, now) {
|
|
|
4128
4151
|
const raw = Number(state.state);
|
|
4129
4152
|
if (!Number.isFinite(raw)) return null;
|
|
4130
4153
|
return {
|
|
4131
|
-
|
|
4154
|
+
level: Math.min(100, Math.max(0, raw)),
|
|
4132
4155
|
charging: "none",
|
|
4133
4156
|
sleeping: false,
|
|
4134
4157
|
lastUpdated: now
|
|
@@ -4185,7 +4208,7 @@ var HaContainerDevice = class HaContainerDevice extends BaseDevice {
|
|
|
4185
4208
|
this.batteryEntityId = batteryEntityId(cfg.entities);
|
|
4186
4209
|
if (this.batteryEntityId !== null) {
|
|
4187
4210
|
const COLD = {
|
|
4188
|
-
|
|
4211
|
+
level: null,
|
|
4189
4212
|
charging: "unknown",
|
|
4190
4213
|
sleeping: false,
|
|
4191
4214
|
lastUpdated: 0
|