From 7665e67820a9b51d6c87f0dfd8aab403cadcdd41 Mon Sep 17 00:00:00 2001 From: Piotr Machowski Date: Fri, 31 Mar 2023 02:18:07 +0200 Subject: [PATCH] Added possibility to use dynamic tile icon --- src/model/generators/tiles-generator.ts | 2 +- src/renderers/tile-renderer.ts | 13 +++++++++++-- src/types/types.ts | 1 + src/utils.ts | 3 +++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/model/generators/tiles-generator.ts b/src/model/generators/tiles-generator.ts index 3502adc9..353df039 100644 --- a/src/model/generators/tiles-generator.ts +++ b/src/model/generators/tiles-generator.ts @@ -118,7 +118,7 @@ export class TilesGenerator { entity: vacuumEntity, label: localize("tile.battery_level.label", language), attribute: "battery_level", - icon: state.attributes["battery_icon"], + icon_source: `${vacuumEntity}.attributes.battery_icon`, unit: "%", }); if ("battery_level" in state.attributes && !("battery_icon" in state.attributes)) diff --git a/src/renderers/tile-renderer.ts b/src/renderers/tile-renderer.ts index f9d14358..6b46842d 100644 --- a/src/renderers/tile-renderer.ts +++ b/src/renderers/tile-renderer.ts @@ -21,7 +21,7 @@ export class TileRenderer { const stateObj = config.entity ? card.hass.states[config.entity] : undefined; const title = this.getTileLabel(card.hass, config, stateObj); const value = this.getTileValue(card.hass, config, internalVariables, stateObj); - const icon = this.getIcon(config, stateObj); + const icon = this.getIcon(card.hass, config, stateObj); const domain = stateObj ? computeStateDomain(stateObj) : undefined; return html` @@ -100,7 +100,16 @@ export class TileRenderer { return `${value}${unit}`; } - private static getIcon(config: TileConfig, stateObject?: HassEntity) { + private static getIcon(hass: HomeAssistantFixed, config: TileConfig, stateObject?: HassEntity) { + if (config.icon_source) { + const split = config.icon_source.split(".attributes."); + const entity = hass.states[split[0]]; + let icon = entity.state; + if (split.length === 2) { + icon = entity.attributes[split[1]]; + } + return icon; + } if (config.icon === undefined && stateObject) { return stateObject.attributes.icon ?? null; } diff --git a/src/types/types.ts b/src/types/types.ts index eda5d58f..e2ca41b2 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -124,6 +124,7 @@ export interface TileConfig extends ActionableObjectConfig, ConditionalObjectCon readonly label?: string; readonly tooltip?: string; readonly icon?: string; + readonly icon_source?: string; readonly internal_variable?: string; readonly entity?: string; readonly attribute?: string; diff --git a/src/utils.ts b/src/utils.ts index b00e74c5..7180d737 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -83,6 +83,9 @@ export function getWatchedEntitiesForPreset(config: CardPresetConfig, language: (config.tiles ?? []).forEach(s => { if (s.entity) watchedEntities.add(s.entity); }); + (config.tiles ?? []).forEach(s => { + if (s.icon_source) watchedEntities.add(s.icon_source.split(".attributes.")[0]); + }); (config.tiles ?? []) .filter(s => s.conditions) .flatMap(s => s.conditions)