From 96fbbc55e1f997d7099bd1ecafa49e31a9166592 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 4 Dec 2023 12:06:26 +0100 Subject: [PATCH] Make history split by device class option in history card (#18871) --- src/data/history.ts | 18 ++++++++++++------ src/panels/history/ha-panel-history.ts | 16 ++++++++++------ .../lovelace/cards/hui-history-graph-card.ts | 3 ++- src/panels/lovelace/cards/types.ts | 1 + 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/data/history.ts b/src/data/history.ts index 8f1750c14d..a110c8c634 100644 --- a/src/data/history.ts +++ b/src/data/history.ts @@ -420,7 +420,8 @@ export const computeHistory = ( hass: HomeAssistant, stateHistory: HistoryStates, localize: LocalizeFunc, - sensorNumericalDeviceClasses: string[] + sensorNumericalDeviceClasses: string[], + splitDeviceClasses = false ): HistoryResult => { const lineChartDevices: { [unit: string]: HistoryStates } = {}; const timelineDevices: TimelineEntity[] = []; @@ -473,7 +474,7 @@ export const computeHistory = ( currentState?.attributes || numericStateFromHistory?.a )?.device_class; - const key = computeGroupKey(unit, deviceClass); + const key = computeGroupKey(unit, deviceClass, splitDeviceClasses); if (!unit) { timelineDevices.push( @@ -487,9 +488,13 @@ export const computeHistory = ( currentState ) ); - } else if (key in lineChartDevices && entityId in lineChartDevices[key]) { + } else if ( + key && + key in lineChartDevices && + entityId in lineChartDevices[key] + ) { lineChartDevices[key][entityId].push(...stateInfo); - } else { + } else if (key) { if (!(key in lineChartDevices)) { lineChartDevices[key] = {}; } @@ -514,5 +519,6 @@ export const computeHistory = ( export const computeGroupKey = ( unit: string | undefined, - device_class: string | undefined -) => `${unit}_${device_class || ""}`; + device_class: string | undefined, + splitDeviceClasses: boolean +) => (splitDeviceClasses ? `${unit}_${device_class || ""}` : unit); diff --git a/src/panels/history/ha-panel-history.ts b/src/panels/history/ha-panel-history.ts index 8dad9205a6..5701645320 100644 --- a/src/panels/history/ha-panel-history.ts +++ b/src/panels/history/ha-panel-history.ts @@ -224,17 +224,19 @@ class HaPanelHistory extends SubscribeMixin(LitElement) { const keys = new Set( historyResult.line - .map((i) => computeGroupKey(i.unit, i.device_class)) + .map((i) => computeGroupKey(i.unit, i.device_class, true)) .concat( - ltsResult.line.map((i) => computeGroupKey(i.unit, i.device_class)) + ltsResult.line.map((i) => + computeGroupKey(i.unit, i.device_class, true) + ) ) ); keys.forEach((key) => { const historyItem = historyResult.line.find( - (i) => computeGroupKey(i.unit, i.device_class) === key + (i) => computeGroupKey(i.unit, i.device_class, true) === key ); const ltsItem = ltsResult.line.find( - (i) => computeGroupKey(i.unit, i.device_class) === key + (i) => computeGroupKey(i.unit, i.device_class, true) === key ); if (historyItem && ltsItem) { const newLineItem: LineChartUnit = { ...historyItem, data: [] }; @@ -410,7 +412,8 @@ class HaPanelHistory extends SubscribeMixin(LitElement) { this.hass, statsHistoryStates, this.hass.localize, - sensorNumericDeviceClasses + sensorNumericDeviceClasses, + true ); // remap states array to statistics array (this._statisticsHistory?.line || []).forEach((item) => { @@ -460,7 +463,8 @@ class HaPanelHistory extends SubscribeMixin(LitElement) { this.hass, history, this.hass.localize, - sensorNumericDeviceClasses + sensorNumericDeviceClasses, + true ); }, this._startDate, diff --git a/src/panels/lovelace/cards/hui-history-graph-card.ts b/src/panels/lovelace/cards/hui-history-graph-card.ts index 5546c3d7c9..b79da32bb6 100644 --- a/src/panels/lovelace/cards/hui-history-graph-card.ts +++ b/src/panels/lovelace/cards/hui-history-graph-card.ts @@ -118,7 +118,8 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { this.hass!, combinedHistory, this.hass!.localize, - sensorNumericDeviceClasses + sensorNumericDeviceClasses, + this._config?.split_device_classes ); }, this._hoursToShow, diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index a282682936..0b4b6f0463 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -323,6 +323,7 @@ export interface HistoryGraphCardConfig extends LovelaceCardConfig { title?: string; show_names?: boolean; logarithmic_scale?: boolean; + split_device_classes?: boolean; } export interface StatisticsGraphCardConfig extends LovelaceCardConfig {