Add status functionality for non-entities (#645)

* Add status functionality for non-entities

I wanted to show services on `cardGrid` pages conditionally, using the
`state` and `state_not` options and based on a `status` entity.
The documentation looked as if this was possible, however it didn't work
due to the order of evaluation.

This change makes it possible to hide any item using `state` /
`state_not`, based on either the `entity` itself or the information
provided by the `status` entity.

This basically implements #483, I think.

* Use if/then/else instead of and/or expression evaluation rules

This improves the readability of the code for people not familiar with
the evaluation of and / or expressions.

Co-authored-by: Daniel Albert <esclear@users.noreply.github.com>
This commit is contained in:
Daniel Albert
2022-12-29 09:50:52 +01:00
committed by GitHub
parent 61e7438128
commit 0ee8120eed

View File

@@ -213,8 +213,23 @@ class LuiPagesGen(object):
uuid = item.uuid uuid = item.uuid
# type of the item is the string before the "." in the entityId # type of the item is the string before the "." in the entityId
entityType = entityId.split(".")[0] entityType = entityId.split(".")[0]
apis.ha_api.log(f"Generating item for {entityId} with type {entityType}", level="DEBUG") apis.ha_api.log(f"Generating item for {entityId} with type {entityType}", level="DEBUG")
status_entity = apis.ha_api.get_entity(item.status) if item.status and apis.ha_api.entity_exists(item.status) else None
status_state = status_entity.state if status_entity is not None else None
entity = apis.ha_api.get_entity(entityId) if apis.ha_api.entity_exists(entityId) else None
entity_state = entity.state if entity is not None else None
state = status_state if status_state is not None else entity_state
if state is not None:
if item.condState is not None and item.condState != state:
return ""
if item.condStateNot is not None and item.condStateNot == state:
return ""
# Internal types # Internal types
if entityType == "delete": if entityType == "delete":
return f"~{entityType}~~~~~" return f"~{entityType}~~~~~"
@@ -222,11 +237,9 @@ class LuiPagesGen(object):
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_ha(entityId, overwrite=icon) icon_res = get_icon_ha(entityId, overwrite=icon)
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 status_entity:
status_entity = apis.ha_api.get_entity(item.status)
icon_res = get_icon_ha(item.status, overwrite=icon) icon_res = get_icon_ha(item.status, 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":
@@ -249,8 +262,7 @@ class LuiPagesGen(object):
icon_id = get_icon("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 = icon_color = rgb_dec565(colorOverride) if colorOverride is not None and type(colorOverride) is list else 17299 icon_color = icon_color = rgb_dec565(colorOverride) if colorOverride is not None and type(colorOverride) is list else 17299
if item.status is not None and apis.ha_api.entity_exists(item.status): if status_entity:
status_entity = apis.ha_api.get_entity(item.status)
icon_id = get_icon_ha(item.status, overwrite=icon) icon_id = get_icon_ha(item.status, 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":
@@ -258,17 +270,12 @@ class LuiPagesGen(object):
if icon_id[-1] == ".": if icon_id[-1] == ".":
icon_id = icon_id[:-1] icon_id = icon_id[:-1]
return f"~button~{uuid}~{icon_id}~{icon_color}~{name}~{text}" return f"~button~{uuid}~{icon_id}~{icon_color}~{name}~{text}"
if not apis.ha_api.entity_exists(entityId):
if entity is None:
return f"~text~{entityId}~{get_icon_id('alert-circle-outline')}~17299~Not found check~ apps.yaml" return f"~text~{entityId}~{get_icon_id('alert-circle-outline')}~17299~Not found check~ apps.yaml"
# HA Entities # HA Entities
entity = apis.ha_api.get_entity(entityId)
# check state for if a condition is defined
if item.condState is not None and item.condState != entity.state:
return ""
if item.condStateNot is not None and item.condStateNot == entity.state:
return ""
# common res vars # common res vars
entityTypePanel = "text" entityTypePanel = "text"
icon_id = get_icon_ha(entityId, overwrite=icon) icon_id = get_icon_ha(entityId, overwrite=icon)