added localization fixed updater

This commit is contained in:
joBr99
2022-03-25 14:06:40 +01:00
parent 5b2d25bcd6
commit b140f33f2b
8 changed files with 132 additions and 48 deletions

View File

@@ -3,28 +3,58 @@ nspanel:
module: nspanel-lovelace-ui2 module: nspanel-lovelace-ui2
class: NsPanelLovelaceUIManager class: NsPanelLovelaceUIManager
config: config:
panelRecvTopic: "tele/tasmota_nspdebugtest/RESULT" panelRecvTopic: "tele/tasmota_your_mqtt_topic/RESULT"
panelSendTopic: "cmnd/tasmota_nspdebugtest/CustomSend" panelSendTopic: "cmnd/tasmota_your_mqtt_topic/CustomSend"
updateMode: "auto-notify"
timeoutScreensaver: 20
#brightnessScreensaver: 10
brightnessScreensaver:
- time: "7:00:00"
value: 10
- time: "23:00:00"
value: 0
locale: "de_DE" # only used if babel python package is installed
dateFormatBabel: "full" # only used if babel python package is installed
# formatting options on https://babel.pocoo.org/en/latest/dates.html?highlight=name%20of%20day#date-fields
timeFormat: "%H:%M"
dateFormat: "%A, %d. %B %Y" # ignored if babel python package is installed
buttonText: KLICKEN
sceneText: ACTIVIEREN
weatherEntity: weather.example
pages: pages:
- type: screensaver - type: cardEntities
weather: weather.k3ll3r heading: Example Page 1
items: items:
- type: cardEntities - cover.example_cover
heading: Test Entities 1 - switch.example_switch
items: - input_boolean.example_input_boolean
- switch.test_item - sensor.example_sensor
- type: cardEntities - type: cardEntities
heading: Test Entities 1 heading: Example Page 2
items: items:
- switch.test_item - button.example_button
- switch.deckenbeleuchtung_hinten - input_button.example_input_button
- switch.test_item - light.light_example
- switch.test_item - delete # (read this as 'empty')
- switch.deckenbeleuchtung_hinten - type: cardEntities
- switch.test_item heading: Example Page 3
- type: cardGrid items:
heading: Test Grid 1 - scene.example_scene
items: - delete
- switch.test_item - delete
- switch.test_item - delete
- switch.test_item - type: cardGrid
heading: Example Page 4
items:
- light.light_example
- button.example_button
- cover.example_cover
- scene.example_scene
- switch.example_switch
- delete
- type: cardThermo
heading: Exmaple Thermostat
item: climate.example_climate
- type: cardMedia
heading: Exampe Media
item: media_player.spotify_user

View File

@@ -1,8 +1,5 @@
import logging import logging
from luibackend.exceptions import LuiBackendConfigIncomplete
from luibackend.exceptions import LuiBackendConfigError
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)

View File

@@ -29,6 +29,28 @@ class LuiController(object):
# register callbacks # register callbacks
self.register_callbacks() self.register_callbacks()
self.current_screensaver_brightness = 20
# calc screensaver brightness
# set brightness of screensaver
if type(self._config.get("brightnessScreensaver")) == int:
self.current_screensaver_brightness = self._config.get("brightnessScreensaver")
elif type(self._config.get("brightnessScreensaver")) == list:
sorted_timesets = sorted(self._config.get("brightnessScreensaver"), key=lambda d: self._ha_api.parse_time(d['time']))
found_current_dim_value = False
for index, timeset in enumerate(sorted_timesets):
self._ha_api.run_daily(self.update_screensaver_brightness, timeset["time"], value=timeset["value"])
LOGGER.info("Current time %s", self._ha_api.get_now().time())
if self._ha_api.parse_time(timeset["time"]) > self._ha_api.get_now().time() and not found_current_dim_value:
# first time after current time, set dim value
self.current_screensaver_brightness = sorted_timesets[index-1]["value"]
LOGGER.info("Setting dim value to %s", sorted_timesets[index-1])
found_current_dim_value = True
# still no dim value
if not found_current_dim_value:
self.current_screensaver_brightness = sorted_timesets[-1]["value"]
# send screensaver brightness in case config has changed
self.update_screensaver_brightness(kwargs={"value": self.current_screensaver_brightness})
def startup(self): def startup(self):
LOGGER.info(f"Startup Event") LOGGER.info(f"Startup Event")
# send time and date on startup # send time and date on startup
@@ -39,6 +61,10 @@ class LuiController(object):
self._pages_gen.page_type("screensaver") self._pages_gen.page_type("screensaver")
self.weather_update("") self.weather_update("")
def update_screensaver_brightness(self, kwargs):
self.current_screensaver_brightness = kwargs['value']
self._send_mqtt_msg(f"dimmode,{self.current_screensaver_brightness}")
def weather_update(self, kwargs): def weather_update(self, kwargs):
we_name = self._config.get("weather") we_name = self._config.get("weather")
unit = "°C" unit = "°C"
@@ -48,7 +74,8 @@ class LuiController(object):
items = self._config.get_root_page().get_all_items_recursive() items = self._config.get_root_page().get_all_items_recursive()
LOGGER.info(f"Registering callbacks for the following items: {items}") LOGGER.info(f"Registering callbacks for the following items: {items}")
for item in items: for item in items:
self._ha_api.listen_state(self.state_change_callback, entity_id=item, attribute="all") if self._ha_api.entity_exists(item):
self._ha_api.listen_state(self.state_change_callback, entity_id=item, attribute="all")
def state_change_callback(self, entity, attribute, old, new, kwargs): def state_change_callback(self, entity, attribute, old, new, kwargs):
LOGGER.info(f"Got callback for: {entity}") LOGGER.info(f"Got callback for: {entity}")
@@ -71,18 +98,21 @@ class LuiController(object):
def button_press(self, entity_id, button_type, value): def button_press(self, entity_id, button_type, value):
LOGGER.debug(f"Button Press Event; entity_id: {entity_id}; button_type: {button_type}; value: {value} ") LOGGER.debug(f"Button Press Event; entity_id: {entity_id}; button_type: {button_type}; value: {value} ")
# internal buttons # internal buttons
if(entity_id == "screensaver" and button_type == "enter"): if entity_id == "screensaver" and button_type == "enter":
self._pages_gen.render_page(self._current_page) self._pages_gen.render_page(self._current_page)
if(button_type == "bExit"): if button_type == "bExit":
self._pages_gen.render_page(self._current_page) self._pages_gen.render_page(self._current_page)
if(button_type == "bNext"): if button_type == "bNext":
self._current_page = self._current_page.next() self._current_page = self._current_page.next()
self._pages_gen.render_page(self._current_page) self._pages_gen.render_page(self._current_page)
if(button_type == "bPrev"): if button_type == "bPrev":
self._current_page = self._current_page.prev() self._current_page = self._current_page.prev()
self._pages_gen.render_page(self._current_page) self._pages_gen.render_page(self._current_page)
elif entity_id == "updateDisplayNoYes" and value == "no":
self._pages_gen.render_page(self._current_page)
# buttons with actions on HA # buttons with actions on HA
if button_type == "OnOff": if button_type == "OnOff":
if value == "1": if value == "1":

View File

@@ -0,0 +1,12 @@
translations = {
'de_DE': {
'ACTIVATE': "AKTIVIEREN",
'PRESS': "DRÜCKEN",
}
}
def get_translation(locale, input):
if locale in translations:
return translations.get(locale).get(input, input)
else:
return input

View File

@@ -43,6 +43,10 @@ class LuiMqttListener(object):
entity_id = msg[2] entity_id = msg[2]
btype = msg[3] btype = msg[3]
value = msg[4] if len(msg) > 4 else None value = msg[4] if len(msg) > 4 else None
if entity_id == "updateDisplayNoYes" and value == "yes":
self._updater.update_panel_driver()
self._controller.button_press(entity_id, btype, value) self._controller.button_press(entity_id, btype, value)
if msg[1] == "pageOpenDetail": if msg[1] == "pageOpenDetail":
self._controller.detail_open(msg[2], msg[3]) self._controller.detail_open(msg[2], msg[3])

View File

@@ -4,6 +4,7 @@ import datetime
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_id_ha
from helper import scale, pos_to_color, rgb_dec565, rgb_brightness from helper import scale, pos_to_color, rgb_dec565, rgb_brightness
from localization import get_translation
# check Babel # check Babel
import importlib import importlib
@@ -18,6 +19,7 @@ class LuiPagesGen(object):
def __init__(self, ha_api, config, send_mqtt_msg): def __init__(self, ha_api, config, send_mqtt_msg):
self._ha_api = ha_api self._ha_api = ha_api
self._config = config self._config = config
self._locale = config.get("locale")
self._send_mqtt_msg = send_mqtt_msg self._send_mqtt_msg = send_mqtt_msg
def getEntityColor(self, entity): def getEntityColor(self, entity):
@@ -44,8 +46,7 @@ class LuiPagesGen(object):
global babel_spec global babel_spec
if babel_spec is not None: if babel_spec is not None:
dateformat = self._config.get("dateFormatBabel") dateformat = self._config.get("dateFormatBabel")
locale = self._config.get("locale") date = babel.dates.format_date(datetime.datetime.now(), dateformat, locale=self._locale)
date = babel.dates.format_date(datetime.datetime.now(), dateformat, locale=locale)
else: else:
dateformat = self._config.get("dateFormat") dateformat = self._config.get("dateFormat")
date = datetime.datetime.now().strftime(dateformat) date = datetime.datetime.now().strftime(dateformat)
@@ -81,8 +82,8 @@ class LuiPagesGen(object):
global babel_spec global babel_spec
if babel_spec is not None: if babel_spec is not None:
up1 = babel.dates.format_date(up1, "E", locale=self.config["locale"]) up1 = babel.dates.format_date(up1, "E", locale=self._locale)
up2 = babel.dates.format_date(up2, "E", locale=self.config["locale"]) up2 = babel.dates.format_date(up2, "E", locale=self._locale)
else: else:
up1 = up1.strftime("%a") up1 = up1.strftime("%a")
up2 = up2.strftime("%a") up2 = up2.strftime("%a")
@@ -103,7 +104,8 @@ class LuiPagesGen(object):
return f",{item_type},,,,," return f",{item_type},,,,,"
if item_type == "navigate": if item_type == "navigate":
icon_id = get_icon_id_ha("button", overwrite=icon) icon_id = get_icon_id_ha("button", overwrite=icon)
return f",button,{item},0,17299,{item},PRESS" text = get_translation(self._locale,"PRESS")
return f",button,{item},0,17299,{item},{text}"
if not self._ha_api.entity_exists(item): if not self._ha_api.entity_exists(item):
return f",text,{item},{get_icon_id('alert-circle-outline')},17299,Not found check, apps.yaml" return f",text,{item},{get_icon_id('alert-circle-outline')},17299,Not found check, apps.yaml"
# HA Entities # HA Entities
@@ -134,7 +136,8 @@ class LuiPagesGen(object):
return f",button,{item},{icon_id},17299,{name},PRESS" return f",button,{item},{icon_id},17299,{name},PRESS"
if item_type == "scene": if item_type == "scene":
icon_id = get_icon_id_ha("scene", overwrite=icon) icon_id = get_icon_id_ha("scene", overwrite=icon)
return f",button,{item},{icon_id},17299,{name},ACTIVATE" text = get_translation(self._locale,"PRESS")
return f",button,{item},{icon_id},17299,{name},{text}"
def generate_entities_page(self, heading, items): def generate_entities_page(self, heading, items):

View File

@@ -3,14 +3,15 @@ import logging
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
class Updater: class Updater:
def __init__(self, controller, mode, desired_display_firmware_version, desired_display_firmware_url, desired_tasmota_driver_version, desired_tasmota_driver_url): def __init__(self, send_mqtt_msg, topic_send, mode, desired_display_firmware_version, desired_display_firmware_url, desired_tasmota_driver_version, desired_tasmota_driver_url):
self.desired_display_firmware_version = desired_display_firmware_version self.desired_display_firmware_version = desired_display_firmware_version
self.desired_display_firmware_url = desired_display_firmware_url self.desired_display_firmware_url = desired_display_firmware_url
self.desired_tasmota_driver_version = desired_tasmota_driver_version self.desired_tasmota_driver_version = desired_tasmota_driver_version
self.desired_tasmota_driver_url = desired_tasmota_driver_url self.desired_tasmota_driver_url = desired_tasmota_driver_url
self.mode = mode self.mode = mode
self.controller = controller self._send_mqtt_msg = send_mqtt_msg
self.topic_send = topic_send
self.current_tasmota_driver_version = None self.current_tasmota_driver_version = None
self.current_display_firmware_version = None self.current_display_firmware_version = None
@@ -29,6 +30,10 @@ class Updater:
return True return True
return False return False
def send_message_page(self, id, heading, msg, b1, b2):
self._send_mqtt_msg(f"pageType,popupNotify")
self._send_mqtt_msg(f"entityUpdateDetail,|{id}|{heading}|65535|{b1}|65535|{b2}|65535|{msg}|65535|0")
def check_updates(self): def check_updates(self):
# return's true if a notification was send to the panel # return's true if a notification was send to the panel
# run pre req check # run pre req check
@@ -44,7 +49,7 @@ class Updater:
# send notification about the update # send notification about the update
if self.mode == "auto-notify": if self.mode == "auto-notify":
update_msg = "There's an update avalible for the tasmota berry driver, do you want to start the update now? If you encounter issues after the update or this message appears frequently, please checkthe manual and repeat the installation steps for the tasmota berry driver. " update_msg = "There's an update avalible for the tasmota berry driver, do you want to start the update now? If you encounter issues after the update or this message appears frequently, please checkthe manual and repeat the installation steps for the tasmota berry driver. "
self.controller._pages_gen.send_message_page("updateBerryNoYes", "Driver Update available!", update_msg, "Dismiss", "Yes") self.send_message_page("updateBerryNoYes", "Driver Update available!", update_msg, "Dismiss", "Yes")
return True return True
return False return False
# check if display firmware needs an update # check if display firmware needs an update
@@ -57,7 +62,7 @@ class Updater:
# send notification about the update # send notification about the update
if self.mode == "auto-notify": if self.mode == "auto-notify":
update_msg = "There's a firmware update avalible for the nextion sceen inside of nspanel, do you want to start the update now? If the update fails check the installation manual and flash again over the tasmota console. Be pationed the update will take a while." update_msg = "There's a firmware update avalible for the nextion sceen inside of nspanel, do you want to start the update now? If the update fails check the installation manual and flash again over the tasmota console. Be pationed the update will take a while."
self.controller._pages_gen.send_message_page("updateDisplayNoYes", "Display Update available!", update_msg, "Dismiss", "Yes") self.send_message_page("updateDisplayNoYes", "Display Update available!", update_msg, "Dismiss", "Yes")
return True return True
return False return False
else: else:
@@ -65,8 +70,8 @@ class Updater:
return False return False
def update_berry_driver(self): def update_berry_driver(self):
topic = self.controller._config["panelSendTopic"].replace("CustomSend", "UpdateDriverVersion") topic = self.topic_send.replace("CustomSend", "UpdateDriverVersion")
self.controller._send_mqtt_msg(topic, self.desired_tasmota_driver_url) self._send_mqtt_msg(self.desired_tasmota_driver_url, topic=topic)
def update_panel_driver(self): def update_panel_driver(self):
topic = self.controller._config["panelSendTopic"].replace("CustomSend", "FlashNextion") topic = self.topic_send.replace("CustomSend", "FlashNextion")
self.controller._send_mqtt_msg(topic, self.desired_display_firmware_url) self._send_mqtt_msg(self.desired_display_firmware_url, topic=topic)

View File

@@ -56,9 +56,11 @@ class NsPanelLovelaceUIManager(hass.Hass):
cfg = self._cfg = LuiBackendConfig(self.args["config"]) cfg = self._cfg = LuiBackendConfig(self.args["config"])
topic_send = cfg.get("panelSendTopic") topic_send = cfg.get("panelSendTopic")
def send_mqtt_msg(msg): def send_mqtt_msg(msg, topic=None):
if topic is None:
topic = topic_send
LOGGER.info(f"Sending MQTT Message: {msg}") LOGGER.info(f"Sending MQTT Message: {msg}")
mqtt_api.mqtt_publish(topic_send, msg) mqtt_api.mqtt_publish(topic, msg)
# Request Tasmota Driver Version # Request Tasmota Driver Version
mqtt_api.mqtt_publish(topic_send.replace("CustomSend", "GetDriverVersion"), "x") mqtt_api.mqtt_publish(topic_send.replace("CustomSend", "GetDriverVersion"), "x")
@@ -71,7 +73,8 @@ class NsPanelLovelaceUIManager(hass.Hass):
desired_tasmota_driver_url = "https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be" desired_tasmota_driver_url = "https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be"
mode = cfg.get("updateMode") mode = cfg.get("updateMode")
updater = Updater(controller, mode, desired_display_firmware_version, desired_display_firmware_url, desired_tasmota_driver_version, desired_tasmota_driver_url) topic_send = cfg.get("panelSendTopic")
updater = Updater(send_mqtt_msg, topic_send, mode, desired_display_firmware_version, desired_display_firmware_url, desired_tasmota_driver_version, desired_tasmota_driver_url)
topic_recv = cfg.get("panelRecvTopic") topic_recv = cfg.get("panelRecvTopic")
mqtt_listener = LuiMqttListener(mqtt_api, topic_recv, controller, updater) mqtt_listener = LuiMqttListener(mqtt_api, topic_recv, controller, updater)