From 814cd4a2954a22efb9c8b55326014aa9c6d16e4e Mon Sep 17 00:00:00 2001 From: Johannes Date: Sat, 26 Mar 2022 13:44:48 +0100 Subject: [PATCH] implements #78 --- README.md | 1 + apps/nspanel-lovelace-ui/luibackend/config.py | 1 + .../luibackend/controller.py | 60 ++++++++++++------- 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 0879351d..0a1c2708 100644 --- a/README.md +++ b/README.md @@ -316,6 +316,7 @@ key | optional | type | default | description `panelSendTopic` | False | string | `cmnd/tasmota_your_mqtt_topic/CustomSend` | The mqtt topic used to send messages. `timeoutScreensaver` | True | integer | `20` | Timeout for the screen to enter screensaver, to disable screensaver use 0 `brightnessScreensaver` | True | integer/complex | `20` | Brightness for the screen to enter screensaver, see example below for complex/scheduled config. +`brightnessScreensaverTracking` | True | string | None | Forces screensaver brightness to 0 in case entity state is not_home, can be a group, person or device_tracker entity. `locale` | True | string | `en_US` | Used by babel to determinante Date format on screensaver, also used for localization. `dateFormatBabel` | True | string | `full` | formatting options on https://babel.pocoo.org/en/latest/dates.html?highlight=name%20of%20day#date-fields `timeFormat` | True | string | `%H:%M` | Time Format on screensaver. Substring after `?` is displayed in a seperate smaller textbox. Useful for 12h time format with AM/PM `"%I:%M ?%p"` diff --git a/apps/nspanel-lovelace-ui/luibackend/config.py b/apps/nspanel-lovelace-ui/luibackend/config.py index b0d9a3bc..fc2b5153 100644 --- a/apps/nspanel-lovelace-ui/luibackend/config.py +++ b/apps/nspanel-lovelace-ui/luibackend/config.py @@ -96,6 +96,7 @@ class LuiBackendConfig(object): 'updateMode': "auto-notify", 'timeoutScreensaver': 20, 'brightnessScreensaver': 20, + 'brightnessScreensaverTracking': None, 'locale': "en_US", 'timeFormat': "%H:%M", 'dateFormatBabel': "full", diff --git a/apps/nspanel-lovelace-ui/luibackend/controller.py b/apps/nspanel-lovelace-ui/luibackend/controller.py index defe5d09..3f9d6888 100644 --- a/apps/nspanel-lovelace-ui/luibackend/controller.py +++ b/apps/nspanel-lovelace-ui/luibackend/controller.py @@ -24,33 +24,26 @@ class LuiController(object): # time update callback time = datetime.time(0, 0, 0) ha_api.run_minutely(self._pages_gen.update_time, time) + # weather callback weather_interval = 15 * 60 # 15 minutes ha_api.run_every(self.weather_update, "now", weather_interval) + # 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): + # register callbacks for each time + if type(self._config.get("brightnessScreensaver")) == list: + for index, timeset in enumerate(self._config.get("brightnessScreensaver")): 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}) + + # calculate current brightness + self.current_screensaver_brightness = self.calc_current_screensaver_brightness() + + # call update_screensaver_brightness on changes of entity configured in brightnessScreensaverTracking + bst = self._config.get("brightnessScreensaverTracking") + if bst is not None and self._ha_api.entity_exists(bst): + self._ha_api.listen_state(self.update_screensaver_brightness, entity_id=bst, value=self.current_screensaver_brightness) def startup(self): LOGGER.info(f"Startup Event") @@ -70,9 +63,34 @@ class LuiController(object): self.weather_update("") def update_screensaver_brightness(self, kwargs): - self.current_screensaver_brightness = kwargs['value'] + bst = self._config.get("brightnessScreensaverTracking") + if bst is not None and self._ha_api.entity_exists(bst) and self._ha_api.get_entity(bst).state == "not_home": + self.current_screensaver_brightness = 0 + else: + self.current_screensaver_brightness = kwargs['value'] self._send_mqtt_msg(f"dimmode,{self.current_screensaver_brightness}") + def calc_current_screensaver_brightness(self): + current_screensaver_brightness = 20 + # set brightness of screensaver + if type(self._config.get("brightnessScreensaver")) == int: + 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'])) + # calc current screensaver brightness + found_current_dim_value = False + for index, timeset in enumerate(sorted_timesets): + 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 + 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"] + return current_screensaver_brightness + def weather_update(self, kwargs): we_name = self._config.get("weather") unit = "°C"