implement ha: alias for icons #464 (#492)

implements a new icon type that can be used to display home assistant templates
This commit is contained in:
joBr99
2022-10-01 00:10:01 +02:00
committed by GitHub
parent 32e58e5fe3
commit f70ffa168c
5 changed files with 42 additions and 24 deletions

View File

@@ -18,7 +18,12 @@ with open(os.path.join(__location__, "../../../apps/nspanel-lovelace-ui/luibacke
f.write(f" '{name}': '{iconchar}',\n") f.write(f" '{name}': '{iconchar}',\n")
f.write("}\n") f.write("}\n")
f.write(""" f.write("""
import apis
def get_icon_id(ma_name): 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:","") ma_name = ma_name.replace("mdi:","")
if ma_name in icons: if ma_name in icons:
return icons[ma_name] return icons[ma_name]

View File

@@ -6897,9 +6897,13 @@ icons = {
'zodiac-virgo': '', 'zodiac-virgo': '',
} }
import apis
def get_icon_id(ma_name): def get_icon_id(ma_name):
if "text:" in ma_name: if "text:" in ma_name:
return ma_name.replace("text:","") 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:","") ma_name = ma_name.replace("mdi:","")
if ma_name in icons: if ma_name in icons:
return icons[ma_name] return icons[ma_name]

View File

@@ -195,7 +195,7 @@ def map_to_mdi_name(ha_type, state=None, device_class="_", cardType=None):
else: else:
return "alert-circle-outline" 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 overwrite is not None:
if type(overwrite) is str: if type(overwrite) is str:
return get_icon_id(overwrite) 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(): for overwrite_state, overwrite_icon in overwrite.items():
if overwrite_state == state: if overwrite_state == state:
return get_icon_id(overwrite_icon) return get_icon_id(overwrite_icon)
return get_icon_id(map_to_mdi_name(ha_type, state, device_class)) 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: if overwrite is not None:
return get_icon_id(overwrite) return get_icon_id(overwrite)
if ha_type == "cover": if ha_type == "cover":

View File

@@ -5,8 +5,8 @@ import apis
from theme import get_screensaver_color_output from theme import get_screensaver_color_output
from icon_mapping import get_icon_id from icon_mapping import get_icon_id
from icons import get_icon_id_ha from icons import get_icon
from icons import get_action_id_ha from icons import get_action_icon
from helper import scale, rgb_dec565, rgb_brightness, get_attr_safe, convert_temperature from helper import scale, rgb_dec565, rgb_brightness, get_attr_safe, convert_temperature
from localization import get_translation 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") apis.ha_api.error(f"Skipping Weather Update, entity {we_name} not found")
return return
icon_cur = get_icon_id_ha("weather", state=we.state) icon_cur = get_icon("weather", state=we.state)
state["tMainIcon"] = we.state state["tMainIcon"] = we.state
text_cur = convert_temperature(we.attributes.temperature, unit) text_cur = convert_temperature(we.attributes.temperature, unit)
@@ -121,7 +121,7 @@ class LuiPagesGen(object):
up = up.strftime('%H:%M') up = up.strftime('%H:%M')
else: else:
up = up.strftime('%a') 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: if i == 1:
state["tF1Icon"] = we.attributes.forecast[fid]['condition'] state["tF1Icon"] = we.attributes.forecast[fid]['condition']
elif i == 2: elif i == 2:
@@ -141,7 +141,7 @@ class LuiPagesGen(object):
name = wOF.get("name") name = wOF.get("name")
entity = apis.ha_api.get_entity(wOF.get("entity")) entity = apis.ha_api.get_entity(wOF.get("entity"))
up = name if name is not None else entity.attributes.friendly_name 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 "color" in wOF:
if theme is None: if theme is None:
theme = {} theme = {}
@@ -175,7 +175,7 @@ class LuiPagesGen(object):
icon = statusIcon.get("icon") icon = statusIcon.get("icon")
entity = apis.ha_api.get_entity(statusIcon.get("entity")) entity = apis.ha_api.get_entity(statusIcon.get("entity"))
entityType = statusIcon.get("entity").split(".")[0] 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)) color = self.get_entity_color(entity, overwrite=statusIcon.get("color", None))
status_res += f"~{icon}~{color}" status_res += f"~{icon}~{color}"
@@ -203,13 +203,13 @@ class LuiPagesGen(object):
if entityType == "navigate": if entityType == "navigate":
page_search_res = self._config.searchCard(entityId) page_search_res = self._config.searchCard(entityId)
if page_search_res is not None: 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 status_entity = None
name = name if name is not None else page_search_res.title name = name if name is not None else page_search_res.title
text = get_translation(self._locale, "frontend.ui.card.button.press") text = get_translation(self._locale, "frontend.ui.card.button.press")
if item.status is not None and apis.ha_api.entity_exists(item.status): if item.status is not None and apis.ha_api.entity_exists(item.status):
status_entity = apis.ha_api.get_entity(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) icon_color = self.get_entity_color(status_entity, ha_type=item.status.split(".")[0], overwrite=colorOverride)
if item.status.startswith("sensor") and cardType == "cardGrid": if item.status.startswith("sensor") and cardType == "cardGrid":
icon_res = status_entity.state[:4] 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") 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}" return f"~text~{entityId}~{icon_res}~17299~{name}~{value}"
if entityType == "service": 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") text = get_translation(self._locale, "frontend.ui.card.script.run")
icon_color = 17299 icon_color = 17299
if item.status is not None and apis.ha_api.entity_exists(item.status): if item.status is not None and apis.ha_api.entity_exists(item.status):
status_entity = apis.ha_api.get_entity(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) icon_color = self.get_entity_color(status_entity, ha_type=item.status.split(".")[0], overwrite=colorOverride)
if item.status.startswith("sensor") and cardType == "cardGrid": if item.status.startswith("sensor") and cardType == "cardGrid":
icon_id = status_entity.state[:4] icon_id = status_entity.state[:4]
@@ -251,7 +251,7 @@ class LuiPagesGen(object):
# common res vars # common res vars
entityTypePanel = "text" 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) color = self.get_entity_color(entity, overwrite=colorOverride)
value = "" value = ""
name = name if name is not None else entity.attributes.get("friendly_name","unknown") name = name if name is not None else entity.attributes.get("friendly_name","unknown")
@@ -259,7 +259,7 @@ class LuiPagesGen(object):
if entityType == "cover": if entityType == "cover":
entityTypePanel = "shutter" entityTypePanel = "shutter"
device_class = entity.attributes.get("device_class", "window") 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_up = ""
icon_stop = "" icon_stop = ""
icon_down = "" icon_down = ""
@@ -276,13 +276,13 @@ class LuiPagesGen(object):
if bits & 0b00000001: # SUPPORT_OPEN if bits & 0b00000001: # SUPPORT_OPEN
if ( pos != 100 and not (entity.state == "open" and pos == "disable") ) or item.assumedState: if ( pos != 100 and not (entity.state == "open" and pos == "disable") ) or item.assumedState:
icon_up_status = "enable" 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 bits & 0b00000010: # SUPPORT_CLOSE
if ( pos != 0 and not (entity.state == "closed" and pos == "disable") ) or item.assumedState: if ( pos != 0 and not (entity.state == "closed" and pos == "disable") ) or item.assumedState:
icon_down_status = "enable" 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 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" icon_stop_status = "enable"
value = f"{icon_up}|{icon_stop}|{icon_down}|{icon_up_status}|{icon_stop_status}|{icon_down_status}" value = f"{icon_up}|{icon_stop}|{icon_down}|{icon_up_status}|{icon_stop_status}|{icon_down_status}"
elif entityType in "light": elif entityType in "light":
@@ -306,7 +306,7 @@ class LuiPagesGen(object):
if icon_id[-1] == ".": if icon_id[-1] == ".":
icon_id = icon_id[:-1] icon_id = icon_id[:-1]
else: 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"]: elif entityType in ["button", "input_button"]:
entityTypePanel = "button" entityTypePanel = "button"
value = get_translation(self._locale, "frontend.ui.card.button.press") 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])}~" add_btn=f"{get_icon_id('progress-alert')}~{rgb_dec565([243,179,0])}~"
if alarmBtn is not None and type(alarmBtn) is dict: if alarmBtn is not None and type(alarmBtn) is dict:
entity = alarmBtn.get("entity") 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") status = alarmBtn.get("status")
if status is not None and apis.ha_api.entity_exists(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)) 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) entity = apis.ha_api.get_entity(entity_id)
entityType="cover" entityType="cover"
device_class = entity.attributes.get("device_class", "window") 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") pos = entity.attributes.get("current_position")
if pos is None: if pos is None:
@@ -686,14 +686,14 @@ class LuiPagesGen(object):
if bits & 0b00000001: # SUPPORT_OPEN if bits & 0b00000001: # SUPPORT_OPEN
if ( pos != 100 and not (entity.state == "open" and pos == "disable") ): if ( pos != 100 and not (entity.state == "open" and pos == "disable") ):
icon_up_status = "enable" 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 bits & 0b00000010: # SUPPORT_CLOSE
if ( pos != 0 and not (entity.state == "closed" and pos == "disable") ): if ( pos != 0 and not (entity.state == "closed" and pos == "disable") ):
icon_down_status = "enable" 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 & 0b00000100: # SUPPORT_SET_POSITION
if bits & 0b00001000: # SUPPORT_STOP 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" icon_stop_status = "enable"
# tilt supported # tilt supported

View File

@@ -53,6 +53,16 @@ It is also possible to use text instead of icons with `text:X`
"off": "text:" "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 ## Hide item based on state
This sensor will only be shown on the card if it's state is equal to `off` This sensor will only be shown on the card if it's state is equal to `off`