Fix incorrect state display being cached (#2356)

* Fix incorrect state display being cached

* Remove test for cache
This commit is contained in:
Paulus Schoutsen 2018-12-19 13:05:39 +01:00 committed by GitHub
parent 0a2eaec884
commit 49fa74cc07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 76 additions and 111 deletions

View File

@ -5,46 +5,40 @@ import formatDate from "../datetime/format_date";
import formatTime from "../datetime/format_time"; import formatTime from "../datetime/format_time";
import { LocalizeFunc } from "../../mixins/localize-base-mixin"; import { LocalizeFunc } from "../../mixins/localize-base-mixin";
type CachedDisplayEntity = HassEntity & { export default (
_stateDisplay?: string;
};
export default function computeStateDisplay(
localize: LocalizeFunc, localize: LocalizeFunc,
stateObj: HassEntity, stateObj: HassEntity,
language: string language: string
) { ): string => {
const state = stateObj as CachedDisplayEntity; let display: string | undefined;
if (!state._stateDisplay) { const domain = computeStateDomain(stateObj);
const domain = computeStateDomain(state);
if (domain === "binary_sensor") { if (domain === "binary_sensor") {
// Try device class translation, then default binary sensor translation // Try device class translation, then default binary sensor translation
if (state.attributes.device_class) { if (stateObj.attributes.device_class) {
state._stateDisplay = localize( display = localize(
`state.${domain}.${state.attributes.device_class}.${state.state}` `state.${domain}.${stateObj.attributes.device_class}.${stateObj.state}`
); );
} }
if (!state._stateDisplay) {
state._stateDisplay = localize( if (!display) {
`state.${domain}.default.${state.state}` display = localize(`state.${domain}.default.${stateObj.state}`);
);
} }
} else if ( } else if (
state.attributes.unit_of_measurement && stateObj.attributes.unit_of_measurement &&
!["unknown", "unavailable"].includes(state.state) !["unknown", "unavailable"].includes(stateObj.state)
) { ) {
state._stateDisplay = display = stateObj.state + " " + stateObj.attributes.unit_of_measurement;
state.state + " " + state.attributes.unit_of_measurement;
} else if (domain === "input_datetime") { } else if (domain === "input_datetime") {
let date: Date; let date: Date;
if (!state.attributes.has_time) { if (!stateObj.attributes.has_time) {
date = new Date( date = new Date(
state.attributes.year, stateObj.attributes.year,
state.attributes.month - 1, stateObj.attributes.month - 1,
state.attributes.day stateObj.attributes.day
); );
state._stateDisplay = formatDate(date, language); display = formatDate(date, language);
} else if (!state.attributes.has_date) { } else if (!stateObj.attributes.has_date) {
const now = new Date(); const now = new Date();
date = new Date( date = new Date(
// Due to bugs.chromium.org/p/chromium/issues/detail?id=797548 // Due to bugs.chromium.org/p/chromium/issues/detail?id=797548
@ -52,40 +46,41 @@ export default function computeStateDisplay(
now.getFullYear(), now.getFullYear(),
now.getMonth(), now.getMonth(),
now.getDay(), now.getDay(),
state.attributes.hour, stateObj.attributes.hour,
state.attributes.minute stateObj.attributes.minute
); );
state._stateDisplay = formatTime(date, language); display = formatTime(date, language);
} else { } else {
date = new Date( date = new Date(
state.attributes.year, stateObj.attributes.year,
state.attributes.month - 1, stateObj.attributes.month - 1,
state.attributes.day, stateObj.attributes.day,
state.attributes.hour, stateObj.attributes.hour,
state.attributes.minute stateObj.attributes.minute
); );
state._stateDisplay = formatDateTime(date, language); display = formatDateTime(date, language);
} }
} else if (domain === "zwave") { } else if (domain === "zwave") {
if (["initializing", "dead"].includes(state.state)) { if (["initializing", "dead"].includes(stateObj.state)) {
state._stateDisplay = localize( display = localize(
`state.zwave.query_stage.${state.state}`, `state.zwave.query_stage.${stateObj.state}`,
"query_stage", "query_stage",
state.attributes.query_stage stateObj.attributes.query_stage
); );
} else { } else {
state._stateDisplay = localize(`state.zwave.default.${state.state}`); display = localize(`state.zwave.default.${stateObj.state}`);
} }
} else { } else {
state._stateDisplay = localize(`state.${domain}.${state.state}`); display = localize(`state.${domain}.${stateObj.state}`);
}
// Fall back to default, component backend translation, or raw state if nothing else matches.
state._stateDisplay =
state._stateDisplay ||
localize(`state.default.${state.state}`) ||
localize(`component.${domain}.state.${state.state}`) ||
state.state;
} }
return state._stateDisplay; // Fall back to default, component backend translation, or raw state if nothing else matches.
} if (!display) {
display =
localize(`state.default.${stateObj.state}`) ||
localize(`component.${domain}.state.${stateObj.state}`) ||
stateObj.state;
}
return display;
};

View File

@ -1,18 +1,6 @@
import { HassEntity } from "home-assistant-js-websocket"; import { HassEntity } from "home-assistant-js-websocket";
import computeObjectId from "./compute_object_id"; import computeObjectId from "./compute_object_id";
type CachedDisplayEntity = HassEntity & { export default (stateObj: HassEntity): string =>
_entityDisplay?: string; stateObj.attributes.friendly_name ||
}; computeObjectId(stateObj.entity_id).replace(/_/g, " ");
export default function computeStateName(stateObj: HassEntity) {
const state = stateObj as CachedDisplayEntity;
if (state._entityDisplay === undefined) {
state._entityDisplay =
state.attributes.friendly_name ||
computeObjectId(state.entity_id).replace(/_/g, " ");
}
return state._entityDisplay;
}

View File

@ -258,22 +258,4 @@ describe("computeStateDisplay", () => {
"My Custom State" "My Custom State"
); );
}); });
it("Only calculates state display once per immutable state object", () => {
const stateObj: any = {
entity_id: "cover.test",
state: "open",
attributes: {},
};
assert.strictEqual(
computeStateDisplay(localize, stateObj, "en"),
"state.cover.open"
);
stateObj.state = "closing";
assert.strictEqual(
computeStateDisplay(localize, stateObj, "en"),
"state.cover.open"
);
});
}); });