implement cardqr

This commit is contained in:
joBr99
2023-11-19 22:00:04 +01:00
parent 21acb9115d
commit 1552374ce7
4 changed files with 69 additions and 32 deletions

View File

@@ -1,15 +0,0 @@
#!/usr/bin/env bashio
# ==============================================================================
# Take down the S6 supervision tree when example fails
# s6-overlay docs: https://github.com/just-containers/s6-overlay
# ==============================================================================
declare APP_EXIT_CODE=${1}
if [[ "${APP_EXIT_CODE}" -ne 0 ]] && [[ "${APP_EXIT_CODE}" -ne 256 ]]; then
bashio::log.warning "Halt add-on with exit code ${APP_EXIT_CODE}"
echo "${APP_EXIT_CODE}" > /run/s6-linux-init-container-results/exitcode
exec /run/s6/basedir/bin/halt
fi
bashio::log.info "Service restart after closing"

View File

@@ -0,0 +1,26 @@
#!/command/with-contenv bashio
# shellcheck shell=bash
# ==============================================================================
# Take down the S6 supervision tree when mqtt manager fails
# ==============================================================================
declare exit_code
readonly exit_code_container=$(</run/s6-linux-init-container-results/exitcode)
readonly exit_code_service="${1}"
readonly exit_code_signal="${2}"
readonly service="AppDaemon"
bashio::log.info \
"Service ${service} exited with code ${exit_code_service}" \
"(by signal ${exit_code_signal})"
if [[ "${exit_code_service}" -eq 256 ]]; then
if [[ "${exit_code_container}" -eq 0 ]]; then
echo $((128 + $exit_code_signal)) > /run/s6-linux-init-container-results/exitcode
fi
[[ "${exit_code_signal}" -eq 15 ]] && exec /run/s6/basedir/bin/halt
elif [[ "${exit_code_service}" -ne 0 ]]; then
if [[ "${exit_code_container}" -eq 0 ]]; then
echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode
fi
exec /run/s6/basedir/bin/halt
fi

View File

@@ -3,7 +3,7 @@ import ha_icons
import ha_colors import ha_colors
from libs.localization import get_translation from libs.localization import get_translation
import panel_cards import panel_cards
import logging
class HAEntity(panel_cards.Entity): class HAEntity(panel_cards.Entity):
def __init__(self, locale, config, panel): def __init__(self, locale, config, panel):
@@ -183,21 +183,23 @@ class HAEntity(panel_cards.Entity):
return f"~{entity_type_panel}~iid.{self.iid}~{icon_char}~{color}~{name}~{value}" return f"~{entity_type_panel}~iid.{self.iid}~{icon_char}~{color}~{name}~{value}"
class HACard(panel_cards.Card):
class EntitiesCard(panel_cards.Card):
def __init__(self, locale, config, panel): def __init__(self, locale, config, panel):
super().__init__(locale, config, panel) super().__init__(locale, config, panel)
# Generate Entity for each Entity in Config
self.entities = [] self.entities = []
if "entities" in config: if "entities" in config:
for e in config.get("entities"): for e in config.get("entities"):
# print(e)
iid, entity = entity_factory(locale, e, panel) iid, entity = entity_factory(locale, e, panel)
self.entities.append(entity) self.entities.append(entity)
def get_iid_entities(self): def get_iid_entities(self):
return [(e.iid, e.entity_id) for e in self.entities] return [(e.iid, e.entity_id) for e in self.entities]
def render(self): def get_entities(self):
return [e.entity_id for e in self.entities]
def gen_nav(self):
leftBtn = "delete~~~~~" leftBtn = "delete~~~~~"
if self.iid_prev: if self.iid_prev:
leftBtn = panel_cards.Entity(self.locale, leftBtn = panel_cards.Entity(self.locale,
@@ -216,11 +218,30 @@ class EntitiesCard(panel_cards.Card):
'color': [255, 255, 255], 'color': [255, 255, 255],
}, self.panel }, self.panel
).render()[1:] ).render()[1:]
result = f"{self.title}~{leftBtn}~{rightBtn}" result = f"{leftBtn}~{rightBtn}"
return result
class EntitiesCard(HACard):
def __init__(self, locale, config, panel):
super().__init__(locale, config, panel)
def render(self):
result = f"{self.title}~{self.gen_nav()}"
for e in self.entities: for e in self.entities:
result += e.render() result += e.render()
return result return result
class QRCard(HACard):
def __init__(self, locale, config, panel):
super().__init__(locale, config, panel)
self.qrcode = config.get("qrCode", "https://www.youtube.com/watch?v=dQw4w9WgXcQ")
def render(self):
# TODO: Render QRCode as HomeAssistant Template
#qrcode = apis.ha_api.render_template(qrcode)
result = f"{self.title}~{self.gen_nav()}~{self.qrcode}"
for e in self.entities:
result += e.render()
return result
class Screensaver(panel_cards.Card): class Screensaver(panel_cards.Card):
def __init__(self, locale, config, panel): def __init__(self, locale, config, panel):
@@ -239,8 +260,11 @@ def card_factory(locale, settings, panel):
match settings["type"]: match settings["type"]:
case 'cardEntities' | 'cardGrid': case 'cardEntities' | 'cardGrid':
card = EntitiesCard(locale, settings, panel) card = EntitiesCard(locale, settings, panel)
case 'cardQR':
card = QRCard(locale, settings, panel)
case _: case _:
card = panel_cards.Card(locale, settings, panel) logging.error("card type %s not implemented", settings["type"])
return "NotImplemented", None
return card.iid, card return card.iid, card

View File

@@ -29,13 +29,15 @@ class LovelaceUIPanel:
# generate cards for input settings # generate cards for input settings
for c in self.settings.get("cards"): for c in self.settings.get("cards"):
iid, card = card_factory(self.settings["locale"], c, self) iid, card = card_factory(self.settings["locale"], c, self)
self.cards[iid] = card # Check if we acually got a card
# collect nav keys of cards if card:
if card.navigate_key: self.cards[iid] = card
self.navigate_keys[card.navigate_key] = iid # collect nav keys of cards
# collect iids of entities if card.navigate_key:
for e in card.get_iid_entities(): self.navigate_keys[card.navigate_key] = iid
self.entity_iids[e[0]] = e[1] # collect iids of entities
for e in card.get_iid_entities():
self.entity_iids[e[0]] = e[1]
# setup prev and next iids # setup prev and next iids
top_level_cards = list(self.cards.values()) top_level_cards = list(self.cards.values())
@@ -92,9 +94,9 @@ class LovelaceUIPanel:
return self.hidden_cards[iid] return self.hidden_cards[iid]
def ha_event_callback(self, entity_id): def ha_event_callback(self, entity_id):
logging.debug(f"{entity_id} updated/state changed") #logging.debug(f"{entity_id} updated/state changed")
# TODO: Check if entity is on current card if entity_id in self.current_card.get_entities():
libs.panel_cmd.entityUpd(self.sendTopic, self.current_card.render()) libs.panel_cmd.entityUpd(self.sendTopic, self.current_card.render())
def customrecv_event_callback(self, msg): def customrecv_event_callback(self, msg):
logging.debug("Recv Message from NsPanel: %s", msg) logging.debug("Recv Message from NsPanel: %s", msg)