From d88670034a7c272ec0b9ad545eff173a03f9a09c Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Wed, 29 May 2024 05:32:22 -0700 Subject: [PATCH] Filter unrecorded entities from history panel (#19621) * Filter unrecorded entities from history panel * cache result * Cache excluded entities instead of recorded entities --- src/data/recorder.ts | 30 ++++++++++++++++++++++++++ src/panels/history/ha-panel-history.ts | 23 +++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/data/recorder.ts b/src/data/recorder.ts index 23b63a6d1c..e43a221e95 100644 --- a/src/data/recorder.ts +++ b/src/data/recorder.ts @@ -12,6 +12,14 @@ export interface RecorderInfo { thread_running: boolean; } +export interface RecordedEntities { + entity_ids: string[]; +} +export interface RecordedExcludedEntities { + recorded_ids: string[]; + excluded_ids: string[]; +} + export type StatisticType = "change" | "state" | "sum" | "min" | "max" | "mean"; export interface Statistics { @@ -324,3 +332,25 @@ export const getDisplayUnit = ( export const isExternalStatistic = (statisticsId: string): boolean => statisticsId.includes(":"); + +let recordedExcludedEntitiesCache: RecordedExcludedEntities | undefined; + +export const getRecordedExcludedEntities = async ( + hass: HomeAssistant +): Promise => { + if (recordedExcludedEntitiesCache) { + return recordedExcludedEntitiesCache; + } + const recordedEntities = await hass.callWS({ + type: "recorder/recorded_entities", + }); + + recordedExcludedEntitiesCache = { + recorded_ids: recordedEntities.entity_ids, + excluded_ids: Object.keys(hass.states).filter( + (id) => !recordedEntities.entity_ids.includes(id) + ), + }; + + return recordedExcludedEntitiesCache; +}; diff --git a/src/panels/history/ha-panel-history.ts b/src/panels/history/ha-panel-history.ts index 1f9f60073e..eef935aa4d 100644 --- a/src/panels/history/ha-panel-history.ts +++ b/src/panels/history/ha-panel-history.ts @@ -6,6 +6,7 @@ import { } from "@mdi/js"; import { ActionDetail } from "@material/mwc-list"; import { differenceInHours } from "date-fns"; +import { HassEntity } from "home-assistant-js-websocket"; import { HassServiceTarget, UnsubscribeFunc, @@ -45,7 +46,11 @@ import { computeHistory, subscribeHistory, } from "../../data/history"; -import { Statistics, fetchStatistics } from "../../data/recorder"; +import { + fetchStatistics, + Statistics, + getRecordedExcludedEntities, +} from "../../data/recorder"; import { expandAreaTarget, expandDeviceTarget, @@ -95,6 +100,8 @@ class HaPanelHistory extends LitElement { private _interval?: number; + private _excludedEntities?: string[]; + public constructor() { super(); @@ -185,6 +192,7 @@ class HaPanelHistory extends LitElement { .hass=${this.hass} .value=${this._targetPickerValue} .disabled=${this._isLoading} + .entityFilter=${this._entityFilter} addOnTop @value-changed=${this._targetsChanged} > @@ -211,6 +219,10 @@ class HaPanelHistory extends LitElement { `; } + private _entityFilter = (entity: HassEntity): boolean => + !this._excludedEntities || + !this._excludedEntities.includes(entity.entity_id); + private mergeHistoryResults( ltsResult: HistoryResult, historyResult: HistoryResult @@ -362,8 +374,17 @@ class HaPanelHistory extends LitElement { } } + private async _getRecordedExcludedEntities() { + const { recorded_ids: _recordedIds, excluded_ids: excludedIds } = + await getRecordedExcludedEntities(this.hass); + this._excludedEntities = excludedIds; + } + protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); + + this._getRecordedExcludedEntities(); + const searchParams = extractSearchParamsObject(); if (searchParams.back === "1" && history.length > 1) { this._showBack = true;