From f70ffa168c4b07c19d46b60efdf742ebb16a4fd8 Mon Sep 17 00:00:00 2001 From: joBr99 <29555657+joBr99@users.noreply.github.com> Date: Sat, 1 Oct 2022 00:10:01 +0200 Subject: [PATCH] implement ha: alias for icons #464 (#492) implements a new icon type that can be used to display home assistant templates --- HMI/code_gen/icons/icons.py | 5 +++ .../luibackend/icon_mapping.py | 4 ++ apps/nspanel-lovelace-ui/luibackend/icons.py | 5 +-- apps/nspanel-lovelace-ui/luibackend/pages.py | 42 +++++++++---------- docs/entities.md | 10 +++++ 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/HMI/code_gen/icons/icons.py b/HMI/code_gen/icons/icons.py index c67c4236..ed66d044 100644 --- a/HMI/code_gen/icons/icons.py +++ b/HMI/code_gen/icons/icons.py @@ -18,7 +18,12 @@ with open(os.path.join(__location__, "../../../apps/nspanel-lovelace-ui/luibacke f.write(f" '{name}': '{iconchar}',\n") f.write("}\n") f.write(""" +import apis def get_icon_id(ma_name): + if "text:" in ma_name: + return ma_name.replace("text:","") + if "ha:" in ma_name: + return apis.ha_api.render_template(ma_name.replace("ha:","")) ma_name = ma_name.replace("mdi:","") if ma_name in icons: return icons[ma_name] diff --git a/apps/nspanel-lovelace-ui/luibackend/icon_mapping.py b/apps/nspanel-lovelace-ui/luibackend/icon_mapping.py index 232c8190..487b8801 100644 --- a/apps/nspanel-lovelace-ui/luibackend/icon_mapping.py +++ b/apps/nspanel-lovelace-ui/luibackend/icon_mapping.py @@ -6897,9 +6897,13 @@ icons = { 'zodiac-virgo': '', } +import apis + def get_icon_id(ma_name): if "text:" in ma_name: return ma_name.replace("text:","") + if "ha:" in ma_name: + return apis.ha_api.render_template(ma_name.replace("ha:","")) ma_name = ma_name.replace("mdi:","") if ma_name in icons: return icons[ma_name] diff --git a/apps/nspanel-lovelace-ui/luibackend/icons.py b/apps/nspanel-lovelace-ui/luibackend/icons.py index 715ca703..52ad9f20 100644 --- a/apps/nspanel-lovelace-ui/luibackend/icons.py +++ b/apps/nspanel-lovelace-ui/luibackend/icons.py @@ -195,7 +195,7 @@ def map_to_mdi_name(ha_type, state=None, device_class="_", cardType=None): else: return "alert-circle-outline" -def get_icon_id_ha(ha_type, state=None, device_class=None, overwrite=None): +def get_icon(ha_type, state=None, device_class=None, overwrite=None): if overwrite is not None: if type(overwrite) is str: return get_icon_id(overwrite) @@ -203,10 +203,9 @@ def get_icon_id_ha(ha_type, state=None, device_class=None, overwrite=None): for overwrite_state, overwrite_icon in overwrite.items(): if overwrite_state == state: return get_icon_id(overwrite_icon) - return get_icon_id(map_to_mdi_name(ha_type, state, device_class)) -def get_action_id_ha(ha_type, action, device_class=None, overwrite=None): +def get_action_icon(ha_type, action, device_class=None, overwrite=None): if overwrite is not None: return get_icon_id(overwrite) if ha_type == "cover": diff --git a/apps/nspanel-lovelace-ui/luibackend/pages.py b/apps/nspanel-lovelace-ui/luibackend/pages.py index 17fab42b..250b4432 100644 --- a/apps/nspanel-lovelace-ui/luibackend/pages.py +++ b/apps/nspanel-lovelace-ui/luibackend/pages.py @@ -5,8 +5,8 @@ import apis from theme import get_screensaver_color_output from icon_mapping import get_icon_id -from icons import get_icon_id_ha -from icons import get_action_id_ha +from icons import get_icon +from icons import get_action_icon from helper import scale, rgb_dec565, rgb_brightness, get_attr_safe, convert_temperature from localization import get_translation @@ -94,7 +94,7 @@ class LuiPagesGen(object): apis.ha_api.error(f"Skipping Weather Update, entity {we_name} not found") return - icon_cur = get_icon_id_ha("weather", state=we.state) + icon_cur = get_icon("weather", state=we.state) state["tMainIcon"] = we.state text_cur = convert_temperature(we.attributes.temperature, unit) @@ -121,7 +121,7 @@ class LuiPagesGen(object): up = up.strftime('%H:%M') else: up = up.strftime('%a') - icon = get_icon_id_ha("weather", state=we.attributes.forecast[fid]['condition']) + icon = get_icon("weather", state=we.attributes.forecast[fid]['condition']) if i == 1: state["tF1Icon"] = we.attributes.forecast[fid]['condition'] elif i == 2: @@ -141,7 +141,7 @@ class LuiPagesGen(object): name = wOF.get("name") entity = apis.ha_api.get_entity(wOF.get("entity")) up = name if name is not None else entity.attributes.friendly_name - icon = get_icon_id_ha("sensor", state=entity.state, device_class=entity.attributes.get("device_class", ""), overwrite=icon) + icon = get_icon("sensor", state=entity.state, device_class=entity.attributes.get("device_class", ""), overwrite=icon) if "color" in wOF: if theme is None: theme = {} @@ -175,7 +175,7 @@ class LuiPagesGen(object): icon = statusIcon.get("icon") entity = apis.ha_api.get_entity(statusIcon.get("entity")) entityType = statusIcon.get("entity").split(".")[0] - icon = get_icon_id_ha(entityType, state=entity.state, device_class=entity.attributes.get("device_class", ""), overwrite=icon) + icon = get_icon(entityType, state=entity.state, device_class=entity.attributes.get("device_class", ""), overwrite=icon) color = self.get_entity_color(entity, overwrite=statusIcon.get("color", None)) status_res += f"~{icon}~{color}" @@ -203,13 +203,13 @@ class LuiPagesGen(object): if entityType == "navigate": page_search_res = self._config.searchCard(entityId) if page_search_res is not None: - icon_res = get_icon_id_ha("navigate", overwrite=icon) + icon_res = get_icon("navigate", overwrite=icon) status_entity = None name = name if name is not None else page_search_res.title text = get_translation(self._locale, "frontend.ui.card.button.press") if item.status is not None and apis.ha_api.entity_exists(item.status): status_entity = apis.ha_api.get_entity(item.status) - icon_res = get_icon_id_ha(item.status.split(".")[0], state=status_entity.state, device_class=status_entity.attributes.get("device_class", "_"), overwrite=icon) + icon_res = get_icon(item.status.split(".")[0], state=status_entity.state, device_class=status_entity.attributes.get("device_class", "_"), overwrite=icon) icon_color = self.get_entity_color(status_entity, ha_type=item.status.split(".")[0], overwrite=colorOverride) if item.status.startswith("sensor") and cardType == "cardGrid": icon_res = status_entity.state[:4] @@ -226,12 +226,12 @@ class LuiPagesGen(object): icon_res = get_icon_id(icon) if icon is not None else get_icon_id("alert-circle-outline") return f"~text~{entityId}~{icon_res}~17299~{name}~{value}" if entityType == "service": - icon_id = get_icon_id_ha("script", overwrite=icon) + icon_id = get_icon("script", overwrite=icon) text = get_translation(self._locale, "frontend.ui.card.script.run") icon_color = 17299 if item.status is not None and apis.ha_api.entity_exists(item.status): status_entity = apis.ha_api.get_entity(item.status) - icon_id = get_icon_id_ha(item.status.split(".")[0], state=status_entity.state, device_class=status_entity.attributes.get("device_class", "_"), overwrite=icon) + icon_id = get_icon(item.status.split(".")[0], state=status_entity.state, device_class=status_entity.attributes.get("device_class", "_"), overwrite=icon) icon_color = self.get_entity_color(status_entity, ha_type=item.status.split(".")[0], overwrite=colorOverride) if item.status.startswith("sensor") and cardType == "cardGrid": icon_id = status_entity.state[:4] @@ -251,7 +251,7 @@ class LuiPagesGen(object): # common res vars entityTypePanel = "text" - icon_id = get_icon_id_ha(entityType, state=entity.state, overwrite=icon) + icon_id = get_icon(entityType, state=entity.state, overwrite=icon) color = self.get_entity_color(entity, overwrite=colorOverride) value = "" name = name if name is not None else entity.attributes.get("friendly_name","unknown") @@ -259,7 +259,7 @@ class LuiPagesGen(object): if entityType == "cover": entityTypePanel = "shutter" device_class = entity.attributes.get("device_class", "window") - icon_id = get_icon_id_ha(ha_type=entityType, state=entity.state, device_class=device_class, overwrite=icon) + icon_id = get_icon(ha_type=entityType, state=entity.state, device_class=device_class, overwrite=icon) icon_up = "" icon_stop = "" icon_down = "" @@ -276,13 +276,13 @@ class LuiPagesGen(object): if bits & 0b00000001: # SUPPORT_OPEN if ( pos != 100 and not (entity.state == "open" and pos == "disable") ) or item.assumedState: icon_up_status = "enable" - icon_up = get_action_id_ha(ha_type=entityType, action="open", device_class=device_class) + icon_up = get_action_icon(ha_type=entityType, action="open", device_class=device_class) if bits & 0b00000010: # SUPPORT_CLOSE if ( pos != 0 and not (entity.state == "closed" and pos == "disable") ) or item.assumedState: icon_down_status = "enable" - icon_down = get_action_id_ha(ha_type=entityType, action="close", device_class=device_class) + icon_down = get_action_icon(ha_type=entityType, action="close", device_class=device_class) if bits & 0b00001000: # SUPPORT_STOP - icon_stop = get_action_id_ha(ha_type=entityType, action="stop", device_class=device_class) + icon_stop = get_action_icon(ha_type=entityType, action="stop", device_class=device_class) icon_stop_status = "enable" value = f"{icon_up}|{icon_stop}|{icon_down}|{icon_up_status}|{icon_stop_status}|{icon_down_status}" elif entityType in "light": @@ -306,7 +306,7 @@ class LuiPagesGen(object): if icon_id[-1] == ".": icon_id = icon_id[:-1] else: - icon_id = get_icon_id_ha(entityType, state=entity.state, device_class=device_class, overwrite=icon) + icon_id = get_icon(entityType, state=entity.state, device_class=device_class, overwrite=icon) elif entityType in ["button", "input_button"]: entityTypePanel = "button" value = get_translation(self._locale, "frontend.ui.card.button.press") @@ -537,7 +537,7 @@ class LuiPagesGen(object): add_btn=f"{get_icon_id('progress-alert')}~{rgb_dec565([243,179,0])}~" if alarmBtn is not None and type(alarmBtn) is dict: entity = alarmBtn.get("entity") - iconnav = get_icon_id_ha("alarm-arm-fail", overwrite=alarmBtn.get("icon")) + iconnav = get_icon("alarm-arm-fail", overwrite=alarmBtn.get("icon")) status = alarmBtn.get("status") if status is not None and apis.ha_api.entity_exists(status): icon_color = self.get_entity_color(apis.ha_api.get_entity(status)) @@ -653,7 +653,7 @@ class LuiPagesGen(object): entity = apis.ha_api.get_entity(entity_id) entityType="cover" device_class = entity.attributes.get("device_class", "window") - icon_id = get_icon_id_ha(entityType, state=entity.state, device_class=device_class) + icon_id = get_icon(entityType, state=entity.state, device_class=device_class) pos = entity.attributes.get("current_position") if pos is None: @@ -686,14 +686,14 @@ class LuiPagesGen(object): if bits & 0b00000001: # SUPPORT_OPEN if ( pos != 100 and not (entity.state == "open" and pos == "disable") ): icon_up_status = "enable" - icon_up = get_action_id_ha(ha_type=entityType, action="open", device_class=device_class) + icon_up = get_action_icon(ha_type=entityType, action="open", device_class=device_class) if bits & 0b00000010: # SUPPORT_CLOSE if ( pos != 0 and not (entity.state == "closed" and pos == "disable") ): icon_down_status = "enable" - icon_down = get_action_id_ha(ha_type=entityType, action="close", device_class=device_class) + icon_down = get_action_icon(ha_type=entityType, action="close", device_class=device_class) #if bits & 0b00000100: # SUPPORT_SET_POSITION if bits & 0b00001000: # SUPPORT_STOP - icon_stop = get_action_id_ha(ha_type=entityType, action="stop", device_class=device_class) + icon_stop = get_action_icon(ha_type=entityType, action="stop", device_class=device_class) icon_stop_status = "enable" # tilt supported diff --git a/docs/entities.md b/docs/entities.md index 8c90d0a0..feab3cec 100644 --- a/docs/entities.md +++ b/docs/entities.md @@ -53,6 +53,16 @@ It is also possible to use text instead of icons with `text:X` "off": "text:" ``` +To insert dynamic values from a homeassistant template, like a temperature you can also use `ha:` which will be rendered as homeassistant template. +There probably not much cases where this is needed, but here is an exmaple to show the current temperature on the status icon of the screensaver: + +```yaml + statusIcon2: + entity: climate.wohnzimmer_boden + icon: 'ha:{{ state_attr("climate.wohnzimmer_boden","current_temperature")}}' +``` + + ## Hide item based on state This sensor will only be shown on the card if it's state is equal to `off`