mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-25 10:16:46 +00:00
Format sensors with state class duration (#12426)
This commit is contained in:
parent
876fd9e85a
commit
145e5d7bc6
16
src/common/datetime/duration.ts
Normal file
16
src/common/datetime/duration.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import secondsToDuration from "./seconds_to_duration";
|
||||||
|
|
||||||
|
const DAY_IN_SECONDS = 86400;
|
||||||
|
const HOUR_IN_SECONDS = 3600;
|
||||||
|
const MINUTE_IN_SECONDS = 60;
|
||||||
|
|
||||||
|
export const UNIT_TO_SECOND_CONVERT = {
|
||||||
|
s: 1,
|
||||||
|
min: MINUTE_IN_SECONDS,
|
||||||
|
h: HOUR_IN_SECONDS,
|
||||||
|
d: DAY_IN_SECONDS,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const formatDuration = (duration: string, units: string): string =>
|
||||||
|
secondsToDuration(parseFloat(duration) * UNIT_TO_SECOND_CONVERT[units]) ||
|
||||||
|
"0";
|
@ -13,6 +13,7 @@ import { formatNumber, isNumericState } from "../number/format_number";
|
|||||||
import { LocalizeFunc } from "../translations/localize";
|
import { LocalizeFunc } from "../translations/localize";
|
||||||
import { computeStateDomain } from "./compute_state_domain";
|
import { computeStateDomain } from "./compute_state_domain";
|
||||||
import { supportsFeature } from "./supports-feature";
|
import { supportsFeature } from "./supports-feature";
|
||||||
|
import { formatDuration, UNIT_TO_SECOND_CONVERT } from "../datetime/duration";
|
||||||
|
|
||||||
export const computeStateDisplay = (
|
export const computeStateDisplay = (
|
||||||
localize: LocalizeFunc,
|
localize: LocalizeFunc,
|
||||||
@ -28,6 +29,21 @@ export const computeStateDisplay = (
|
|||||||
|
|
||||||
// Entities with a `unit_of_measurement` or `state_class` are numeric values and should use `formatNumber`
|
// Entities with a `unit_of_measurement` or `state_class` are numeric values and should use `formatNumber`
|
||||||
if (isNumericState(stateObj)) {
|
if (isNumericState(stateObj)) {
|
||||||
|
// state is duration
|
||||||
|
if (
|
||||||
|
stateObj.attributes.device_class === "duration" &&
|
||||||
|
stateObj.attributes.unit_of_measurement &&
|
||||||
|
UNIT_TO_SECOND_CONVERT[stateObj.attributes.unit_of_measurement]
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
return formatDuration(
|
||||||
|
compareState,
|
||||||
|
stateObj.attributes.unit_of_measurement
|
||||||
|
);
|
||||||
|
} catch (_err) {
|
||||||
|
// fallback to default
|
||||||
|
}
|
||||||
|
}
|
||||||
if (stateObj.attributes.device_class === "monetary") {
|
if (stateObj.attributes.device_class === "monetary") {
|
||||||
try {
|
try {
|
||||||
return formatNumber(compareState, locale, {
|
return formatNumber(compareState, locale, {
|
||||||
|
34
test/common/datetime/duration.ts
Normal file
34
test/common/datetime/duration.ts
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import { assert } from "chai";
|
||||||
|
|
||||||
|
import { formatDuration } from "../../../src/common/datetime/duration";
|
||||||
|
|
||||||
|
describe("formatDuration", () => {
|
||||||
|
it("works", () => {
|
||||||
|
assert.strictEqual(formatDuration("0", "s"), "0");
|
||||||
|
assert.strictEqual(formatDuration("65", "s"), "1:05");
|
||||||
|
assert.strictEqual(formatDuration("3665", "s"), "1:01:05");
|
||||||
|
assert.strictEqual(formatDuration("39665", "s"), "11:01:05");
|
||||||
|
assert.strictEqual(formatDuration("932093", "s"), "258:54:53");
|
||||||
|
|
||||||
|
assert.strictEqual(formatDuration("0", "min"), "0");
|
||||||
|
assert.strictEqual(formatDuration("65", "min"), "1:05:00");
|
||||||
|
assert.strictEqual(formatDuration("3665", "min"), "61:05:00");
|
||||||
|
assert.strictEqual(formatDuration("39665", "min"), "661:05:00");
|
||||||
|
assert.strictEqual(formatDuration("932093", "min"), "15534:53:00");
|
||||||
|
assert.strictEqual(formatDuration("12.4", "min"), "12:24");
|
||||||
|
|
||||||
|
assert.strictEqual(formatDuration("0", "h"), "0");
|
||||||
|
assert.strictEqual(formatDuration("65", "h"), "65:00:00");
|
||||||
|
assert.strictEqual(formatDuration("3665", "h"), "3665:00:00");
|
||||||
|
assert.strictEqual(formatDuration("39665", "h"), "39665:00:00");
|
||||||
|
assert.strictEqual(formatDuration("932093", "h"), "932093:00:00");
|
||||||
|
assert.strictEqual(formatDuration("24.3", "h"), "24:18:00");
|
||||||
|
assert.strictEqual(formatDuration("24.32423", "h"), "24:19:27");
|
||||||
|
|
||||||
|
assert.strictEqual(formatDuration("0", "d"), "0");
|
||||||
|
assert.strictEqual(formatDuration("65", "d"), "1560:00:00");
|
||||||
|
assert.strictEqual(formatDuration("3665", "d"), "87960:00:00");
|
||||||
|
assert.strictEqual(formatDuration("39665", "d"), "951960:00:00");
|
||||||
|
assert.strictEqual(formatDuration("932093", "d"), "22370232:00:00");
|
||||||
|
});
|
||||||
|
});
|
@ -8,5 +8,6 @@ describe("secondsToDuration", () => {
|
|||||||
assert.strictEqual(secondsToDuration(65), "1:05");
|
assert.strictEqual(secondsToDuration(65), "1:05");
|
||||||
assert.strictEqual(secondsToDuration(3665), "1:01:05");
|
assert.strictEqual(secondsToDuration(3665), "1:01:05");
|
||||||
assert.strictEqual(secondsToDuration(39665), "11:01:05");
|
assert.strictEqual(secondsToDuration(39665), "11:01:05");
|
||||||
|
assert.strictEqual(secondsToDuration(932093), "258:54:53");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user