diff --git a/ioBroker/NsPanelTs.ts b/ioBroker/NsPanelTs.ts index bde220a3..45f0d09d 100644 --- a/ioBroker/NsPanelTs.ts +++ b/ioBroker/NsPanelTs.ts @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------- -TypeScript v4.3.3.29 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @Sternmiere / @Britzelpuf / @ravenS0ne +TypeScript v4.3.3.30 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @Sternmiere / @Britzelpuf / @ravenS0ne /@ticaki - abgestimmt auf TFT 53 / v4.3.3 / BerryDriver 9 / Tasmota 13.3.0 @joBr99 Projekt: https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker NsPanelTs.ts (dieses TypeScript in ioBroker) Stable: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/NsPanelTs.ts @@ -90,6 +90,7 @@ ReleaseNotes: - 30.12.2023 - v4.3.3.28 Add MQTT-Client Check - 02.01.2024 - v4.3.3.29 Add Tasmota Buzzer for NotifyPage - 02.02.2024 - v4.3.3.29 Fix ThermoPage -> UnSubScribsWatcher + - 02.02.2024 - v4.3.3.30 Add stronger config type checks Todo: - XX.XX.XXXX - v5.0.0 Change the bottomScreensaverEntity (rolling) if more than 6 entries are defined @@ -394,33 +395,33 @@ let Debug: boolean = false; */ //Level 0 (if service pages are used with cardUnlock) -let Unlock_Service = +let Unlock_Service: PageType = { 'type': 'cardUnlock', 'heading': findLocaleServMenu('service_pages'), 'useColor': true, - 'items': [{ id: 'alias.0.NSPanel.Unlock', + 'items': [/*PageItem*/{ id: 'alias.0.NSPanel.Unlock', targetPage: 'NSPanel_Service_SubPage', autoCreateALias: true } ] }; //Level_0 (if service pages are used without cardUnlock) -let NSPanel_Service = +let NSPanel_Service: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('service_menu'), 'useColor': true, 'items': [ - { navigate: true, id: 'NSPanel_Infos', icon: 'information-outline', offColor: Menu, onColor: Menu, name: findLocaleServMenu('infos'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_Einstellungen', icon: 'monitor-edit', offColor: Menu, onColor: Menu, name: findLocaleServMenu('settings'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_Firmware', icon: 'update', offColor: Menu, onColor: Menu, name: findLocaleServMenu('firmware'), buttonText: findLocaleServMenu('more')}, - { id: AliasPath + 'Config.rebootNSPanel', name: findLocaleServMenu('reboot') ,icon: 'refresh', offColor: MSRed, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Infos', icon: 'information-outline', offColor: Menu, onColor: Menu, name: findLocaleServMenu('infos'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Einstellungen', icon: 'monitor-edit', offColor: Menu, onColor: Menu, name: findLocaleServMenu('settings'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Firmware', icon: 'update', offColor: Menu, onColor: Menu, name: findLocaleServMenu('firmware'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ id: AliasPath + 'Config.rebootNSPanel', name: findLocaleServMenu('reboot') ,icon: 'refresh', offColor: MSRed, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, ] }; //Level_0 (if service pages are used with cardUnlock) -let NSPanel_Service_SubPage = +let NSPanel_Service_SubPage: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('service_menu'), @@ -429,15 +430,15 @@ let NSPanel_Service_SubPage = 'parent': Unlock_Service, 'home': 'Unlock_Service', 'items': [ - { navigate: true, id: 'NSPanel_Infos', icon: 'information-outline', offColor: Menu, onColor: Menu, name: findLocaleServMenu('infos'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_Einstellungen', icon: 'monitor-edit', offColor: Menu, onColor: Menu, name: findLocaleServMenu('settings'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_Firmware', icon: 'update', offColor: Menu, onColor: Menu, name: findLocaleServMenu('firmware'), buttonText: findLocaleServMenu('more')}, - { id: AliasPath + 'Config.rebootNSPanel', name: findLocaleServMenu('reboot') ,icon: 'refresh', offColor: MSRed, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Infos', icon: 'information-outline', offColor: Menu, onColor: Menu, name: findLocaleServMenu('infos'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Einstellungen', icon: 'monitor-edit', offColor: Menu, onColor: Menu, name: findLocaleServMenu('settings'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Firmware', icon: 'update', offColor: Menu, onColor: Menu, name: findLocaleServMenu('firmware'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ id: AliasPath + 'Config.rebootNSPanel', name: findLocaleServMenu('reboot') ,icon: 'refresh', offColor: MSRed, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, ] }; //Level_1 - let NSPanel_Infos = + let NSPanel_Infos: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('nspanel_infos'), @@ -446,14 +447,14 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Service, 'home': 'NSPanel_Service', 'items': [ - { navigate: true, id: 'NSPanel_Wifi_Info_1', icon: 'wifi', offColor: Menu, onColor: Menu, name: findLocaleServMenu('wifi'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_Sensoren', icon: 'memory', offColor: Menu, onColor: Menu, name: findLocaleServMenu('sensors_hardware'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_IoBroker', icon: 'information-outline', offColor: Menu, onColor: Menu, name: findLocaleServMenu('info_iobroker'), buttonText: findLocaleServMenu('more')}, - { id: AliasPath + 'Config.Update.UpdateMessage', name: findLocaleServMenu('update_message') ,icon: 'message-alert-outline', offColor: HMIOff, onColor: MSGreen}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Wifi_Info_1', icon: 'wifi', offColor: Menu, onColor: Menu, name: findLocaleServMenu('wifi'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Sensoren', icon: 'memory', offColor: Menu, onColor: Menu, name: findLocaleServMenu('sensors_hardware'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_IoBroker', icon: 'information-outline', offColor: Menu, onColor: Menu, name: findLocaleServMenu('info_iobroker'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ id: AliasPath + 'Config.Update.UpdateMessage', name: findLocaleServMenu('update_message') ,icon: 'message-alert-outline', offColor: HMIOff, onColor: MSGreen}, ] }; //Level_2 - let NSPanel_Wifi_Info_1 = + let NSPanel_Wifi_Info_1: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('nspanel_wifi1'), @@ -462,14 +463,14 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Infos, 'next': 'NSPanel_Wifi_Info_2', 'items': [ - { id: AliasPath + 'ipAddress', name: findLocaleServMenu('ip_address'), icon: 'ip-network-outline', offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Tasmota.Wifi.BSSId', name: findLocaleServMenu('mac_address'), icon: 'check-network', offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Tasmota.Wifi.RSSI', name: findLocaleServMenu('rssi'), icon: 'signal', unit: '%', colorScale: {'val_min': 100, 'val_max': 0} }, - { id: AliasPath + 'Tasmota.Wifi.Signal', name: findLocaleServMenu('wifi_signal'), icon: 'signal-distance-variant', unit: 'dBm', colorScale: {'val_min': 0, 'val_max': -100} }, + /*PageItem*/{ id: AliasPath + 'ipAddress', name: findLocaleServMenu('ip_address'), icon: 'ip-network-outline', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Wifi.BSSId', name: findLocaleServMenu('mac_address'), icon: 'check-network', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Wifi.RSSI', name: findLocaleServMenu('rssi'), icon: 'signal', unit: '%', colorScale: {'val_min': 100, 'val_max': 0} }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Wifi.Signal', name: findLocaleServMenu('wifi_signal'), icon: 'signal-distance-variant', unit: 'dBm', colorScale: {'val_min': 0, 'val_max': -100} }, ] }; - let NSPanel_Wifi_Info_2 = + let NSPanel_Wifi_Info_2: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('nspanel_wifi2'), @@ -478,14 +479,14 @@ let NSPanel_Service_SubPage = 'prev': 'NSPanel_Wifi_Info_1', 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Tasmota.Wifi.SSId', name: findLocaleServMenu('ssid'), icon: 'signal-distance-variant', offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Tasmota.Wifi.Mode', name: findLocaleServMenu('mode'), icon: 'signal-distance-variant', offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Tasmota.Wifi.Channel', name: findLocaleServMenu('channel'), icon: 'timeline-clock-outline', offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Tasmota.Wifi.AP', name: findLocaleServMenu('accesspoint'), icon: 'router-wireless-settings', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Wifi.SSId', name: findLocaleServMenu('ssid'), icon: 'signal-distance-variant', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Wifi.Mode', name: findLocaleServMenu('mode'), icon: 'signal-distance-variant', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Wifi.Channel', name: findLocaleServMenu('channel'), icon: 'timeline-clock-outline', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Wifi.AP', name: findLocaleServMenu('accesspoint'), icon: 'router-wireless-settings', offColor: Menu, onColor: Menu }, ] }; - let NSPanel_Sensoren = + let NSPanel_Sensoren: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('sensors1'), @@ -494,14 +495,14 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Infos, 'next': 'NSPanel_Hardware', 'items': [ - { id: AliasPath + 'Sensor.ANALOG.Temperature', name: findLocaleServMenu('room_temperature'), icon: 'home-thermometer-outline', unit: '°C', colorScale: {'val_min': 0, 'val_max': 40, 'val_best': 22 } }, - { id: AliasPath + 'Sensor.ESP32.Temperature', name: findLocaleServMenu('esp_temperature'), icon: 'thermometer', unit: '°C', colorScale: {'val_min': 0, 'val_max': 100, 'val_best': 50 } }, - { id: AliasPath + 'Sensor.TempUnit', name: findLocaleServMenu('temperature_unit'), icon: 'temperature-celsius', offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Sensor.Time', name: findLocaleServMenu('refresh'), icon: 'clock-check-outline', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Sensor.ANALOG.Temperature', name: findLocaleServMenu('room_temperature'), icon: 'home-thermometer-outline', unit: '°C', colorScale: {'val_min': 0, 'val_max': 40, 'val_best': 22 } }, + /*PageItem*/{ id: AliasPath + 'Sensor.ESP32.Temperature', name: findLocaleServMenu('esp_temperature'), icon: 'thermometer', unit: '°C', colorScale: {'val_min': 0, 'val_max': 100, 'val_best': 50 } }, + /*PageItem*/{ id: AliasPath + 'Sensor.TempUnit', name: findLocaleServMenu('temperature_unit'), icon: 'temperature-celsius', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Sensor.Time', name: findLocaleServMenu('refresh'), icon: 'clock-check-outline', offColor: Menu, onColor: Menu }, ] }; - let NSPanel_Hardware = + let NSPanel_Hardware: PageEntities = { 'type': 'cardEntities', 'heading': findLocaleServMenu('hardware2'), @@ -510,14 +511,14 @@ let NSPanel_Service_SubPage = 'prev': 'NSPanel_Sensoren', 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Tasmota.Product', name: findLocaleServMenu('product'), icon: 'devices', offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Tasmota.Hardware', name: findLocaleServMenu('esp32_hardware'), icon: 'memory', offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Display.Model', name: findLocaleServMenu('nspanel_version'), offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Tasmota.Uptime', name: findLocaleServMenu('operating_time'), icon: 'timeline-clock-outline', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Product', name: findLocaleServMenu('product'), icon: 'devices', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Hardware', name: findLocaleServMenu('esp32_hardware'), icon: 'memory', offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Display.Model', name: findLocaleServMenu('nspanel_version'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota.Uptime', name: findLocaleServMenu('operating_time'), icon: 'timeline-clock-outline', offColor: Menu, onColor: Menu }, ] }; - let NSPanel_IoBroker = + let NSPanel_IoBroker: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('info_iobroker'), @@ -526,14 +527,14 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Infos, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'IoBroker.ScriptVersion', name: findLocaleServMenu('script_version_nspanelts'), offColor: Menu, onColor: Menu }, - { id: AliasPath + 'IoBroker.NodeJSVersion', name: findLocaleServMenu('nodejs_version'), offColor: Menu, onColor: Menu }, - { id: AliasPath + 'IoBroker.JavaScriptVersion', name: findLocaleServMenu('instance_javascript'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'IoBroker.ScriptVersion', name: findLocaleServMenu('script_version_nspanelts'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'IoBroker.NodeJSVersion', name: findLocaleServMenu('nodejs_version'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'IoBroker.JavaScriptVersion', name: findLocaleServMenu('instance_javascript'), offColor: Menu, onColor: Menu }, ] }; //Level_1 - let NSPanel_Einstellungen = + let NSPanel_Einstellungen: PageType = { 'type': 'cardGrid', 'heading': findLocaleServMenu('settings'), @@ -542,20 +543,20 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Service, 'home': 'NSPanel_Service', 'items': [ - { navigate: true, id: 'NSPanel_Screensaver', icon: 'monitor-dashboard',offColor: Menu, onColor: Menu, name: findLocaleServMenu('screensaver'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_Relays', icon: 'electric-switch', offColor: Menu, onColor: Menu, name: findLocaleServMenu('relays'), buttonText: findLocaleServMenu('more')}, - { id:AliasPath + 'Config.temperatureUnitNumber', icon: 'gesture-double-tap', name: findLocaleServMenu('temp_unit'), offColor: Menu, onColor: Menu, + /*PageItem*/{ navigate: true, id: 'NSPanel_Screensaver', icon: 'monitor-dashboard',offColor: Menu, onColor: Menu, name: findLocaleServMenu('screensaver'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Relays', icon: 'electric-switch', offColor: Menu, onColor: Menu, name: findLocaleServMenu('relays'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ id:AliasPath + 'Config.temperatureUnitNumber', icon: 'gesture-double-tap', name: findLocaleServMenu('temp_unit'), offColor: Menu, onColor: Menu, modeList: ['°C', '°F', 'K']}, - { id: AliasPath + 'Config.localeNumber', icon: 'select-place', name: findLocaleServMenu('language'), offColor: Menu, onColor: Menu, + /*PageItem*/{ id: AliasPath + 'Config.localeNumber', icon: 'select-place', name: findLocaleServMenu('language'), offColor: Menu, onColor: Menu, modeList: ['en-US', 'de-DE', 'nl-NL', 'da-DK', 'es-ES', 'fr-FR', 'it-IT', 'ru-RU', 'nb-NO', 'nn-NO', 'pl-PL', 'pt-PT', 'af-ZA', 'ar-SY', 'bg-BG', 'ca-ES', 'cs-CZ', 'el-GR', 'et-EE', 'fa-IR', 'fi-FI', 'he-IL', 'hr-xx', 'hu-HU', 'hy-AM', 'id-ID', 'is-IS', 'lb-xx', 'lt-LT', 'ro-RO', 'sk-SK', 'sl-SI', 'sv-SE', 'th-TH', 'tr-TR', 'uk-UA', 'vi-VN', 'zh-CN', 'zh-TW']}, - { navigate: true, id: 'NSPanel_Script', icon: 'code-json',offColor: Menu, onColor: Menu, name: findLocaleServMenu('script'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_Script', icon: 'code-json',offColor: Menu, onColor: Menu, name: findLocaleServMenu('script'), buttonText: findLocaleServMenu('more')}, ] }; //Level_2 - let NSPanel_Screensaver = + let NSPanel_Screensaver: PageType = { 'type': 'cardGrid', 'heading': findLocaleServMenu('screensaver'), @@ -564,17 +565,17 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Einstellungen, 'home': 'NSPanel_Service', 'items': [ - { navigate: true, id: 'NSPanel_ScreensaverDimmode', icon: 'sun-clock', offColor: Menu, onColor: Menu, name: findLocaleServMenu('dimmode')}, - { navigate: true, id: 'NSPanel_ScreensaverBrightness', icon: 'brightness-5', offColor: Menu, onColor: Menu, name: findLocaleServMenu('brightness')}, - { navigate: true, id: 'NSPanel_ScreensaverLayout', icon: 'page-next-outline', offColor: Menu, onColor: Menu, name: findLocaleServMenu('layout')}, - { navigate: true, id: 'NSPanel_ScreensaverWeather', icon: 'weather-partly-rainy', offColor: Menu, onColor: Menu, name: findLocaleServMenu('weather')}, - { navigate: true, id: 'NSPanel_ScreensaverDateformat', icon: 'calendar-expand-horizontal', offColor: Menu, onColor: Menu, name: findLocaleServMenu('date_format')}, - { navigate: true, id: 'NSPanel_ScreensaverIndicators', icon: 'monitor-edit', offColor: Menu, onColor: Menu, name: findLocaleServMenu('indicators')} + /*PageItem*/{ navigate: true, id: 'NSPanel_ScreensaverDimmode', icon: 'sun-clock', offColor: Menu, onColor: Menu, name: findLocaleServMenu('dimmode')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_ScreensaverBrightness', icon: 'brightness-5', offColor: Menu, onColor: Menu, name: findLocaleServMenu('brightness')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_ScreensaverLayout', icon: 'page-next-outline', offColor: Menu, onColor: Menu, name: findLocaleServMenu('layout')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_ScreensaverWeather', icon: 'weather-partly-rainy', offColor: Menu, onColor: Menu, name: findLocaleServMenu('weather')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_ScreensaverDateformat', icon: 'calendar-expand-horizontal', offColor: Menu, onColor: Menu, name: findLocaleServMenu('date_format')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_ScreensaverIndicators', icon: 'monitor-edit', offColor: Menu, onColor: Menu, name: findLocaleServMenu('indicators')} ] }; //Level_3 - let NSPanel_ScreensaverDimmode = + let NSPanel_ScreensaverDimmode: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('dimmode'), @@ -583,15 +584,15 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Screensaver, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Dimmode.brightnessDay', name: findLocaleServMenu('brightness_day'), icon: 'brightness-5', offColor: Menu, onColor: Menu, minValue: 5, maxValue: 10}, - { id: AliasPath + 'Dimmode.brightnessNight', name: findLocaleServMenu('brightness_night'), icon: 'brightness-4', offColor: Menu, onColor: Menu, minValue: 0, maxValue: 4}, - { id: AliasPath + 'Dimmode.hourDay', name: findLocaleServMenu('hour_day'), icon: 'sun-clock', offColor: Menu, onColor: Menu, minValue: 0, maxValue: 23}, - { id: AliasPath + 'Dimmode.hourNight', name: findLocaleServMenu('hour_night'), icon: 'sun-clock-outline', offColor: Menu, onColor: Menu, minValue: 0, maxValue: 23} + /*PageItem*/{ id: AliasPath + 'Dimmode.brightnessDay', name: findLocaleServMenu('brightness_day'), icon: 'brightness-5', offColor: Menu, onColor: Menu, minValue: 5, maxValue: 10}, + /*PageItem*/{ id: AliasPath + 'Dimmode.brightnessNight', name: findLocaleServMenu('brightness_night'), icon: 'brightness-4', offColor: Menu, onColor: Menu, minValue: 0, maxValue: 4}, + /*PageItem*/{ id: AliasPath + 'Dimmode.hourDay', name: findLocaleServMenu('hour_day'), icon: 'sun-clock', offColor: Menu, onColor: Menu, minValue: 0, maxValue: 23}, + /*PageItem*/{ id: AliasPath + 'Dimmode.hourNight', name: findLocaleServMenu('hour_night'), icon: 'sun-clock-outline', offColor: Menu, onColor: Menu, minValue: 0, maxValue: 23} ] }; //Level_3 - let NSPanel_ScreensaverBrightness = + let NSPanel_ScreensaverBrightness: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('brightness'), @@ -600,14 +601,14 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Screensaver, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'ScreensaverInfo.activeBrightness', name: findLocaleServMenu('brightness_activ'), icon: 'brightness-5', offColor: Menu, onColor: Menu, minValue: 20, maxValue: 100}, - { id: AliasPath + 'Config.Screensaver.timeoutScreensaver', name: findLocaleServMenu('screensaver_timeout'), icon: 'clock-end', offColor: Menu, onColor: Menu, minValue: 0, maxValue: 60}, - { id: AliasPath + 'Config.Screensaver.screenSaverDoubleClick', name: findLocaleServMenu('wakeup_doublecklick') ,icon: 'gesture-two-double-tap', offColor: HMIOff, onColor: HMIOn} + /*PageItem*/{ id: AliasPath + 'ScreensaverInfo.activeBrightness', name: findLocaleServMenu('brightness_activ'), icon: 'brightness-5', offColor: Menu, onColor: Menu, minValue: 20, maxValue: 100}, + /*PageItem*/{ id: AliasPath + 'Config.Screensaver.timeoutScreensaver', name: findLocaleServMenu('screensaver_timeout'), icon: 'clock-end', offColor: Menu, onColor: Menu, minValue: 0, maxValue: 60}, + /*PageItem*/{ id: AliasPath + 'Config.Screensaver.screenSaverDoubleClick', name: findLocaleServMenu('wakeup_doublecklick') ,icon: 'gesture-two-double-tap', offColor: HMIOff, onColor: HMIOn} ] }; //Level_3 - let NSPanel_ScreensaverLayout = + let NSPanel_ScreensaverLayout: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('layout'), @@ -616,13 +617,13 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Screensaver, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Config.Screensaver.alternativeScreensaverLayout', name: findLocaleServMenu('alternative_layout') ,icon: 'page-previous-outline', offColor: HMIOff, onColor: HMIOn}, - { id: AliasPath + 'Config.Screensaver.ScreensaverAdvanced', name: findLocaleServMenu('advanced_layout') ,icon: 'page-next-outline', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Config.Screensaver.alternativeScreensaverLayout', name: findLocaleServMenu('alternative_layout') ,icon: 'page-previous-outline', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Config.Screensaver.ScreensaverAdvanced', name: findLocaleServMenu('advanced_layout') ,icon: 'page-next-outline', offColor: HMIOff, onColor: HMIOn}, ] }; //Level_3 - let NSPanel_ScreensaverWeather = + let NSPanel_ScreensaverWeather: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('weather_parameters'), @@ -631,15 +632,15 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Screensaver, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'ScreensaverInfo.weatherForecast', name: findLocaleServMenu('weather_forecast_offon') ,icon: 'weather-sunny-off', offColor: HMIOff, onColor: HMIOn}, - { id: AliasPath + 'ScreensaverInfo.weatherForecastTimer', name: findLocaleServMenu('weather_forecast_change_switch') ,icon: 'devices', offColor: HMIOff, onColor: HMIOn}, - { id: AliasPath + 'ScreensaverInfo.entityChangeTime', name: findLocaleServMenu('weather_forecast_change_time'), icon: 'cog-sync', offColor: Menu, onColor: Menu, minValue: 15, maxValue: 60}, - { id: AliasPath + 'Config.Screensaver.autoWeatherColorScreensaverLayout', name: findLocaleServMenu('weather_forecast_icon_colors') ,icon: 'format-color-fill', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'ScreensaverInfo.weatherForecast', name: findLocaleServMenu('weather_forecast_offon') ,icon: 'weather-sunny-off', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'ScreensaverInfo.weatherForecastTimer', name: findLocaleServMenu('weather_forecast_change_switch') ,icon: 'devices', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'ScreensaverInfo.entityChangeTime', name: findLocaleServMenu('weather_forecast_change_time'), icon: 'cog-sync', offColor: Menu, onColor: Menu, minValue: 15, maxValue: 60}, + /*PageItem*/{ id: AliasPath + 'Config.Screensaver.autoWeatherColorScreensaverLayout', name: findLocaleServMenu('weather_forecast_icon_colors') ,icon: 'format-color-fill', offColor: HMIOff, onColor: HMIOn}, ] }; //Level_3 - let NSPanel_ScreensaverDateformat = + let NSPanel_ScreensaverDateformat: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('date_format'), @@ -648,13 +649,13 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Screensaver, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Config.Dateformat.Switch.weekday', name: findLocaleServMenu('weekday_large') ,icon: 'calendar-expand-horizontal', offColor: HMIOff, onColor: HMIOn}, - { id: AliasPath + 'Config.Dateformat.Switch.month', name: findLocaleServMenu('month_large') ,icon: 'calendar-expand-horizontal', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Config.Dateformat.Switch.weekday', name: findLocaleServMenu('weekday_large') ,icon: 'calendar-expand-horizontal', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Config.Dateformat.Switch.month', name: findLocaleServMenu('month_large') ,icon: 'calendar-expand-horizontal', offColor: HMIOff, onColor: HMIOn}, ] }; //Level_3 - let NSPanel_ScreensaverIndicators = + let NSPanel_ScreensaverIndicators: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('indicators'), @@ -663,13 +664,13 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Screensaver, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Config.MRIcons.alternateMRIconSize.1', name: findLocaleServMenu('mr_icon1_size') ,icon: 'format-size', offColor: HMIOff, onColor: HMIOn}, - { id: AliasPath + 'Config.MRIcons.alternateMRIconSize.2', name: findLocaleServMenu('mr_icon2_size') ,icon: 'format-size', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Config.MRIcons.alternateMRIconSize.1', name: findLocaleServMenu('mr_icon1_size') ,icon: 'format-size', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Config.MRIcons.alternateMRIconSize.2', name: findLocaleServMenu('mr_icon2_size') ,icon: 'format-size', offColor: HMIOff, onColor: HMIOn}, ] }; //Level_2 - let NSPanel_Relays = + let NSPanel_Relays: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('relays'), @@ -678,13 +679,13 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Einstellungen, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Relay.1', name: findLocaleServMenu('relay1_onoff'), icon: 'power', offColor: HMIOff, onColor: HMIOn}, - { id: AliasPath + 'Relay.2', name: findLocaleServMenu('relay2_onoff'), icon: 'power', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Relay.1', name: findLocaleServMenu('relay1_onoff'), icon: 'power', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Relay.2', name: findLocaleServMenu('relay2_onoff'), icon: 'power', offColor: HMIOff, onColor: HMIOn}, ] }; //Level_2 - let NSPanel_Script = + let NSPanel_Script: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('script'), @@ -693,13 +694,13 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Einstellungen, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Config.ScripgtDebugStatus', name: findLocaleServMenu('debugmode_offon') ,icon: 'code-tags-check', offColor: HMIOff, onColor: HMIOn}, - { id: AliasPath + 'Config.MQTT.portCheck', name: findLocaleServMenu('port_check_offon') ,icon: 'check-network', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Config.ScripgtDebugStatus', name: findLocaleServMenu('debugmode_offon') ,icon: 'code-tags-check', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ id: AliasPath + 'Config.MQTT.portCheck', name: findLocaleServMenu('port_check_offon') ,icon: 'check-network', offColor: HMIOff, onColor: HMIOn}, ] }; //Level_1 - let NSPanel_Firmware = + let NSPanel_Firmware: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('firmware'), @@ -708,14 +709,14 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Service, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'autoUpdate', name: findLocaleServMenu('automatically_updates') ,icon: 'power', offColor: HMIOff, onColor: HMIOn}, - { navigate: true, id: 'NSPanel_FirmwareTasmota', icon: 'usb-flash-drive', offColor: Menu, onColor: Menu, name: findLocaleServMenu('tasmota_firmware'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_FirmwareBerry', icon: 'usb-flash-drive', offColor: Menu, onColor: Menu, name: findLocaleServMenu('berry_driver'), buttonText: findLocaleServMenu('more')}, - { navigate: true, id: 'NSPanel_FirmwareNextion', icon: 'cellphone-cog', offColor: Menu, onColor: Menu, name: findLocaleServMenu('nextion_tft_firmware'), buttonText: findLocaleServMenu('more')} + /*PageItem*/{ id: AliasPath + 'autoUpdate', name: findLocaleServMenu('automatically_updates') ,icon: 'power', offColor: HMIOff, onColor: HMIOn}, + /*PageItem*/{ navigate: true, id: 'NSPanel_FirmwareTasmota', icon: 'usb-flash-drive', offColor: Menu, onColor: Menu, name: findLocaleServMenu('tasmota_firmware'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_FirmwareBerry', icon: 'usb-flash-drive', offColor: Menu, onColor: Menu, name: findLocaleServMenu('berry_driver'), buttonText: findLocaleServMenu('more')}, + /*PageItem*/{ navigate: true, id: 'NSPanel_FirmwareNextion', icon: 'cellphone-cog', offColor: Menu, onColor: Menu, name: findLocaleServMenu('nextion_tft_firmware'), buttonText: findLocaleServMenu('more')} ] }; - let NSPanel_FirmwareTasmota = + let NSPanel_FirmwareTasmota: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('tasmota'), @@ -724,14 +725,14 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Firmware, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Tasmota.Version', name: findLocaleServMenu('installed_release'), offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Tasmota_Firmware.onlineVersion', name: findLocaleServMenu('available_release'), offColor: Menu, onColor: Menu }, - { id: 'Divider' }, - { id: AliasPath + 'Config.Update.UpdateTasmota', name: findLocaleServMenu('update_tasmota') ,icon: 'refresh', offColor: HMIOff, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, + /*PageItem*/{ id: AliasPath + 'Tasmota.Version', name: findLocaleServMenu('installed_release'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Tasmota_Firmware.onlineVersion', name: findLocaleServMenu('available_release'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: 'Divider' }, + /*PageItem*/{ id: AliasPath + 'Config.Update.UpdateTasmota', name: findLocaleServMenu('update_tasmota') ,icon: 'refresh', offColor: HMIOff, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, ] }; - let NSPanel_FirmwareBerry = + let NSPanel_FirmwareBerry: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('berry_driver'), @@ -740,14 +741,14 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Firmware, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Display.BerryDriver', name: findLocaleServMenu('installed_release'), offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Berry_Driver.onlineVersion', name: findLocaleServMenu('available_release'), offColor: Menu, onColor: Menu}, - { id: 'Divider' }, - { id: AliasPath + 'Config.Update.UpdateBerry', name: findLocaleServMenu('update_berry_driver') ,icon: 'refresh', offColor: HMIOff, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, + /*PageItem*/{ id: AliasPath + 'Display.BerryDriver', name: findLocaleServMenu('installed_release'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Berry_Driver.onlineVersion', name: findLocaleServMenu('available_release'), offColor: Menu, onColor: Menu}, + /*PageItem*/{ id: 'Divider' }, + /*PageItem*/{ id: AliasPath + 'Config.Update.UpdateBerry', name: findLocaleServMenu('update_berry_driver') ,icon: 'refresh', offColor: HMIOff, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, ] }; - let NSPanel_FirmwareNextion = + let NSPanel_FirmwareNextion: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('nextion_tft'), @@ -756,10 +757,10 @@ let NSPanel_Service_SubPage = 'parent': NSPanel_Firmware, 'home': 'NSPanel_Service', 'items': [ - { id: AliasPath + 'Display_Firmware.TFT.currentVersion', name: findLocaleServMenu('installed_release'), offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Display_Firmware.TFT.desiredVersion', name: findLocaleServMenu('desired_release'), offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Display.Model', name: findLocaleServMenu('nspanel_model'), offColor: Menu, onColor: Menu }, - { id: AliasPath + 'Config.Update.UpdateNextion', name: 'Nextion TFT Update' ,icon: 'refresh', offColor: HMIOff, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, + /*PageItem*/{ id: AliasPath + 'Display_Firmware.TFT.currentVersion', name: findLocaleServMenu('installed_release'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Display_Firmware.TFT.desiredVersion', name: findLocaleServMenu('desired_release'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Display.Model', name: findLocaleServMenu('nspanel_model'), offColor: Menu, onColor: Menu }, + /*PageItem*/{ id: AliasPath + 'Config.Update.UpdateNextion', name: 'Nextion TFT Update' ,icon: 'refresh', offColor: HMIOff, onColor: MSGreen, buttonText: findLocaleServMenu('start')}, ] }; @@ -771,158 +772,146 @@ let NSPanel_Service_SubPage = ** ** ***********************************************************************/ -export const config = { - +export const config: Config = { // Seiteneinteilung / Page division // Hauptseiten / Mainpages pages: [ - - NSPanel_Service, //Auto-Alias Service Page - //Unlock_Service //Auto-Alias Service Page (Service Pages used with cardUnlock) + NSPanel_Service, //Auto-Alias Service Page + //Unlock_Service //Auto-Alias Service Page (Service Pages used with cardUnlock) ], - // Unterseiten / Subpages subPages: [ - - NSPanel_Service_SubPage, //Auto-Alias Service Page (only used with cardUnlock) - NSPanel_Infos, //Auto-Alias Service Page - NSPanel_Wifi_Info_1, //Auto-Alias Service Page - NSPanel_Wifi_Info_2, //Auto-Alias Service Page - NSPanel_Sensoren, //Auto-Alias Service Page - NSPanel_Hardware, //Auto-Alias Service Page - NSPanel_IoBroker, //Auot-Alias Service Page - NSPanel_Einstellungen, //Auto-Alias Service Page - NSPanel_Screensaver, //Auto-Alias Service Page - NSPanel_ScreensaverDimmode, //Auto-Alias Service Page - NSPanel_ScreensaverBrightness, //Auto-Alias Service Page - NSPanel_ScreensaverLayout, //Auto-Alias Service Page - NSPanel_ScreensaverWeather, //Auto-Alias Service Page - NSPanel_ScreensaverDateformat, //Auto-Alias Service Page - NSPanel_ScreensaverIndicators, //Auto-Alias Service Page - NSPanel_Relays, //Auto-Alias Service Page - NSPanel_Script, //Auto-Alias Service Page - NSPanel_Firmware, //Auto-Alias Service Page - NSPanel_FirmwareTasmota, //Auto-Alias Service Page - NSPanel_FirmwareBerry, //Auto-Alias Service Page - NSPanel_FirmwareNextion, //Auto-Alias Service Page + NSPanel_Service_SubPage, //Auto-Alias Service Page (only used with cardUnlock) + NSPanel_Infos, //Auto-Alias Service Page + NSPanel_Wifi_Info_1, //Auto-Alias Service Page + NSPanel_Wifi_Info_2, //Auto-Alias Service Page + NSPanel_Sensoren, //Auto-Alias Service Page + NSPanel_Hardware, //Auto-Alias Service Page + NSPanel_IoBroker, //Auot-Alias Service Page + NSPanel_Einstellungen, //Auto-Alias Service Page + NSPanel_Screensaver, //Auto-Alias Service Page + NSPanel_ScreensaverDimmode, //Auto-Alias Service Page + NSPanel_ScreensaverBrightness, //Auto-Alias Service Page + NSPanel_ScreensaverLayout, //Auto-Alias Service Page + NSPanel_ScreensaverWeather, //Auto-Alias Service Page + NSPanel_ScreensaverDateformat, //Auto-Alias Service Page + NSPanel_ScreensaverIndicators, //Auto-Alias Service Page + NSPanel_Relays, //Auto-Alias Service Page + NSPanel_Script, //Auto-Alias Service Page + NSPanel_Firmware, //Auto-Alias Service Page + NSPanel_FirmwareTasmota, //Auto-Alias Service Page + NSPanel_FirmwareBerry, //Auto-Alias Service Page + NSPanel_FirmwareNextion, //Auto-Alias Service Page ], -/*********************************************************************** - ** ** - ** Screensaver Configuration ** - ** ** - ***********************************************************************/ - leftScreensaverEntity: - [ - // Examples for Advanced-Screensaver: https://github.com/joBr99/nspanel-lovelace-ui/wiki/ioBroker-Config-Screensaver#entity-status-icons-ab-v400 - - ], - - bottomScreensaverEntity : - [ - // bottomScreensaverEntity 1 - { - ScreensaverEntity: 'accuweather.0.Daily.Day1.Sunrise', - ScreensaverEntityFactor: 1, - ScreensaverEntityDecimalPlaces: 0, - ScreensaverEntityDateFormat: { hour: '2-digit', minute: '2-digit' }, // Description at Wiki-Pages - ScreensaverEntityIconOn: 'weather-sunset-up', - ScreensaverEntityIconOff: null, - ScreensaverEntityText: 'Sonne', - ScreensaverEntityUnitText: '%', - ScreensaverEntityIconColor: MSYellow //{'val_min': 0, 'val_max': 100} - }, - // bottomScreensaverEntity 2 - { - ScreensaverEntity: 'accuweather.0.Current.WindSpeed', - ScreensaverEntityFactor: (1000/3600), - ScreensaverEntityDecimalPlaces: 1, - ScreensaverEntityIconOn: 'weather-windy', - ScreensaverEntityIconOff: null, - ScreensaverEntityText: "Wind", - ScreensaverEntityUnitText: 'm/s', - ScreensaverEntityIconColor: { 'val_min': 0, 'val_max': 120 } - }, - // bottomScreensaverEntity 3 - { - ScreensaverEntity: 'accuweather.0.Current.WindGust', - ScreensaverEntityFactor: (1000/3600), - ScreensaverEntityDecimalPlaces: 1, - ScreensaverEntityIconOn: 'weather-tornado', - ScreensaverEntityIconOff: null, - ScreensaverEntityText: 'Böen', - ScreensaverEntityUnitText: 'm/s', - ScreensaverEntityIconColor: { 'val_min': 0, 'val_max': 120 } - }, - // bottomScreensaverEntity 4 - { - ScreensaverEntity: 'accuweather.0.Current.WindDirectionText', - ScreensaverEntityFactor: 1, - ScreensaverEntityDecimalPlaces: 0, - ScreensaverEntityIconOn: 'windsock', - ScreensaverEntityIconOff: null, - ScreensaverEntityText: 'Windr.', - ScreensaverEntityUnitText: '°', - ScreensaverEntityIconColor: White - }, - // bottomScreensaverEntity 5 (for Alternative and Advanced Screensaver) - { - ScreensaverEntity: 'accuweather.0.Current.RelativeHumidity', - ScreensaverEntityFactor: 1, - ScreensaverEntityDecimalPlaces: 1, - ScreensaverEntityIconOn: 'water-percent', - ScreensaverEntityIconOff: null, - ScreensaverEntityText: 'Feuchte', - ScreensaverEntityUnitText: '%', - ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 100, 'val_best': 65} - }, - // bottomScreensaverEntity 6 (for Advanced Screensaver) - { - ScreensaverEntity: NSPanel_Path + 'Relay.1', - ScreensaverEntityIconOn: 'coach-lamp-variant', - ScreensaverEntityText: 'Street', - ScreensaverEntityOnColor: Yellow, - ScreensaverEntityOffColor: White, - ScreensaverEntityOnText: 'Is ON', - ScreensaverEntityOffText: 'Not ON' - }, - // Examples for Advanced-Screensaver: https://github.com/joBr99/nspanel-lovelace-ui/wiki/ioBroker-Config-Screensaver#entity-status-icons-ab-v400 - ], - - indicatorScreensaverEntity: - [ - // Examples for Advanced-Screensaver: https://github.com/joBr99/nspanel-lovelace-ui/wiki/ioBroker-Config-Screensaver#entity-status-icons-ab-v400 - ], - - // Status Icon - mrIcon1ScreensaverEntity: - { - ScreensaverEntity: NSPanel_Path + 'Relay.1', - ScreensaverEntityIconOn: 'lightbulb', - ScreensaverEntityIconOff: null, - ScreensaverEntityValue: null, - ScreensaverEntityValueDecimalPlace : 0, - ScreensaverEntityValueUnit: null, - ScreensaverEntityOnColor: On, - ScreensaverEntityOffColor: HMIOff + /*********************************************************************** + ** ** + ** Screensaver Configuration ** + ** ** + ***********************************************************************/ + leftScreensaverEntity: [ + // Examples for Advanced-Screensaver: https://github.com/joBr99/nspanel-lovelace-ui/wiki/ioBroker-Config-Screensaver#entity-status-icons-ab-v400 + ], + + bottomScreensaverEntity: [ + // bottomScreensaverEntity 1 + { + ScreensaverEntity: 'accuweather.0.Daily.Day1.Sunrise', + ScreensaverEntityFactor: 1, + ScreensaverEntityDecimalPlaces: 0, + ScreensaverEntityDateFormat: {hour: '2-digit', minute: '2-digit'}, // Description at Wiki-Pages + ScreensaverEntityIconOn: 'weather-sunset-up', + ScreensaverEntityIconOff: null, + ScreensaverEntityText: 'Sonne', + ScreensaverEntityUnitText: '%', + ScreensaverEntityIconColor: MSYellow //{'val_min': 0, 'val_max': 100} }, - mrIcon2ScreensaverEntity: - { - ScreensaverEntity: NSPanel_Path + 'Relay.2', - ScreensaverEntityIconOn: 'lightbulb', - ScreensaverEntityIconOff: null, - ScreensaverEntityValue: null, - ScreensaverEntityValueDecimalPlace : 0, - ScreensaverEntityValueUnit: null, - ScreensaverEntityOnColor: On, - ScreensaverEntityOffColor: HMIOff + // bottomScreensaverEntity 2 + { + ScreensaverEntity: 'accuweather.0.Current.WindSpeed', + ScreensaverEntityFactor: (1000 / 3600), + ScreensaverEntityDecimalPlaces: 1, + ScreensaverEntityIconOn: 'weather-windy', + ScreensaverEntityIconOff: null, + ScreensaverEntityText: "Wind", + ScreensaverEntityUnitText: 'm/s', + ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 120} }, -// ------ DE: Ende der Screensaver Einstellungen -------------------- -// ------ EN: End of screensaver settings --------------------------- + // bottomScreensaverEntity 3 + { + ScreensaverEntity: 'accuweather.0.Current.WindGust', + ScreensaverEntityFactor: (1000 / 3600), + ScreensaverEntityDecimalPlaces: 1, + ScreensaverEntityIconOn: 'weather-tornado', + ScreensaverEntityIconOff: null, + ScreensaverEntityText: 'Böen', + ScreensaverEntityUnitText: 'm/s', + ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 120} + }, + // bottomScreensaverEntity 4 + { + ScreensaverEntity: 'accuweather.0.Current.WindDirectionText', + ScreensaverEntityFactor: 1, + ScreensaverEntityDecimalPlaces: 0, + ScreensaverEntityIconOn: 'windsock', + ScreensaverEntityIconOff: null, + ScreensaverEntityText: 'Windr.', + ScreensaverEntityUnitText: '°', + ScreensaverEntityIconColor: White + }, + // bottomScreensaverEntity 5 (for Alternative and Advanced Screensaver) + { + ScreensaverEntity: 'accuweather.0.Current.RelativeHumidity', + ScreensaverEntityFactor: 1, + ScreensaverEntityDecimalPlaces: 1, + ScreensaverEntityIconOn: 'water-percent', + ScreensaverEntityIconOff: null, + ScreensaverEntityText: 'Feuchte', + ScreensaverEntityUnitText: '%', + ScreensaverEntityIconColor: {'val_min': 0, 'val_max': 100, 'val_best': 65} + }, + // bottomScreensaverEntity 6 (for Advanced Screensaver) + { + ScreensaverEntity: NSPanel_Path + 'Relay.1', + ScreensaverEntityIconOn: 'coach-lamp-variant', + ScreensaverEntityText: 'Street', + ScreensaverEntityOnColor: Yellow, + ScreensaverEntityOffColor: White, + ScreensaverEntityOnText: 'Is ON', + ScreensaverEntityOffText: 'Not ON' + }, + // Examples for Advanced-Screensaver: https://github.com/joBr99/nspanel-lovelace-ui/wiki/ioBroker-Config-Screensaver#entity-status-icons-ab-v400 + ], + indicatorScreensaverEntity: [ + // Examples for Advanced-Screensaver: https://github.com/joBr99/nspanel-lovelace-ui/wiki/ioBroker-Config-Screensaver#entity-status-icons-ab-v400 + ], -//-------DE: Anfang Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) ------------- -//-------EN: Start Settings for Hardware Button, if used in software (Rule2) -------------------------------------- + // Status Icon + mrIcon1ScreensaverEntity: { + ScreensaverEntity: NSPanel_Path + 'Relay.1', + ScreensaverEntityIconOn: 'lightbulb', + ScreensaverEntityIconOff: null, + ScreensaverEntityValue: null, + ScreensaverEntityValueDecimalPlace: 0, + ScreensaverEntityValueUnit: null, + ScreensaverEntityOnColor: On, + ScreensaverEntityOffColor: HMIOff + }, + mrIcon2ScreensaverEntity: { + ScreensaverEntity: NSPanel_Path + 'Relay.2', + ScreensaverEntityIconOn: 'lightbulb', + ScreensaverEntityIconOff: null, + ScreensaverEntityValue: null, + ScreensaverEntityValueDecimalPlace: 0, + ScreensaverEntityValueUnit: null, + ScreensaverEntityOnColor: On, + ScreensaverEntityOffColor: HMIOff + }, + // ------ DE: Ende der Screensaver Einstellungen -------------------- + // ------ EN: End of screensaver settings --------------------------- + //-------DE: Anfang Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) ------------- + //-------EN: Start Settings for Hardware Button, if used in software (Rule2) -------------------------------------- // DE: Konfiguration des linken Schalters des NSPanels // EN: Configuration of the left switch of the NSPanel button1: { @@ -948,10 +937,8 @@ export const config = { entity: null, setValue: null }, -//--------- DE: Ende - Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) ------------- -//--------- EN: End - settings for hardware button if they are used in software (Rule2) ------------------------------ - - + //--------- DE: Ende - Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) ------------- + //--------- EN: End - settings for hardware button if they are used in software (Rule2) ------------------------------ // DE: WICHTIG !! Parameter nicht ändern WICHTIG!! // EN: IMPORTANT !! Do not change parameters IMPORTANT!! panelRecvTopic: NSPanelReceiveTopic, @@ -966,7 +953,7 @@ export const config = { // _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________ // _________________________________ EN: No more configuration from here _____________________________________ -const scriptVersion: string = 'v4.3.3.29'; +const scriptVersion: string = 'v4.3.3.30'; const tft_version: string = 'v4.3.3'; const desired_display_firmware_version = 53; const berry_driver_version = 9; @@ -975,7 +962,7 @@ const tasmotaOtaUrl: string = 'http://ota.tasmota.com/tasmota32/release/'; const Icons = new IconsSelector(); let timeoutSlider: any; -let vwIconColor = []; +let vwIconColor: number[] = []; let weatherForecast: boolean; let pageCounter: number = 0; let alwaysOn: boolean = false; @@ -1002,7 +989,7 @@ async function Init_dayjs() { require('dayjs/locale/'+ dayjsLanguages[i]); } dayjs.locale(getDayjsLocale()); - } catch (err) { + } catch (err: any) { log('error at function init_dayjs: ' + err.message,'warn'); } } @@ -1084,19 +1071,19 @@ async function CheckConfigParameters() { log('nodeJS does not have an even version number. An odd version number is a developer version. Please correct nodeJS version','info'); } }); - if (existsObject(config.mrIcon1ScreensaverEntity.ScreensaverEntity) == false && config.mrIcon1ScreensaverEntity.ScreensaverEntity != null) { + if (config.mrIcon1ScreensaverEntity.ScreensaverEntity != null && existsObject(config.mrIcon1ScreensaverEntity.ScreensaverEntity) == false ) { log('mrIcon1ScreensaverEntity data point in the config not available - please adjust','warn'); } - if (existsObject(config.mrIcon2ScreensaverEntity.ScreensaverEntity) == false && config.mrIcon2ScreensaverEntity.ScreensaverEntity != null) { + if (config.mrIcon2ScreensaverEntity.ScreensaverEntity != null && existsObject(config.mrIcon2ScreensaverEntity.ScreensaverEntity) == false) { log('mrIcon2ScreensaverEntity data point in the config not available - please adjust','warn'); } - if (CheckEnableSetObject) { + if (CheckEnableSetObject()) { log('setObjects enabled - create Alias Channels possible','info'); isSetOptionActive = true; } else { log('setObjects disabled - Please enable setObjects in JS-Adapter Instance - create Alias Channels not possible', 'warn'); } - } catch (err) { + } catch (err: any) { log('error at function CheckConfigParameters: ' + err.message, 'warn'); } } @@ -1119,7 +1106,7 @@ async function InitIoBrokerInfo() { await createAliasAsync(AliasPath + 'IoBroker.JavaScriptVersion.ACTUAL', NSPanel_Path + 'IoBroker.JavaScriptVersion', true, { type: 'string', role: 'state', name: 'ACTUAL' }); } setIfExists(NSPanel_Path + 'IoBroker.ScriptVersion', scriptVersion); - } catch (err) { + } catch (err: any) { log('error at funktion InitIoBrokerInfo ' + err.message, 'warn'); } } @@ -1142,7 +1129,7 @@ async function CheckDebugMode() { log('Debug mode disabled','info'); } - } catch (err) { + } catch (err: any) { log('error at function CheckDebugModus: ' + err.message,'warn'); } } @@ -1199,7 +1186,7 @@ async function CheckMQTTPorts() { } }); } - } catch (err) { + } catch (err: any) { log('error at function CheckMQTTPorts: ' + err.message, 'warn'); } } @@ -1246,7 +1233,7 @@ async function Init_Release() { await setStateAsync(NSPanel_Path + 'Display_Firmware.TFT.currentVersion', currentFW + ' / v' + FWRelease[findFWIndex]); await setStateAsync(NSPanel_Path + 'Display_Firmware.TFT.desiredVersion', desired_display_firmware_version + ' / ' + tft_version); } - } catch (err) { + } catch (err: any) { log('error at function Init_Release: ' + err.message, 'warn'); } } @@ -1308,23 +1295,23 @@ async function InitConfigParameters() { await createAliasAsync(AliasPath + 'Config.temperatureUnitNumber.VALUE', NSPanel_Path + 'Config.temperatureUnitNumber', true, { type: 'number', role: 'state', name: 'VALUE' }); } } - } catch (err) { + } catch (err: any) { log('error at function InitConfigParameters: ' + err.message, 'warn'); } } InitConfigParameters(); -on({id: [].concat(NSPanel_Path + 'Config.ScripgtDebugStatus'), change: "ne"}, async function (obj) { +on({id: [NSPanel_Path + 'Config.ScripgtDebugStatus'], change: "ne"}, async function (obj) { try { obj.state.val ? log('Debug mode activated', 'info') : log('Debug mode disabled', 'info'); Debug = obj.state.val - } catch (err) { + } catch (err: any) { log('error at Trigger ScripgtDebugStatus: ' + err.message, 'warn'); } }); -on({id: [].concat(NSPanel_Path + 'Config.localeNumber') - .concat(NSPanel_Path + 'Config.temperatureUnitNumber'), change: "ne"}, async function (obj) { +on({id: [NSPanel_Path + 'Config.localeNumber', + NSPanel_Path + 'Config.temperatureUnitNumber'], change: "ne"}, async function (obj) { try { if (obj.id == NSPanel_Path + 'Config.localeNumber') { let localesList = [ 'en-US', 'de-DE', 'nl-NL', 'da-DK', 'es-ES', 'fr-FR', 'it-IT', 'ru-RU', 'nb-NO', 'nn-NO', 'pl-PL', 'pt-PT', 'af-ZA', 'ar-SY', @@ -1337,7 +1324,7 @@ on({id: [].concat(NSPanel_Path + 'Config.localeNumber') let tempunitList = ['°C', '°F', 'K']; setStateAsync(NSPanel_Path + 'Config.temperatureUnit', tempunitList[obj.state.val]); } - } catch (err) { + } catch (err: any) { log('error at Trigger temperatureUnitNumber + localeNumber: ' + err.message, 'warn'); } }); @@ -1348,7 +1335,7 @@ async function Init_ScreensaverAdvanced() { if (existsState(NSPanel_Path + 'Config.Screensaver.ScreensaverAdvanced') == false ) { await createStateAsync(NSPanel_Path + 'Config.Screensaver.ScreensaverAdvanced', false, true, { type: 'boolean' }); } - } catch (err) { + } catch (err: any) { log('error at function Init_ScreensaverAdvanced: ' + err.message, 'warn'); } } @@ -1372,7 +1359,7 @@ async function Init_ActivePageData() { if (existsState(NSPanel_Path + 'ActivePage.id0') == false ) { await createStateAsync(NSPanel_Path + 'ActivePage.id0', '', true, { type: 'string' }); } - } catch (err) { + } catch (err: any) { log('error at function Init_ActivePageData: ' + err.message, 'warn'); } } @@ -1384,7 +1371,7 @@ async function Init_Screensaver_Backckground_Color_Switch() { if (existsState(NSPanel_Path + 'ScreensaverInfo.bgColorIndicator') == false ) { await createStateAsync(NSPanel_Path + 'ScreensaverInfo.bgColorIndicator', 0, true, { type: 'number' }); } - } catch (err) { + } catch (err: any) { log('error at function Init_Screensaver_Backckground_Color_Switch: ' + err.message, 'warn'); } } @@ -1396,7 +1383,7 @@ on({id: NSPanel_Path + 'ScreensaverInfo.bgColorIndicator', change: "ne"}, async if (bgColorScrSaver < 4) { HandleScreensaverUpdate(); } - } catch (err) { + } catch (err: any) { log('error at trigger bgColorIndicator: ' + err.message, 'warn'); } }); @@ -1406,7 +1393,7 @@ on({id: NSPanel_Path + 'Config.Screensaver.ScreensaverAdvanced', change: "ne"}, try { if (obj.state.val) setState( NSPanel_Path + 'Config.Screensaver.alternativeScreensaverLayout', false ); //setState(config.panelSendTopic, 'pageType~pageStartup'); - } catch (err) { + } catch (err: any) { log('error at trigger Screensaver Advanced: ' + err.message, 'warn'); } }); @@ -1415,7 +1402,7 @@ on({id: NSPanel_Path + 'Config.Screensaver.alternativeScreensaverLayout', change try { if (obj.state.val) setState( NSPanel_Path + 'Config.Screensaver.ScreensaverAdvanced', false ); //setState(config.panelSendTopic, 'pageType~pageStartup'); - } catch (err) { + } catch (err: any) { log('error at trigger Screensaver Alternativ: ' + err.message, 'warn'); } }); @@ -1428,7 +1415,7 @@ async function Init_bExit_Page_Change() { if (existsState(NSPanel_Path + 'ScreensaverInfo.bExitPage') == false ) { await createStateAsync(NSPanel_Path + 'ScreensaverInfo.bExitPage', -1, true, { type: 'number' }); } - } catch (err) { + } catch (err: any) { log('error at function Init_bExit_Page_Change: ' + err.message, 'warn'); } } @@ -1440,7 +1427,7 @@ async function Init_Dimmode_Trigger() { if (existsState(NSPanel_Path + 'ScreensaverInfo.Trigger_Dimmode') == false ) { await createStateAsync(NSPanel_Path + 'ScreensaverInfo.Trigger_Dimmode', false, true, { type: 'boolean' }); } - } catch (err) { + } catch (err: any) { log('error at function Init_Dimmode_Trigger: ' + err.message, 'warn'); } } @@ -1459,13 +1446,13 @@ async function InitActiveBrightness() { await createAliasAsync(AliasPath + 'ScreensaverInfo.activeBrightness.ACTUAL', NSPanel_Path + 'ScreensaverInfo.activeBrightness', true, { type: 'number', role: 'value', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'ScreensaverInfo.activeBrightness.SET', NSPanel_Path + 'ScreensaverInfo.activeBrightness', true, { type: 'number', role: 'level', name: 'SET' }); } - } catch (err) { + } catch (err: any) { log('error at function InitActiveBrightness: ' + err.message, 'warn'); } } InitActiveBrightness(); -on({id: [].concat(String(NSPanel_Path) + 'ScreensaverInfo.activeDimmodeBrightness'), change: "ne"}, async function (obj) { +on({id: [NSPanel_Path + 'ScreensaverInfo.activeDimmodeBrightness'], change: "ne"}, async function (obj) { try { let active = getState(NSPanel_Path + 'ScreensaverInfo.activeBrightness').val; if (obj.state.val != null && obj.state.val != -1) { @@ -1490,7 +1477,7 @@ on({id: [].concat(String(NSPanel_Path) + 'ScreensaverInfo.activeDimmodeBrightnes InitDimmode(); HandleMessage('event', 'startup',undefined, undefined); } - } catch (err) { + } catch (err: any) { log('error at trigger activeDimmodeBrightness: ' + err.message, 'warn'); } }); @@ -1503,7 +1490,7 @@ on({id: String(NSPanel_Path) + 'ScreensaverInfo.Trigger_Dimmode', change: "ne"}, } else { InitDimmode(); } - } catch (err) { + } catch (err: any) { log('error at trigger Trigger_Dimmode: ' + err.message, 'warn'); } }); @@ -1515,7 +1502,7 @@ async function InitRebootPanel() { setObject(AliasPath + 'Config.rebootNSPanel', {type: 'channel', common: {role: 'button', name:'Reboot NSPanel'}, native: {}}); await createAliasAsync(AliasPath + 'Config.rebootNSPanel.SET', NSPanel_Path + 'Config.rebootNSPanel', true, { type: 'boolean', role: 'state', name: 'SET' }); } - } catch (err) { + } catch (err: any) { log('error at function InitRebootPanel: ' + err.message, 'warn'); } } @@ -1548,7 +1535,7 @@ on({id: AliasPath + 'Config.rebootNSPanel.SET', change: "any"}, async function ( log('Reboot NSPanel... done', 'info'); } }); - } catch (err) { + } catch (err: any) { log('error at Trigger Restart NSPanel: ' + err.message, 'warn'); } } @@ -1569,15 +1556,15 @@ async function InitUpdateDatapoints() { await createAliasAsync(AliasPath + 'Config.Update.UpdateNextion.SET', NSPanel_Path + 'Config.Update.UpdateNextion', true, { type: 'boolean', role: 'state', name: 'SET' }); } } - } catch (err) { + } catch (err: any) { log('function InitUpdateDatapoints: ' + err.message, 'warn'); } } InitUpdateDatapoints(); -on({id: [].concat(NSPanel_Path + 'Config.Update.UpdateTasmota') - .concat(NSPanel_Path + 'Config.Update.UpdateBerry') - .concat(NSPanel_Path + 'Config.Update.UpdateNextion'), change: "any"}, async function (obj) { +on({id: [NSPanel_Path + 'Config.Update.UpdateTasmota', + NSPanel_Path + 'Config.Update.UpdateBerry', + NSPanel_Path + 'Config.Update.UpdateNextion'], change: "any"}, async function (obj) { try { switch (obj.id) { case NSPanel_Path + 'Config.Update.UpdateTasmota': @@ -1593,7 +1580,7 @@ on({id: [].concat(NSPanel_Path + 'Config.Update.UpdateTasmota') update_tft_firmware(); break; } - } catch (err) { + } catch (err: any) { log('error at Trigger Update Firmware: ' + err.message, 'warn'); } }); @@ -1615,7 +1602,7 @@ async function Init_Relays() { await createAliasAsync(AliasPath + 'Relay.2.ACTUAL', NSPanel_Path + 'Relay.2', true, { type: 'boolean', role: 'switch', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Relay.2.SET', NSPanel_Path + 'Relay.2', true, { type: 'boolean', role: 'switch', name: 'SET' }); } - } catch (err) { + } catch (err: any) { log('error at function Init_Relays: ' + err.message, 'warn'); } } @@ -1639,7 +1626,7 @@ async function InitAlternateMRIconsSize() { await createAliasAsync(AliasPath + 'Config.MRIcons.alternateMRIconSize.2.ACTUAL', NSPanel_Path + 'Config.MRIcons.alternateMRIconSize.2', true, { type: 'boolean', role: 'switch', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Config.MRIcons.alternateMRIconSize.2.SET', NSPanel_Path + 'Config.MRIcons.alternateMRIconSize.2', true, { type: 'boolean', role: 'switch', name: 'SET' }); } - } catch (err) { + } catch (err: any) { log('error at function InitAlternateMRIconsSize: ' + err.message, 'warn'); } } @@ -1668,14 +1655,14 @@ async function InitDateformat() { await createAliasAsync(AliasPath + 'Config.Dateformat.Switch.month.SET', NSPanel_Path + 'Config.Dateformat.Switch.month', true, { type: 'boolean', role: 'switch', name: 'SET' }); } } - } catch (err) { + } catch (err: any) { log('error at function InitDateformat: ' + err.message, 'warn'); } } InitDateformat(); //Control Dateformat short/long from DP's -on({id: [].concat(String(NSPanel_Path) + 'Config.Dateformat.Switch.weekday') - .concat(String(NSPanel_Path) + 'Config.Dateformat.Switch.month'), change: "ne"}, async function (obj) { +on({id: [String(NSPanel_Path) + 'Config.Dateformat.Switch.weekday', + String(NSPanel_Path) + 'Config.Dateformat.Switch.month'], change: "ne"}, async function (obj) { try { if (obj.id == NSPanel_Path + 'Config.Dateformat.Switch.weekday') { if (getState(NSPanel_Path + 'Config.Dateformat.Switch.weekday').val) { @@ -1691,15 +1678,15 @@ on({id: [].concat(String(NSPanel_Path) + 'Config.Dateformat.Switch.weekday') } } SendDate(); - } catch (err) { + } catch (err: any) { log('error at Trigger Config.Dateformat: ' + err.message, 'warn'); } }); //Control Relays from DP's -on({id: [].concat(String(NSPanel_Path) + 'Relay.1').concat(String(NSPanel_Path) + 'Relay.2'), change: "ne"}, async function (obj) { +on({id: [String(NSPanel_Path) + 'Relay.1',String(NSPanel_Path) + 'Relay.2'], change: "ne"}, async function (obj) { try { - let Button = obj.id.split('.'); + let Button = obj.id!.split('.'); let urlString: string = ['http://',get_current_tasmota_ip_address(),'/cm?cmnd=Power',Button[Button.length - 1],' ',(obj.state ? obj.state.val : "")].join(''); axios.get(urlString) @@ -1714,7 +1701,7 @@ on({id: [].concat(String(NSPanel_Path) + 'Relay.1').concat(String(NSPanel_Path) log(error, 'warn'); }) - } catch (err) { + } catch (err: any) { log('error at Trigger Relay1/2: ' + err.message, 'warn'); } }); @@ -1723,8 +1710,8 @@ async function SubscribeMRIcons () { try { if (config.mrIcon1ScreensaverEntity.ScreensaverEntity != null) { on({id: config.mrIcon1ScreensaverEntity.ScreensaverEntity, change: "ne"}, async function (obj) { - if (obj.id.substring(0,4) == 'mqtt') { - let Button = obj.id.split('.'); + if (obj.id!.substring(0,4) == 'mqtt') { + let Button = obj.id!.split('.'); if (getState(NSPanel_Path + 'Relay.' + Button[Button.length - 1].substring(5,6)).val != obj.state.val) { await setStateAsync(NSPanel_Path + 'Relay.' + Button[Button.length - 1].substring(5,6), obj.state.val == 'ON' ? true : false); } @@ -1735,8 +1722,8 @@ async function SubscribeMRIcons () { } if (config.mrIcon2ScreensaverEntity.ScreensaverEntity != null) { on({id: config.mrIcon2ScreensaverEntity.ScreensaverEntity, change: "ne"}, async function (obj) { - if (obj.id.substring(0,4) == 'mqtt') { - let Button = obj.id.split('.'); + if (obj.id!.substring(0,4) == 'mqtt') { + let Button = obj.id!.split('.'); if (getState(NSPanel_Path + 'Relay.' + Button[Button.length - 1].substring(5,6)).val != obj.state.val) { await setStateAsync(NSPanel_Path + 'Relay.' + Button[Button.length - 1].substring(5,6), obj.state.val == 'ON' ? true : false); } @@ -1745,7 +1732,7 @@ async function SubscribeMRIcons () { } }); } - } catch (err) { + } catch (err: any) { log('error at function SubscribeMRIcons: ' + err.message, 'warn'); } } @@ -1769,7 +1756,7 @@ async function CreateWeatherAlias () { log('weather alias for daswetter.' + weatherAdapterInstanceNumber + '. already exists', 'info'); } } - } catch (err) { + } catch (err: any) { log('error at function CreateWeatherAlias daswetter.' + weatherAdapterInstanceNumber + '. : ' + err.message, 'warn'); } } else if (weatherAdapterInstance == 'accuweather.' + weatherAdapterInstanceNumber + '.') { @@ -1786,12 +1773,12 @@ async function CreateWeatherAlias () { log('weather alias for accuweather.' + weatherAdapterInstanceNumber + '. already exists', 'info'); } } - } catch (err) { + } catch (err: any) { log('error at function CreateWeatherAlias accuweather.' + weatherAdapterInstanceNumber + '.: ' + err.message, 'warn'); } } } - } catch (err) { + } catch (err: any) { log('error at function CreateWeatherAlias: ' + err.message, 'warn'); } } @@ -1804,14 +1791,14 @@ async function InitPageNavi() { await createStateAsync(NSPanel_Path + 'PageNavi', { type: 'string' }); await setStateAsync(NSPanel_Path + 'PageNavi', { val: {"pagetype": "page","pageId": 0}, ack: true }); } - } catch (err) { + } catch (err: any) { log('error at function InitPageNavi: ' + err.message, 'warn'); } } InitPageNavi(); //PageNavi -on({id: [].concat([NSPanel_Path + 'PageNavi']), change: "any"}, async function (obj) { +on({id: [NSPanel_Path + 'PageNavi'], change: "any"}, async function (obj) { try { if (existsState(NSPanel_Path + 'PageNavi')) { let vObj = JSON.parse(obj.state.val); @@ -1821,7 +1808,7 @@ on({id: [].concat([NSPanel_Path + 'PageNavi']), change: "any"}, async function ( GeneratePage(config.subPages[vObj.pageId]); } } - } catch (err) { + } catch (err: any) { log('error at Trigger PageNavi: ' + err.message, 'warn'); } }); @@ -1852,7 +1839,7 @@ function ScreensaverDimmode(timeDimMode: DimMode) { } else { SendToPanel({ payload: 'dimmode~' + dimmode + '~' + active + '~' + rgb_dec565(config.defaultBackgroundColor) + '~' + rgb_dec565(globalTextColor) + '~' + Sliders2 }); } - } catch (err) { + } catch (err: any) { log('error at function ScreensaverDimmode: ' + err.message, 'warn'); } } @@ -1881,7 +1868,7 @@ async function InitWeatherForecast() { await createAliasAsync(AliasPath + 'ScreensaverInfo.entityChangeTime.ACTUAL', NSPanel_Path + 'ScreensaverInfo.entityChangeTime', true, { type: 'number', role: 'value', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'ScreensaverInfo.entityChangeTime.SET', NSPanel_Path + 'ScreensaverInfo.entityChangeTime', true, { type: 'number', role: 'level', name: 'SET' }); } - } catch (err) { + } catch (err: any) { log('error at function InitWeatherForecast: ' + err.message, 'warn'); } } @@ -1921,7 +1908,7 @@ async function InitDimmode() { } const vTimeDay = getState(NSPanel_Path + 'NSPanel_Dimmode_hourDay').val; const vTimeNight = getState(NSPanel_Path + 'NSPanel_Dimmode_hourNight').val; - const timeDimMode = { + const timeDimMode: DimMode = { dimmodeOn: true, brightnessDay: getState(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay').val, brightnessNight: getState(NSPanel_Path + 'NSPanel_Dimmode_brightnessNight').val, @@ -1947,7 +1934,7 @@ async function InitDimmode() { ScreensaverDimmode(timeDimMode); } } - } catch (err) { + } catch (err: any) { log('error at function InitDimmode: ' + err.message, 'warn'); } } @@ -2052,7 +2039,7 @@ async function InitPopupNotify() { // popupNotify - Notification to a separate page //on({ id: [popupNotifyInternalName], change: 'ne' }, async () => { - on({ id: [].concat([popupNotifyText]), change: 'any' }, async() => { + on({ id: [popupNotifyText], change: 'any' }, async() => { let notification: string; @@ -2118,7 +2105,7 @@ async function InitPopupNotify() { //---- Tasmota Buzzer ----- }); - } catch (err) { + } catch (err: any) { log('error at function InitPopupNotify: ' + err.message, 'warn'); } } @@ -2127,14 +2114,14 @@ InitPopupNotify(); let subscriptions: any = {}; let screensaverEnabled: boolean = false; let pageId = 0; -let activePage = undefined; +let activePage: PageType | undefined = undefined; //Send time to NSPanel let scheduleSendTime = schedule('* * * * *', () => { try { SendTime(); HandleScreensaverUpdate(); - } catch (err) { + } catch (err: any) { log('error at schedule SendTime: ' + err.message, 'warn'); } }); @@ -2148,7 +2135,7 @@ let scheduleSwichScreensaver = schedule('*/' + getState(NSPanel_Path + 'Screensa } else if (getState(NSPanel_Path + "ScreensaverInfo.popupNotifyHeading").val == '' && getState(NSPanel_Path + "ScreensaverInfo.popupNotifyText").val == '' && getState(NSPanel_Path + "ScreensaverInfo.weatherForecast").val == false && getState(NSPanel_Path + "ScreensaverInfo.weatherForecastTimer").val == true) { setStateDelayed(NSPanel_Path + "ScreensaverInfo.weatherForecast", true, (getState(NSPanel_Path + 'ScreensaverInfo.entityChangeTime').val / 2 * 1000), false); } - } catch (err) { + } catch (err: any) { log('error at schedule entityChangeTime: ' + err.message, 'warn'); } }); @@ -2160,7 +2147,7 @@ function InitHWButton1Color() { HandleScreensaverUpdate(); }); } - } catch (err) { + } catch (err: any) { log('error at function InitHWButton1Color: ' + err.message, 'warn'); } } @@ -2173,28 +2160,28 @@ function InitHWButton2Color() { HandleScreensaverUpdate(); }); } - } catch (err) { + } catch (err: any) { log('error at function InitHWButton2Color: ' + err.message, 'warn'); } } InitHWButton2Color(); //Switch between data points and weather forecast in the screensaver -on({id: [].concat([NSPanel_Path + "ScreensaverInfo.weatherForecast"]), change: "ne"}, async function (obj) { +on({id: [NSPanel_Path + "ScreensaverInfo.weatherForecast"], change: "ne"}, async function (obj) { try { weatherForecast = obj.state.val; HandleScreensaverUpdate(); - } catch (err) { + } catch (err: any) { log('error at trigger weatherForecast: ' + err.message, 'warn'); } }); //Update if Changing Values on Wheather Alias -on({id: [].concat(config.weatherEntity + '.TEMP') - .concat(config.weatherEntity + '.ICON'), change: "ne"}, async function (obj) { +on({id: [config.weatherEntity + '.TEMP', + config.weatherEntity + '.ICON'], change: "ne"}, async function (obj) { try { HandleScreensaverUpdate(); - } catch (err) { + } catch (err: any) { log('error at trigger weatherForecast .TEMP + .ICON: ' + err.message, 'warn'); } }); @@ -2238,8 +2225,10 @@ function getDayjsLocale(): String { } else { return locale.substring(0, 2); } - } catch (err) { + } catch (err: any) { log('error in function getDayjsLocale: ' + err.message, 'warn'); + // hier muß eine Return oder ein neuer throw err hin + return ''; } } @@ -2266,7 +2255,7 @@ async function get_locales() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error requesting locales in function get_locales: ' + err.message, 'warn'); } } @@ -2294,7 +2283,7 @@ async function get_locales_servicemenu() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error requesting locales in function get_locales_servicemenu: ' + err.message, 'warn'); } } @@ -2424,7 +2413,7 @@ async function check_updates() { log('No Updates for NSPanel available', 'info'); } - } catch (err) { + } catch (err: any) { log('error at function check_updates: ' + err.message, 'warn'); } } @@ -2452,7 +2441,7 @@ on({ id: NSPanel_Path + 'popupNotify.popupNotifyAction', change: 'any' }, async log('Button2 was pressed', 'info'); } } - } catch (err) { + } catch (err: any) { log('error at Trigger popupNotifyAction: ' + err.message, 'warn'); } }); @@ -2484,7 +2473,7 @@ async function get_panel_update_data() { check_version_tft_firmware(); check_online_display_firmware(); } - } catch (err) { + } catch (err: any) { log('error at function get_panel_update_data: ' + err.message, 'warn'); } } @@ -2499,7 +2488,7 @@ function get_current_tasmota_ip_address() { } return infoObj.Info2.IPAddress; - } catch (err) { + } catch (err: any) { log('error at function get_current_tasmota_ip_address: ' + err.message, 'warn'); } } @@ -2536,7 +2525,7 @@ function get_online_tasmota_firmware_version() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error requesting firmware in function get_online_tasmota_firmware_version: ' + err.message, 'warn'); } } @@ -2576,7 +2565,7 @@ function get_current_berry_driver_version() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error requesting firmware in function get_current_berry_driver_version: ' + err.message, 'warn'); } } @@ -2630,7 +2619,7 @@ function get_tasmota_status0() { await setStateAsync(NSPanel_Path + 'Tasmota.Wifi.Signal', { val: Tasmota_JSON.StatusSTS.Wifi.Signal, ack: true }); await setStateAsync(NSPanel_Path + 'Tasmota.Product', { val: 'SONOFF NSPanel', ack: true }); if (Debug) log('current tasmota firmware version => ' + tasmoVersion, 'info'); - } catch (err) { + } catch (err: any) { log('error setState in function get_tasmota_status0' + err.message, 'warn'); } if (autoCreateAlias) { @@ -2666,7 +2655,7 @@ function get_tasmota_status0() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error requesting firmware in function get_tasmota_status0: ' + err.message, 'warn'); } } @@ -2703,7 +2692,7 @@ function get_online_berry_driver_version() { }); } - } catch (err) { + } catch (err: any) { log('error requesting firmware in function get_online_berry_driver_version: ' + err.message, 'warn'); } } @@ -2737,7 +2726,7 @@ function check_version_tft_firmware() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error requesting firmware in function check_version_tft_firmware: ' + err.message, 'warn'); } } @@ -2769,7 +2758,7 @@ function check_online_display_firmware() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error requesting firmware in function check_online_display_firmware: ' + err.message, 'warn'); } } @@ -2795,7 +2784,7 @@ on({ id: config.panelRecvTopic }, async (obj) => { } } } - } catch (err) { + } catch (err: any) { log('error at trigger rceiving CustomRecv: ' + err.message, 'warn'); } } @@ -2823,7 +2812,7 @@ function update_berry_driver_version() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error at function update_berry_driver_version: ' + err.message, 'warn'); } } @@ -2868,7 +2857,7 @@ function update_tft_firmware() { log(error, 'warn'); }); - } catch (err) { + } catch (err: any) { log('error request in function update_tft_firmware: ' + err.message, 'warn'); } } @@ -2916,7 +2905,7 @@ function update_tasmota_firmware() { }); } - } catch (err) { + } catch (err: any) { log('error request in function update_tasmota_firmware: ' + err.message, 'warn'); } } @@ -2934,7 +2923,7 @@ on({ id: config.panelRecvTopic.substring(0, config.panelRecvTopic.length - 'RESU //check_updates(); } } - } catch (err) { + } catch (err: any) { log('error at trigger with reading senor-data: '+ err.message, 'warn'); } }); @@ -2949,11 +2938,11 @@ on({ id: config.panelRecvTopic, change: 'any' }, async function (obj) { let split = json.CustomRecv.split(','); HandleMessage(split[0], split[1], parseInt(split[2]), split); - } catch (err) { + } catch (err: any) { log('error json.split in Trigger panelRecTopic: ' + err.message, 'warn'); } } - } catch (err) { + } catch (err: any) { log('error at Trigger panelRecTopic: ' + err.message, 'warn'); } }); @@ -2971,7 +2960,7 @@ async function SendToPanel(val: Payload | Payload[]) { setState(config.panelSendTopic, val.payload); } - } catch (err) { + } catch (err: any) { log('error at function SendToPanel: ' + err.message, 'warn'); } } @@ -2983,15 +2972,15 @@ on({ id: NSPanel_Alarm_Path + 'Alarm.AlarmState', change: 'ne' }, async (obj) => log('Trigger AlarmState aktivePage: ' + activePage, 'info'); } if (NSPanel_Path == getState(NSPanel_Alarm_Path + 'Alarm.PANEL').val) { - GeneratePage(activePage); + if (activePage != undefined) GeneratePage(activePage!); } } - } catch (err) { + } catch (err: any) { log('error at Trigger AlarmState: ' + err.message, 'warn'); } }); -function HandleMessage(typ: string, method: string, page: number, words: Array): void { +function HandleMessage(typ: string, method: string, page: number | undefined, words: Array | undefined): void { try { if (typ == 'event') { switch (method) { @@ -3013,30 +3002,35 @@ function HandleMessage(typ: string, method: string, page: number, words: Array sleepReached', 'info'); break; case 'pageOpenDetail': - screensaverEnabled = false; - UnsubscribeWatcher(); - if (Debug) { - log('HandleMessage -> pageOpenDetail ' + words[0] + ' - ' + words[1] + ' - ' + words[2] + ' - ' + words[3] + ' - ' + words[4], 'info'); - } - let tempId: PageItem['id']; - let tempPageItem = words[3].split('?'); - let placeId = undefined; - if (!isNaN(parseInt(tempPageItem[0]))){ - tempId = activePage.items[tempPageItem[0]].id; - placeId = tempPageItem[0] - } else { - tempId = tempPageItem[0]; - } - let pageItem: PageItem = findPageItem(tempId); - if (pageItem !== undefined) { - SendToPanel(GenerateDetailPage(words[2], tempPageItem[1], pageItem, placeId)); + if (words != undefined) { + screensaverEnabled = false; + UnsubscribeWatcher(); + if (Debug) { + log('HandleMessage -> pageOpenDetail ' + words[0] + ' - ' + words[1] + ' - ' + words[2] + ' - ' + words[3] + ' - ' + words[4], 'info'); + } + let tempId: PageItem['id']; + let tempPageItem = words[3].split('?'); + let placeId: number | undefined = undefined; + if (!isNaN(parseInt(tempPageItem[0]))){ + tempId = activePage!.items[tempPageItem[0]].id; + placeId = parseInt(tempPageItem[0]) + if (tempId == undefined) { + throw new Error(`Missing id in HandleMessage!`) + } + } else { + tempId = tempPageItem[0]; + } + let pageItem: PageItem = findPageItem(tempId); + if (pageItem !== undefined) { + SendToPanel(GenerateDetailPage(words[2], tempPageItem[1], pageItem, placeId)); + } } break; case 'buttonPress2': screensaverEnabled = false; HandleButtonEvent(words); if (Debug) { - log('HandleMessage -> buttonPress2 ' + words[0] + ' - ' + words[1] + ' - ' + words[2] + ' - ' + words[3] + ' - ' + words[4], 'info'); + if (words != undefined) log('HandleMessage -> buttonPress2 ' + words[0] + ' - ' + words[1] + ' - ' + words[2] + ' - ' + words[3] + ' - ' + words[4], 'info'); } break; case 'renderCurrentPage': @@ -3053,15 +3047,15 @@ function HandleMessage(typ: string, method: string, page: number, words: Array e.id === searching); + let pageItem = activePage!.items.find(e => e.id === searching); if (pageItem !== undefined) { if (Debug) log('findPageItem -> pageItem ' + JSON.stringify(pageItem), 'info'); @@ -3075,56 +3069,56 @@ function findPageItem(searching: String): PageItem { }); if (Debug) log('findPageItem -> pageItem SubPage ' + JSON.stringify(pageItem), 'info'); - + //@ts-ignore ticaki bitte lösen, pageItem kann undefined sein. return pageItem; - } catch (err) { + } catch (err: any) { log('error at function findPageItem: ' + err.message, 'warn'); } } -function GeneratePage(page: Page): void { +function GeneratePage(page: PageType): void { try { activePage = page; - setIfExists(NSPanel_Path + 'ActivePage.type', activePage.type); - setIfExists(NSPanel_Path + 'ActivePage.heading', activePage.heading); - setIfExists(NSPanel_Path + 'ActivePage.id0', activePage.items[0].id); + setIfExists(NSPanel_Path + 'ActivePage.type', activePage!.type); + setIfExists(NSPanel_Path + 'ActivePage.heading', activePage!.heading); + setIfExists(NSPanel_Path + 'ActivePage.id0', activePage!.items[0].id); switch (page.type) { case 'cardEntities': - SendToPanel(GenerateEntitiesPage(page)); + SendToPanel(GenerateEntitiesPage(page)); break; case 'cardThermo': - SendToPanel(GenerateThermoPage(page)); + SendToPanel(GenerateThermoPage(page)); break; case 'cardGrid': - SendToPanel(GenerateGridPage(page)); + SendToPanel(GenerateGridPage(page)); break; case 'cardGrid2': - SendToPanel(GenerateGridPage2(page)); + SendToPanel(GenerateGridPage2(page)); break; case 'cardMedia': useMediaEvents = true; - SendToPanel(GenerateMediaPage(page)); + SendToPanel(GenerateMediaPage(page)); break; case 'cardAlarm': - SendToPanel(GenerateAlarmPage(page)); + SendToPanel(GenerateAlarmPage(page)); break; case 'cardQR': - SendToPanel(GenerateQRPage(page)); + SendToPanel(GenerateQRPage(page)); break; case 'cardPower': - SendToPanel(GeneratePowerPage(page)); + SendToPanel(GeneratePowerPage(page)); break; case 'cardChart': - SendToPanel(GenerateChartPage(page)); + SendToPanel(GenerateChartPage(page)); break; case 'cardLChart': - SendToPanel(GenerateChartPage(page)); + SendToPanel(GenerateChartPage(page)); break; case 'cardUnlock': - SendToPanel(GenerateUnlockPage(page)); + SendToPanel(GenerateUnlockPage(page)); break; } - } catch (err) { + } catch (err: any) { if (err.message == "Cannot read properties of undefined (reading 'type')") { log('Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.', 'warn'); } else { @@ -3167,7 +3161,7 @@ function HandleHardwareButton(method: string): void { screensaverEnabled = true; break; } - } catch (err) { + } catch (err: any) { log('error at function HandleHardwareButton: ' + err.message, 'warn'); } } @@ -3191,7 +3185,7 @@ function SendDate(): void { SendToPanel({ payload: 'date~' + _SendDate }); } - } catch (err) { + } catch (err: any) { if (err.message = 'Cannot convert undefined or null to object') { log('Datumsformat noch nicht initialisiert', 'info'); } else { @@ -3207,7 +3201,7 @@ function SendTime(): void { const min = (d.getMinutes() < 10 ? '0' : '') + d.getMinutes(); SendToPanel({ payload: 'time~' + hr + ':' + min }); - } catch (err) { + } catch (err: any) { log('error at function SendTime: ' + err.message, 'warn'); } } @@ -3218,8 +3212,9 @@ function GenerateEntitiesPage(page: PageEntities): Payload[] { out_msgs = [{ payload: 'pageType~cardEntities' }] out_msgs.push({ payload: GeneratePageElements(page) }); return out_msgs - } catch (err) { + } catch (err: any) { log('error at function GenerateEntitiesPage: ' + err.message, 'warn'); + return []; } } @@ -3228,8 +3223,9 @@ function GenerateGridPage(page: PageGrid): Payload[] { let out_msgs: Array = [{ payload: 'pageType~cardGrid' }]; out_msgs.push({ payload: GeneratePageElements(page) }); return out_msgs; - } catch (err) { + } catch (err: any) { log('error at function GenerateGridPage: ' + err.message, 'warn'); + return []; } } @@ -3238,12 +3234,13 @@ function GenerateGridPage2(page: PageGrid2): Payload[] { let out_msgs: Array = [{ payload: 'pageType~cardGrid2' }]; out_msgs.push({ payload: GeneratePageElements(page) }); return out_msgs; - } catch (err) { + } catch (err: any) { log('error at function GenerateGridPage2: ' + err.message, 'warn'); + return []; } } -function GeneratePageElements(page: Page): string { +function GeneratePageElements(page: PageType): string { try { activePage = page; let maxItems = 0; @@ -3288,13 +3285,14 @@ function GeneratePageElements(page: Page): string { for (let index = 0; index < maxItems; index++) { if (page.items[index] !== undefined) { - pageData += CreateEntity(page.items[index], index, page.useColor); + pageData += CreateEntity(page.items[index], index, 'useColor' in page ? page.useColor : false ); } } if (Debug) log('GeneratePageElements pageData ' + pageData, 'info'); return pageData; - } catch (err) { + } catch (err: any) { log('error at function GeneratePageElements: ' + err.message, 'warn'); + return ''; } } @@ -3310,7 +3308,7 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = let buttonText: string = 'PRESS'; let type: string; - if (existsState(pageItem.id + '.ACTUAL') == false) { + if (pageItem.id && existsState(pageItem.id + '.ACTUAL') == false) { if (pageItem.popupTimerType == 'TimeCard' && pageItem.autoCreateALias == true) { log(NSPanel_Path + 'Userdata.' + pageItem.id + '.Time') createStateAsync(NSPanel_Path + 'Userdata.' + pageItem.id + '.Time', '0', { type: 'number' }); @@ -3322,11 +3320,11 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = } // ioBroker - if (existsObject(pageItem.id) || pageItem.navigate === true) { + if (pageItem.id && existsObject(pageItem.id) || pageItem.navigate === true) { let iconColor = rgb_dec565(config.defaultColor); let optVal = '0'; - let val = null; + let val: any = null; let o:any if (pageItem.id != null && existsObject(pageItem.id)) { @@ -3622,7 +3620,7 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = if (existsState(pageItem.id + '.HUE')) { if (getState(pageItem.id + '.HUE').val != null) { let huecolor = hsv2rgb(getState(pageItem.id + '.HUE').val, 1, 1); - let rgb = { red: Math.round(huecolor[0]), green: Math.round(huecolor[1]), blue: Math.round(huecolor[2]) }; + let rgb: RGB = { red: Math.round(huecolor[0]), green: Math.round(huecolor[1]), blue: Math.round(huecolor[2]) }; iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); } } @@ -3673,7 +3671,7 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = let rgbRed = getState(pageItem.id + '.RED').val; let rgbGreen = getState(pageItem.id + '.GREEN').val; let rgbBlue = getState(pageItem.id + '.BLUE').val; - let rgb = { red: Math.round(rgbRed), green: Math.round(rgbGreen), blue: Math.round(rgbBlue) }; + let rgb: RGB = { red: Math.round(rgbRed), green: Math.round(rgbGreen), blue: Math.round(rgbBlue) }; iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); } } @@ -3705,7 +3703,7 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = let hexRed = parseInt(hex[1] + hex[2], 16); let hexGreen = parseInt(hex[3] + hex[4], 16); let hexBlue = parseInt(hex[5] + hex[6], 16); - let rgb = { red: Math.round(hexRed), green: Math.round(hexGreen), blue: Math.round(hexBlue) }; + let rgb: RGB = { red: Math.round(hexRed), green: Math.round(hexGreen), blue: Math.round(hexBlue) }; iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); } } @@ -3769,7 +3767,7 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = case 'gate': type = 'text'; - let gateState: string; + let gateState: string | undefined = undefined; if (existsState(pageItem.id + '.ACTUAL')) { if (getState(pageItem.id + '.ACTUAL').val == 0 || getState(pageItem.id + '.ACTUAL').val === false) { @@ -3784,6 +3782,9 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = } } + if (gateState == undefined) { + throw new Error(`Missing ${pageItem.id}.ACTUAL for type ${type}`) + } if (Debug) log('CreateEntity Icon role gate ~' + type + '~' + placeId + '~' + iconId + '~' + iconColor + '~' + name + '~' + gateState, 'info'); return '~' + type + '~' + placeId + '~' + iconId + '~' + iconColor + '~' + name + '~' + gateState; @@ -3863,7 +3864,7 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = let valueScale = val; if (iconvalmin == 0 && iconvalmax == 1) { - iconColor = (getState(pageItem.id).val == 1) ? rgb_dec565(colorScale0) : rgb_dec565(colorScale10); + iconColor = (!pageItem.id || getState(pageItem.id).val == 1) ? rgb_dec565(colorScale0) : rgb_dec565(colorScale10); } else { if (iconvalbest == iconvalmin) { valueScale = scale(valueScale,iconvalmin, iconvalmax, 10, 0); @@ -4071,11 +4072,13 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = } if (Debug) log('CreateEntity return ~delete~~~~~', 'info'); return '~delete~~~~~'; - } catch (err) { + } catch (err: any) { if (err.message == "Cannot read properties of undefined (reading 'common')") { log('Found Alias without channel: ' + pageItem.id + '! Please correct the Alias', 'warn'); + return ''; } else { log('error at function CreateEntity: ' + err.message, 'warn'); + return ''; } } } @@ -4098,7 +4101,7 @@ function findLocale(controlsObject: string, controlsState: string): string { return controlsState; } - } catch (err) { + } catch (err: any) { if (err.message.substring(0, 35) == 'Cannot read properties of undefined') { if (Debug) { log('function findLocale: missing translation: ' + controlsObject + ' - ' + controlsState, 'info'); @@ -4132,7 +4135,7 @@ function findLocaleServMenu(controlsState: string): string { } } - } catch (err) { + } catch (err: any) { if (err.message.substring(0, 35) == 'Cannot read properties of undefined') { if (Debug) { log('function findLocale: missing translation: ' + controlsState, 'info'); @@ -4169,8 +4172,9 @@ function GetIconColor(pageItem: PageItem, value: (boolean | number), useColors: } return rgb_dec565(pageItem.offColor !== undefined ? pageItem.offColor : config.defaultOffColor); - } catch (err) { + } catch (err: any) { log('error at function GetIconColor: ' + err.message, 'warn'); + return -1; } } @@ -4188,15 +4192,15 @@ function RegisterEntityWatcher(id: string): void { SendToPanel({ payload: GeneratePageElements(config.button2.page) }); } if (activePage !== undefined) { - SendToPanel({ payload: GeneratePageElements(activePage) }); + SendToPanel({ payload: GeneratePageElements(activePage!) }); } })); - } catch (err) { + } catch (err: any) { log('error at function RegisterEntityWatcher: ' + err.message, 'warn'); } } -function RegisterDetailEntityWatcher(id: string, pageItem: PageItem, type: string, placeId: number): void { +function RegisterDetailEntityWatcher(id: string, pageItem: PageItem, type: string, placeId: number | undefined): void { try { if (subscriptions.hasOwnProperty(id)) { return; @@ -4207,7 +4211,7 @@ function RegisterDetailEntityWatcher(id: string, pageItem: PageItem, type: strin subscriptions[id] = (on({ id: id, change: 'any' }, () => { SendToPanel(GenerateDetailPage(type, undefined, pageItem, placeId)); })) - } catch (err) { + } catch (err: any) { log('error at function RegisterDetailEntityWatcher: ' + err.message, 'warn'); } } @@ -4227,8 +4231,9 @@ function GetUnitOfMeasurement(id: string): string { } return ''; - } catch (err) { + } catch (err: any) { log('error at function GetUnitOfMeasurement: ' + err.message, 'warn'); + return '' } } @@ -4240,7 +4245,7 @@ function GenerateThermoPage(page: PageThermo): Payload[] { out_msgs.push({ payload: 'pageType~cardThermo' }); // ioBroker - if (existsObject(id)) { + if (id && existsObject(id)) { let o = getObject(id); let name = page.heading !== undefined ? page.heading : o.common.name.de; let currentTemp = 0; @@ -4607,8 +4612,9 @@ function GenerateThermoPage(page: PageThermo): Payload[] { log('GenerateThermoPage payload: ' + out_msgs, 'info'); } return out_msgs; - } catch (err) { + } catch (err: any) { log('error at function GenerateThermoPage: ' + err.message, 'warn'); + return []; } } @@ -4647,19 +4653,19 @@ function unsubscribeMediaSubscriptions(): void { } function subscribeMediaSubscriptions(id: string): void { - on({id: [].concat([id + '.STATE']) - .concat([id + '.VOLUME']) - .concat([id + '.ARTIST']) - .concat([id + '.ALBUM']) - .concat([id + '.TITLE']) - .concat([id + '.REPEAT']) - .concat([id + '.SHUFFLE']), change: "any"}, async function () { + on({id: [id + '.STATE', + id + '.VOLUME', + id + '.ARTIST', + id + '.ALBUM', + id + '.TITLE', + id + '.REPEAT', + id + '.SHUFFLE'], change: "any"}, async function () { (function () { if (timeoutMedia) { clearTimeout(timeoutMedia); timeoutMedia = null; } })(); timeoutMedia = setTimeout(async function () { if (useMediaEvents) { - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); } },50) @@ -4667,15 +4673,15 @@ function subscribeMediaSubscriptions(id: string): void { } function subscribeMediaSubscriptionsSonosAdd(id: string): void { - on({id: [].concat([id + '.QUEUE']) - .concat([id + '.DURATION']) - .concat([id + '.ELAPSED']), change: "any"}, async function () { + on({id: [id + '.QUEUE', + id + '.DURATION', + id + '.ELAPSED'], change: "any"}, async function () { (function () { if (timeoutMedia) { clearTimeout(timeoutMedia); timeoutMedia = null; } })(); timeoutMedia = setTimeout(async function () { if (useMediaEvents) { - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { - GeneratePage(activePage); + GeneratePage(activePage!); }, 50); } },50) @@ -4683,14 +4689,14 @@ function subscribeMediaSubscriptionsSonosAdd(id: string): void { } function subscribeMediaSubscriptionsAlexaAdd(id: string): void { - on({id: [].concat([id + '.DURATION']) - .concat([id + '.ELAPSED']), change: "any"}, async function () { + on({id: [id + '.DURATION', + id + '.ELAPSED'], change: "any"}, async function () { (function () { if (timeoutMedia) { clearTimeout(timeoutMedia); timeoutMedia = null; } })(); timeoutMedia = setTimeout(async function () { if (useMediaEvents) { - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { - GeneratePage(activePage); + GeneratePage(activePage!); }, 50); } },50) @@ -4720,7 +4726,7 @@ async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlay await createAliasAsync(id + '.VOLUME', dpPath + '.Player.volume', true, { type: 'number', role: 'level.volume', name: 'VOLUME' }); await createAliasAsync(id + '.REPEAT', dpPath + '.Player.controlRepeat', true, { type: 'boolean', role: 'media.mode.repeat', name: 'REPEAT' }); await createAliasAsync(id + '.SHUFFLE', dpPath + '.Player.controlShuffle', true, { type: 'boolean', role: 'media.mode.shuffle', name: 'SHUFFLE' }); - } catch (err) { + } catch (err: any) { log('error at function createAutoMediaAlias Adapter Alexa2: ' + err.message, 'warn'); } } @@ -4754,7 +4760,7 @@ async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlay await createAliasAsync(id + '.REPEAT', dpPath + 'player.repeat', true, { type: 'string', role: 'value', name: 'REPEAT' }); await createAliasAsync(id + '.SHUFFLE', dpPath + 'player.shuffle', true, { type: 'string', role: 'value', name: 'SHUFFLE' }); - } catch (err) { + } catch (err: any) { log('error at function createAutoMediaAlias Adapter spotify-premium: ' + err.message, 'warn'); } } @@ -4781,7 +4787,7 @@ async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlay await createAliasAsync(id + '.VOLUME', dpPath + '.volume', true, { type: 'number', role: 'level.volume', name: 'VOLUME' }); await createAliasAsync(id + '.REPEAT', dpPath + '.repeat', true, { type: 'number', role: 'media.mode.repeat', name: 'REPEAT' }); await createAliasAsync(id + '.SHUFFLE', dpPath + '.shuffle', true, { type: 'boolean', role: 'media.mode.shuffle', name: 'SHUFFLE' }); - } catch (err) { + } catch (err: any) { log('error at function createAutoMediaAlias Adapter sonos: ' + err.message, 'warn'); } } @@ -4815,7 +4821,7 @@ async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlay await createAliasAsync(id + '.REPEAT', dpPath + 'playbackInfo.repeat', true, { type: 'number', role: 'media.mode.repeat', name: 'REPEAT' }); await createAliasAsync(id + '.SHUFFLE', dpPath + 'queue.shuffle', true, { type: 'boolean', role: 'media.mode.shuffle', name: 'SHUFFLE' }); await createAliasAsync(id + '.status', dpPath + 'playbackInfo.status', true, { type: 'string', role: 'media.state', name: 'status' }); - } catch (err) { + } catch (err: any) { log('error function createAutoMediaAlias Adapter volumio: ' + err.message, 'warn'); } } @@ -4841,7 +4847,7 @@ async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlay await createAliasAsync(id + '.VOLUME_ACTUAL', dpPath + '.Volume', true, { type: 'number', role: 'value.volume', name: 'VOLUME_ACTUAL'}); await createAliasAsync(id + '.SHUFFLE', dpPath + '.PlaylistShuffle', true, { type: 'string', role: 'media.mode.shuffle', name: 'SHUFFLE', alias: { id: dpPath + '.PlaylistShuffle', read: 'val !== 0 ? \'on\' : \'off\'', write: 'val === \'off\' ? 0 : 1' }}); await createAliasAsync(id + '.REPEAT', dpPath + '.PlaylistRepeat', true, {type: 'number', role: 'media.mode.repeat', name: 'REPEAT'}); - } catch (err) { + } catch (err: any) { log('error at function createAutoMediaAlias Adapter Squeezebox: ' + err.message, 'warn'); } } @@ -4854,16 +4860,19 @@ function GenerateMediaPage(page: PageMedia): Payload[] { try { unsubscribeMediaSubscriptions(); + if (!page.items[0].id) throw new Error ('Missing page id for cardMedia!'); + let id = page.items[0].id; let out_msgs: Array = []; - - let vInstance = page.items[0].adapterPlayerInstance; + + if (!page.items[0].adapterPlayerInstance!) throw new Error('page.items[0].adapterPlayerInstance is undefined!') + let vInstance = page.items[0].adapterPlayerInstance!; let v1Adapter = vInstance.split('.'); let v2Adapter = v1Adapter[0]; // Some magic to change the ID of the alias, since speakers are not a property but separate objects if(v2Adapter == 'squeezeboxrpc') { - if(getObject(id).type != 'channel') { + if(id && getObject(id).type != 'channel') { id = id + '.' + page.items[0].mediaDevice; page.items[0].id = id; page.heading = page.items[0].mediaDevice ?? ''; @@ -4880,7 +4889,7 @@ function GenerateMediaPage(page: PageMedia): Payload[] { if (page.items[0].autoCreateALias) { let vMediaDevice = (page.items[0].mediaDevice != undefined) ? page.items[0].mediaDevice : ''; - createAutoMediaAlias(id, vMediaDevice, page.items[0].adapterPlayerInstance); + createAutoMediaAlias(id, vMediaDevice, page.items[0].adapterPlayerInstance!); } // Leave the display on if the alwaysOnDisplay parameter is specified (true) @@ -5382,8 +5391,9 @@ function GenerateMediaPage(page: PageMedia): Payload[] { log('GenerateMediaPage payload: ' + JSON.stringify(out_msgs), 'info'); } return out_msgs - } catch (err) { + } catch (err: any) { log('error at function GenerateMediaPage: ' + err.message, 'warn'); + return []; } } @@ -5410,7 +5420,7 @@ async function createAutoAlarmAlias (id: string, nsPath: string){ } } } - } catch (err) { + } catch (err: any) { log('error at function createAutoAlarmAlias: ' + err.message, 'warn'); } } @@ -5418,6 +5428,7 @@ async function createAutoAlarmAlias (id: string, nsPath: string){ function GenerateAlarmPage(page: PageAlarm): Payload[] { try { activePage = page; + let id = page.items[0].id let name = page.heading; @@ -5426,12 +5437,19 @@ function GenerateAlarmPage(page: PageAlarm): Payload[] { let nsPath = NSPanel_Alarm_Path + 'Alarm'; if (page.items[0].autoCreateALias) { + if (!id) throw new Error ('Missing pageItem.id for cardAlarm! Property autoCreateAlias is true!'); createAutoAlarmAlias(id, nsPath); } - + + type AlarmEntityType = 'triggered' | 'armed' | 'disarmed' | 'pending' | 'arming'; + const AlarmEntityElements: AlarmEntityType[] = ['triggered', 'armed', 'disarmed', 'pending', 'arming'] + if (existsState(nsPath + '.AlarmPin') && existsState(nsPath + '.AlarmState') && existsState(nsPath + '.AlarmType')) { //let entityPin = getState(nsPath + 'AlarmPin').val; - let entityState = getState(nsPath + '.AlarmState').val; + let entityState: AlarmEntityType = getState(nsPath + '.AlarmState').val as AlarmEntityType; + if ( AlarmEntityElements.indexOf(entityState) == -1 ) { + throw new Error(`Invalid value in state ${nsPath}.AlarmPin!`) + } //let entityType = getState(nsPath + 'AlarmType').val; let arm1: string, arm2: string, arm3: string, arm4: string; let arm1ActionName: string, arm2ActionName: string, arm3ActionName: string, arm4ActionName: string; @@ -5457,9 +5475,7 @@ function GenerateAlarmPage(page: PageAlarm): Payload[] { arm3ActionName = ''; //arm3ActionName*~* arm4 = ''; //arm4*~* arm4ActionName = ''; //arm4ActionName*~* - } - - if (entityState == 'disarmed' || entityState == 'arming' || entityState == 'pending') { + } else/* if (entityState == 'disarmed' || entityState == 'arming' || entityState == 'pending')*/ { if (page.items[0].actionStringArray !== undefined && page.items[0].actionStringArray[0] !== '') { arm1 = page.items[0].actionStringArray[0]; } else { @@ -5484,11 +5500,10 @@ function GenerateAlarmPage(page: PageAlarm): Payload[] { arm4 = formatInSelText(findLocale('alarm_control_panel', 'arm_vacation')); //'Besuch'; //arm4*~* } arm4ActionName = 'A4'; //arm4ActionName*~* - } - - if (Debug) { - log('GenerateAlarmPage String for arm1: ' + arm1 + ', arm2: ' + arm2 + ', arm3: ' + arm3 + ', arm4: ' + arm4, 'info'); - } + if (Debug) { + log('GenerateAlarmPage String for arm1: ' + arm1 + ', arm2: ' + arm2 + ', arm3: ' + arm3 + ', arm4: ' + arm4, 'info'); + } + } if (entityState == 'armed') { icon = Icons.GetIcon('shield-home'); //icon*~* @@ -5514,7 +5529,7 @@ function GenerateAlarmPage(page: PageAlarm): Payload[] { numpadStatus = 'enable'; //numpadStatus*~* flashing = 'enable' //flashing* } - + out_msgs.push({ payload: 'entityUpd~' + //entityUpd~* name + '~' + //heading @@ -5539,8 +5554,10 @@ function GenerateAlarmPage(page: PageAlarm): Payload[] { } return out_msgs; } - } catch (err) { + return []; + } catch (err: any) { log('error at function GenerateAlarmPage: ' + err.message, 'warn'); + return []; } } @@ -5561,7 +5578,7 @@ async function createAutoUnlockAlias(id: string, dpPath: string) { } } } - } catch (err) { + } catch (err: any) { log('error at function createAutoUnlockAlias: ' + err.message, 'warn'); } @@ -5584,6 +5601,7 @@ function GenerateUnlockPage(page: PageUnlock): Payload[] { dpPath = (dpPath + 'Unlock.'); if (page.items[0].autoCreateALias) { + if (!id) throw new Error ('Missing pageItem.id for cardUnlock! Property autoCreateAlias is true!'); createAutoUnlockAlias(id, dpPath) } @@ -5619,8 +5637,9 @@ function GenerateUnlockPage(page: PageUnlock): Payload[] { } return out_msgs; - } catch (err) { + } catch (err: any) { log('error at function GenerateUnlockPage: ' + err.message, 'warn'); + return []; } } @@ -5642,7 +5661,7 @@ async function createAutoQRAlias(id:string, dpPath:string) { } } } - } catch (err) { + } catch (err: any) { log('error at function createAutoQRkAlias: ' + err.message, 'warn'); } } @@ -5650,7 +5669,7 @@ async function createAutoQRAlias(id:string, dpPath:string) { function GenerateQRPage(page: PageQR): Payload[] { try { activePage = page; - + if (!page.items[0].id) throw new Error ('Missing pageItem.id for cardQRPage!'); let id = page.items[0].id; let out_msgs: Array = []; out_msgs.push({ payload: 'pageType~cardQR' }); @@ -5734,8 +5753,9 @@ function GenerateQRPage(page: PageQR): Payload[] { } return out_msgs; - } catch (err) { + } catch (err: any) { log('error at function GenerateQRPage: ' + err.message, 'warn'); + return []; } } @@ -5759,7 +5779,7 @@ function subscribePowerSubscriptions(id: string): void { on({id: id + '.ACTUAL', change: "ne"}, async function () { (function () { if (timeoutPower) { clearTimeout(timeoutPower); timeoutPower = null; } })(); timeoutPower = setTimeout(async function () { - GeneratePage(activePage); + GeneratePage(activePage!); },25) }); } @@ -5767,7 +5787,9 @@ function subscribePowerSubscriptions(id: string): void { function GeneratePowerPage(page: PagePower): Payload[] { try { - let obj:object; + if (!page.items[0].id) throw new Error ('Missing pageItem.id for PowerPage!'); + + let obj:object = {}; let demoMode = false; if (page.items[0].id == undefined){ log('No PageItem defined - cardPower demo mode active', 'info'); @@ -5878,8 +5900,9 @@ function GeneratePowerPage(page: PagePower): Payload[] { if (Debug) log('GeneratePowerPage payload: ' + JSON.stringify(out_msgs), 'info'); return out_msgs; - } catch (err) { + } catch (err: any) { log('error at function GeneratePowerPage: ' + err.message, 'warn'); + return []; } } @@ -5894,6 +5917,12 @@ function GenerateChartPage(page: PageChart): Payload[] { let heading = page.heading !== undefined ? page.heading : "Chart..."; let txt = getState(id + '.ACTUAL').val; + if (!page.items[0].yAxisTicks) { + throw new Error (`Page item ${id} yAxisTicks is undefined!`) + } + if (!page.items[0].onColor) { + throw new Error (`Page item ${id} onColor is undefined!`) + } let yAxisTicks = (typeof page.items[0].yAxisTicks == 'object') ? page.items[0].yAxisTicks : JSON.parse(getState(page.items[0].yAxisTicks).val); @@ -5910,8 +5939,9 @@ function GenerateChartPage(page: PageChart): Payload[] { if (Debug) log('GenerateChartPage payload: ' + JSON.stringify(out_msgs), 'info'); return out_msgs; - } catch (err) { + } catch (err: any) { log('error at function GenerateChartPage: ' + err.message, 'warn'); + return []; } } @@ -5929,11 +5959,10 @@ function setIfExists(id: string, value: any, type: string | null = null): boolea return true; } } - - return false; - } catch (err) { + } catch (err: any) { log('error at function setIfExists: ' + err.message, 'warn'); } + return false; } function toggleState(id: string): boolean { @@ -5943,10 +5972,10 @@ function toggleState(id: string): boolean { setIfExists(id, !getState(id).val); return true; } - return false; - } catch (err) { + } catch (err: any) { log('error at function toggleState: ' + err.message, 'warn'); } + return false; } // Begin Monobutton @@ -5958,10 +5987,11 @@ function triggerButton(id: string): boolean{ setTimeout(function() { setState(id, false) }, 250); return true; } - return false; - } catch (err) { + + } catch (err: any) { log('error at function triggerButton: ' + err.message, 'warn'); - } + } + return false; } // End Monobutton @@ -5980,9 +6010,10 @@ function HandleButtonEvent(words: any): void { let pageItemID: string = ''; if (!isNaN(id)) { - pageItemID = activePage.items[id].id; + if (activePage!.items[id].id == undefined) throw new Error ('Missing pageItem.id in HandleButtonEvent!'); + pageItemID = activePage!.items[id].id!; if (Debug) { - log('HandleButtonEvent activePage: ' + activePage.items.length + ' id: ' + id + ' tempid: ' + tempid + ' pageItemId: ' + pageItemID); + log('HandleButtonEvent activePage: ' + activePage!.items.length + ' id: ' + id + ' tempid: ' + tempid + ' pageItemId: ' + pageItemID); } id = pageItemID }; @@ -6026,15 +6057,15 @@ function HandleButtonEvent(words: any): void { pageNum = (((pageId - 1) % config.pages.length) + config.pages.length) % config.pages.length; pageId = pageNum; UnsubscribeWatcher(); - if (activePage != undefined && activePage.parent != undefined) { + if (activePage != undefined && activePage!.parent != undefined) { //update pageID for (let i = 0; i < config.pages.length; i++) { - if (config.pages[i] == activePage.parent) { + if (config.pages[i] == activePage!.parent) { pageId = i; break; } } - GeneratePage(activePage.parent); + GeneratePage(activePage!.parent); } else { GeneratePage(config.pages[pageId]); @@ -6050,21 +6081,22 @@ function HandleButtonEvent(words: any): void { break; case 'bSubNext': UnsubscribeWatcher(); - GeneratePage(eval(activePage.next)); + // check this please + GeneratePage(eval(activePage!.next!)); break; case 'bPrev': pageNum = (((pageId - 1) % config.pages.length) + config.pages.length) % config.pages.length; pageId = pageNum; UnsubscribeWatcher(); - if (activePage != undefined && activePage.parent != undefined) { + if (activePage != undefined && activePage!.parent != undefined) { //update pageID for (let i = 0; i < config.pages.length; i++) { - if (config.pages[i] == activePage.parent) { + if (config.pages[i] == activePage!.parent) { pageId = i; break; } } - GeneratePage(activePage.parent); + GeneratePage(activePage!.parent); } else { GeneratePage(config.pages[pageId]); @@ -6072,7 +6104,8 @@ function HandleButtonEvent(words: any): void { break; case 'bSubPrev': UnsubscribeWatcher(); - GeneratePage(eval(activePage.prev)); + // check this please + GeneratePage(eval(activePage!.prev!)); break; case 'bExit': if (Debug) { @@ -6107,17 +6140,17 @@ function HandleButtonEvent(words: any): void { } activePage = config.pages[pageId]; } - if (words[2] == 'popupInSel' && activePage.type == 'cardMedia') { + if (words[2] == 'popupInSel' && activePage!.type == 'cardMedia') { if (Debug) log('Leave popupInsel without any action', 'info') pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); } else { pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); } break; case 'bHome': @@ -6125,8 +6158,8 @@ function HandleButtonEvent(words: any): void { log('HandleButtonEvent -> bHome: ' + words[4] + ' - ' + pageId, 'info'); } UnsubscribeWatcher(); - if (activePage.home != undefined) { - GeneratePage(eval(activePage.home)); + if (activePage!.home != undefined) { + GeneratePage(eval(activePage!.home)); } else { GeneratePage(config.pages[0]); } @@ -6177,7 +6210,7 @@ function HandleButtonEvent(words: any): void { break; case 'switch.mode.wlan': setIfExists(id + '.SWITCH', action); - GeneratePage(activePage); + GeneratePage(activePage!); break; } } @@ -6222,10 +6255,10 @@ function HandleButtonEvent(words: any): void { case 'media': if (tempid[1] == undefined) { if (Debug) log('Logo click', 'info'); - GeneratePage(activePage); + GeneratePage(activePage!); } else if (tempid[1] == 'repeat') { let pageItemRepeat = findPageItem(id); - let adapterInstanceRepeat = pageItemRepeat.adapterPlayerInstance; + let adapterInstanceRepeat = pageItemRepeat.adapterPlayerInstance!; let adapterRepeat = adapterInstanceRepeat.split('.'); let deviceAdapterRP = adapterRepeat[0]; @@ -6239,7 +6272,7 @@ function HandleButtonEvent(words: any): void { } else if (stateSpotifyRepeat == 'one') { setIfExists(id + '.REPEAT', 'none'); } - GeneratePage(activePage); + GeneratePage(activePage!); break; case 'sonos': let stateSonosRepeat = getState(id + '.REPEAT').val @@ -6250,15 +6283,15 @@ function HandleButtonEvent(words: any): void { } else if (stateSonosRepeat == 2) { setIfExists(id + '.REPEAT', 0); } - GeneratePage(activePage); + GeneratePage(activePage!); break; case 'alexa2': try { setIfExists(id + '.REPEAT', !getState(id + '.REPEAT').val); - } catch (err) { + } catch (err: any) { log('ALEXA2: Repeat kann nicht verändert werden', 'warn'); } - GeneratePage(activePage); + GeneratePage(activePage!); break; case 'volumio': let urlString: string = `${getState(adapterInstanceRepeat+'info.host').val}/api/commands/?cmd=repeat`; @@ -6268,7 +6301,7 @@ function HandleButtonEvent(words: any): void { if (Debug) { log(response.data, 'info'); } - GeneratePage(activePage); + GeneratePage(activePage!); } else { log('Axios Status - adapterInstanceRepeat: ' + response.state, 'warn'); } @@ -6282,18 +6315,18 @@ function HandleButtonEvent(words: any): void { switch(getState(id + '.REPEAT').val) { case 0: setIfExists(id + '.REPEAT', 1); - GeneratePage(activePage); + GeneratePage(activePage!); break; case 1: setIfExists(id + '.REPEAT', 2) - GeneratePage(activePage); + GeneratePage(activePage!); break; case 2: setIfExists(id + '.REPEAT', 0); - GeneratePage(activePage); + GeneratePage(activePage!); break; } - } catch (err) { + } catch (err: any) { log('Squeezebox: Repeat kann nicht verändert werden', 'warn'); } break; @@ -6441,11 +6474,11 @@ function HandleButtonEvent(words: any): void { break; case 'media-back': setIfExists(id + '.PREV', true); - GeneratePage(activePage); + GeneratePage(activePage!); break; case 'media-pause': let pageItemTemp = findPageItem(id); - let adaInstanceSplit = pageItemTemp.adapterPlayerInstance.split('.'); + let adaInstanceSplit = pageItemTemp.adapterPlayerInstance!.split('.'); if (adaInstanceSplit[0] == 'squeezeboxrpc') { let adapterPlayerInstanceStateSeceltor: string = [pageItemTemp.adapterPlayerInstance, 'Players', pageItemTemp.mediaDevice, 'state'].join('.'); if (Debug) log('HandleButtonEvent media-pause Squeezebox-> adapterPlayerInstanceStateSeceltor: ' + adapterPlayerInstanceStateSeceltor, 'info'); @@ -6465,38 +6498,38 @@ function HandleButtonEvent(words: any): void { setIfExists(id + '.PLAY', true); } } - GeneratePage(activePage); + GeneratePage(activePage!); break; case 'media-next': setIfExists(id + '.NEXT', true); - GeneratePage(activePage); + GeneratePage(activePage!); break; case 'media-shuffle': - if ((findPageItem(id).adapterPlayerInstance).startsWith("volumio")) { + if ((findPageItem(id).adapterPlayerInstance!).startsWith("volumio")) { findPageItem(id).playList = []; break; } //Volumio: empty playlist $uha-20230103 - if ((findPageItem(id).adapterPlayerInstance).startsWith("spotify")) { + if ((findPageItem(id).adapterPlayerInstance!).startsWith("spotify")) { if (getState(id + '.SHUFFLE').val == 'off') { setIfExists(id + '.SHUFFLE', 'on'); } else { setIfExists(id + '.SHUFFLE', 'off'); } } - if ((findPageItem(id).adapterPlayerInstance).startsWith("alexa")) { + if ((findPageItem(id).adapterPlayerInstance!).startsWith("alexa")) { if (getState(id + '.SHUFFLE').val == false) { setIfExists(id + '.SHUFFLE', true); } else { setIfExists(id + '.SHUFFLE', false); } } - if ((findPageItem(id).adapterPlayerInstance).startsWith("sonos")) { + if ((findPageItem(id).adapterPlayerInstance!).startsWith("sonos")) { if (getState(id + '.SHUFFLE').val == false) { setIfExists(id + '.SHUFFLE', true); } else { setIfExists(id + '.SHUFFLE', false); } } - GeneratePage(activePage); + GeneratePage(activePage!); break; case 'volumeSlider': pageCounter = -1; @@ -6505,19 +6538,19 @@ function HandleButtonEvent(words: any): void { setIfExists(id + '.VOLUME', parseInt(words[4])); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); }, 20); break; case 'mode-speakerlist': let pageItem = findPageItem(id); - let adapterInstance = pageItem.adapterPlayerInstance; - let adapter = adapterInstance.split('.'); + let adapterInstance = pageItem.adapterPlayerInstance!; + let adapter = adapterInstance!.split('.'); let deviceAdapter = adapter[0]; switch (deviceAdapter) { case 'spotify-premium': - let strDevicePI = pageItem.speakerList[words[4]]; + let strDevicePI = pageItem.speakerList![words[4]]; let strDeviceID = spotifyGetDeviceID(strDevicePI); setState(adapterInstance + 'devices.' + strDeviceID + ".useForPlayback", true); break; @@ -6525,11 +6558,11 @@ function HandleButtonEvent(words: any): void { let i_list = Array.prototype.slice.apply($('[state.id="' + adapterInstance + 'Echo-Devices.*.Info.name"]')); for (let i_index in i_list) { let i = i_list[i_index]; - if ((getState(i).val) === pageItem.speakerList[words[4]]) { - if (Debug) log('HandleButtonEvent mode-Speakerlist Alexa2: ' + getState(i).val + ' - ' + pageItem.speakerList[words[4]], 'info'); + if ((getState(i).val) === pageItem.speakerList![words[4]]) { + if (Debug) log('HandleButtonEvent mode-Speakerlist Alexa2: ' + getState(i).val + ' - ' + pageItem.speakerList![words[4]], 'info'); let deviceId = i; deviceId = deviceId.split('.'); - setIfExists(adapterInstance + 'Echo-Devices.' + pageItem.mediaDevice + '.Commands.textCommand', 'Schiebe meine Musik auf ' + pageItem.speakerList[words[4]]); + setIfExists(adapterInstance + 'Echo-Devices.' + pageItem.mediaDevice + '.Commands.textCommand', 'Schiebe meine Musik auf ' + pageItem.speakerList![words[4]]); pageItem.mediaDevice = deviceId[3]; } } @@ -6539,25 +6572,25 @@ function HandleButtonEvent(words: any): void { case 'chromecast': break; case 'squeezeboxrpc': - pageItem.mediaDevice = pageItem.speakerList[words[4]]; + pageItem.mediaDevice = pageItem.speakerList![words[4]]; break; } pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); break; case 'mode-playlist': let pageItemPL = findPageItem(id); - let adapterInstancePL = pageItemPL.adapterPlayerInstance; + let adapterInstancePL = pageItemPL.adapterPlayerInstance!; let adapterPL = adapterInstancePL.split('.'); let deviceAdapterPL = adapterPL[0]; switch (deviceAdapterPL) { case 'spotify-premium': - let strDevicePI = pageItemPL.playList[words[4]]; + let strDevicePI = pageItemPL.playList![words[4]]; if (Debug) log('HandleButtonEvent mode-playlist Spotify -> strDevicePI: ' + strDevicePI, 'info'); let playlistListString = (getState(adapterInstancePL + 'playlists.playlistListString').val).split(';'); let playlistListIds = (getState(adapterInstancePL + 'playlists.playlistListIds').val).split(';'); @@ -6568,16 +6601,16 @@ function HandleButtonEvent(words: any): void { }, 2000); break; case 'alexa2': - let tempListItem = pageItemPL.playList[words[4]].split('.'); + let tempListItem = pageItemPL.playList![words[4]].split('.'); setState(adapterInstancePL + 'Echo-Devices.' + pageItemPL.mediaDevice + '.Music-Provider.' + tempListItem[0], tempListItem[1]); break; case 'sonos': - let strDevicePLSonos = pageItemPL.playList[words[4]].split('.'); + let strDevicePLSonos = pageItemPL.playList![words[4]].split('.'); if (Debug) log(adapterInstancePL + 'root.' + pageItemPL.mediaDevice + '.playlist_set', 'info') setState(adapterInstancePL + 'root.' + pageItemPL.mediaDevice + '.playlist_set', strDevicePLSonos[0]); break; case 'volumio': - let strDevicePL = pageItemPL.playList[words[4]]; + let strDevicePL = pageItemPL.playList![words[4]]; let urlString: string = `${getState(adapterInstancePL+'info.host').val}/api/commands/?cmd=playplaylist&name=${strDevicePL}`; axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } }) .then(async function (response) { @@ -6598,15 +6631,15 @@ function HandleButtonEvent(words: any): void { break; } pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); break; case 'mode-tracklist': let pageItemTL = findPageItem(id); - let adapterInstanceTL = pageItemTL.adapterPlayerInstance; + let adapterInstanceTL = pageItemTL.adapterPlayerInstance!; let adapterTL = adapterInstanceTL.split('.'); let deviceAdapterTL = adapterTL[0]; @@ -6637,30 +6670,31 @@ function HandleButtonEvent(words: any): void { }); break; case 'squeezeboxrpc': + //@ts-ignore Fehler kommt von findPageItem in vscode setState([pageItemPL.adapterPlayerInstance, 'Players', pageItemPL.mediaDevice, 'PlaylistCurrentIndex'].join('.'), words[4]); break; } pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); break; case 'mode-repeat': let pageItemRP = findPageItem(id); - let adapterInstanceRP = pageItemRP.adapterPlayerInstance; + let adapterInstanceRP = pageItemRP.adapterPlayerInstance!; let adapterRP = adapterInstanceRP.split('.'); let deviceAdapterRP = adapterRP[0]; - if (Debug) log(pageItemRP.repeatList[words[4]], 'warn'); + if (Debug) log(pageItemRP.repeatList![words[4]], 'warn'); switch (deviceAdapterRP) { case 'spotify-premium': - setIfExists(id + '.REPEAT', pageItemRP.repeatList[words[4]]); - GeneratePage(activePage); + setIfExists(id + '.REPEAT', pageItemRP.repeatList![words[4]]); + GeneratePage(activePage!); break; case 'alexa2': - GeneratePage(activePage); + GeneratePage(activePage!); break; } break; @@ -6668,17 +6702,17 @@ function HandleButtonEvent(words: any): void { let pageItemEQ = findPageItem(id); if (Debug) log('HandleButtonEvent mode-equalizer -> id: ' + id, 'info'); let lastIndex = (id.split('.')).pop(); - setState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode', pageItemEQ.equalizerList[words[4]]); + setState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode', pageItemEQ.equalizerList![words[4]]); pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); break; case 'mode-seek': let pageItemSeek = findPageItem(id); - let adapterInstanceSK = pageItemSeek.adapterPlayerInstance; + let adapterInstanceSK = pageItemSeek.adapterPlayerInstance!; let adapterSK = adapterInstanceSK.split('.'); let deviceAdapterSK = adapterSK[0]; switch (deviceAdapterSK) { @@ -6690,15 +6724,15 @@ function HandleButtonEvent(words: any): void { break; } pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); break; case 'mode-crossfade': let pageItemCrossfade = findPageItem(id); - let adapterInstanceCF = pageItemCrossfade.adapterPlayerInstance; + let adapterInstanceCF = pageItemCrossfade.adapterPlayerInstance!; let adapterCF = adapterInstanceCF.split('.'); let deviceAdapterCF = adapterCF[0]; switch (deviceAdapterCF) { @@ -6714,10 +6748,10 @@ function HandleButtonEvent(words: any): void { break; } pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); break; case 'mode-favorites': @@ -6726,10 +6760,10 @@ function HandleButtonEvent(words: any): void { let favListArray = getState(pageItemFav.adapterPlayerInstance + 'root.' + pageItemFav.mediaDevice + '.favorites_list_array').val; setState(pageItemFav.adapterPlayerInstance + 'root.' + pageItemFav.mediaDevice + '.favorites_set', favListArray[words[4]]); pageCounter = 0; - GeneratePage(activePage); + GeneratePage(activePage!); setTimeout(async function () { pageCounter = 1; - GeneratePage(activePage); + GeneratePage(activePage!); }, 3000); break; case 'mode-insel': @@ -6737,7 +6771,7 @@ function HandleButtonEvent(words: any): void { break; case 'media-OnOff': let pageItemTem = findPageItem(id); - let adaInstanceSpli = pageItemTem.adapterPlayerInstance.split('.'); + let adaInstanceSpli = pageItemTem.adapterPlayerInstance!.split('.'); if (adaInstanceSpli[0] == 'squeezeboxrpc') { let adapterPlayerInstancePowerSelector: string = [pageItemTem.adapterPlayerInstance, 'Players', pageItemTem.mediaDevice, 'Power'].join('.'); let stateVal = getState(adapterPlayerInstancePowerSelector).val; @@ -6753,7 +6787,7 @@ function HandleButtonEvent(words: any): void { } else { setIfExists(id + '.STOP', true); } - GeneratePage(activePage); + GeneratePage(activePage!); break; case 'timer-start': if (words[4] != undefined) { @@ -6800,7 +6834,7 @@ function HandleButtonEvent(words: any): void { setIfExists(words[2] + '.' + modesDP[mode], false); } } - GeneratePage(activePage); + GeneratePage(activePage!); } else { let HVACMode = getState(words[2] + '.MODE').val; @@ -6830,20 +6864,20 @@ function HandleButtonEvent(words: any): void { } setIfExists(words[2] + '.' + 'MODE', HVACMode); - GeneratePage(activePage); + GeneratePage(activePage!); } break; case 'mode-modus1': let pageItemT1 = findPageItem(id); - setIfExists(id + '.' + pageItemT1.setThermoAlias[0], pageItemT1.popupThermoMode1[parseInt(words[4])]); + setIfExists(id + '.' + pageItemT1.setThermoAlias![0], pageItemT1.popupThermoMode1![parseInt(words[4])]); break; case 'mode-modus2': let pageItemT2 = findPageItem(id); - setIfExists(id + '.' + pageItemT2.setThermoAlias[1], pageItemT2.popupThermoMode2[parseInt(words[4])]); + setIfExists(id + '.' + pageItemT2.setThermoAlias![1], pageItemT2.popupThermoMode2![parseInt(words[4])]); break; case 'mode-modus3': let pageItemT3 = findPageItem(id); - setIfExists(id + '.' + pageItemT3.setThermoAlias[2], pageItemT3.popupThermoMode3[parseInt(words[4])]); + setIfExists(id + '.' + pageItemT3.setThermoAlias![2], pageItemT3.popupThermoMode3![parseInt(words[4])]); break; case 'number-set': let nobj = getObject(id); @@ -6873,7 +6907,7 @@ function HandleButtonEvent(words: any): void { setIfExists(id + '.PANEL', NSPanel_Path); } setTimeout(function(){ - GeneratePage(activePage); + GeneratePage(activePage!); },250); break; case 'A2': // Alarm page - activate alarm 2 @@ -6884,7 +6918,7 @@ function HandleButtonEvent(words: any): void { setIfExists(id + '.PANEL', NSPanel_Path); } setTimeout(function(){ - GeneratePage(activePage); + GeneratePage(activePage!); },250); break; case 'A3': // Alarm page - activate alarm 3 @@ -6895,7 +6929,7 @@ function HandleButtonEvent(words: any): void { setIfExists(id + '.PANEL', NSPanel_Path); } setTimeout(function(){ - GeneratePage(activePage); + GeneratePage(activePage!); },250); break; case 'A4': // Alarm page - activate alarm 4 @@ -6906,7 +6940,7 @@ function HandleButtonEvent(words: any): void { setIfExists(id + '.PANEL', NSPanel_Path); } setTimeout(function(){ - GeneratePage(activePage); + GeneratePage(activePage!); },250); break; case 'D1': // Alarm page - deactivate alarm 4 @@ -6928,7 +6962,7 @@ function HandleButtonEvent(words: any): void { } setIfExists(id + '.PANEL', NSPanel_Path); setTimeout(function(){ - GeneratePage(activePage); + GeneratePage(activePage!); },500); } break; @@ -6936,7 +6970,7 @@ function HandleButtonEvent(words: any): void { let pageItemUnlock = findPageItem(id); if (words[4] == getState(id + '.PIN').val) { UnsubscribeWatcher(); - GeneratePage(eval(pageItemUnlock.targetPage)); + GeneratePage(eval(pageItemUnlock.targetPage!)); setIfExists(id + '.ACTUAL', true) } else { setIfExists(id + '.ACTUAL', false) @@ -6945,7 +6979,7 @@ function HandleButtonEvent(words: any): void { default: break; } - } catch (err) { + } catch (err: any) { log('error at function HandleButtonEvent: ' + err.message, 'warn'); } } @@ -6960,13 +6994,13 @@ function GetNavigationString(pageId: number): string { var navigationString:string = ""; - if (activePage.subPage){ + if (activePage!.subPage){ //Left icon - if (activePage.prev == undefined){ - if (activePage.parentIcon != undefined){ - navigationString = 'button~bUp~' + Icons.GetIcon(activePage.parentIcon); - if (activePage.parentIconColor != undefined){ - navigationString += '~' + rgb_dec565(activePage.parentIconColor); + if (activePage!.prev == undefined){ + if (activePage!.parentIcon != undefined){ + navigationString = 'button~bUp~' + Icons.GetIcon(activePage!.parentIcon); + if (activePage!.parentIconColor != undefined){ + navigationString += '~' + rgb_dec565(activePage!.parentIconColor); } else { navigationString += '~' + rgb_dec565(White); } @@ -6974,10 +7008,10 @@ function GetNavigationString(pageId: number): string { navigationString = 'button~bUp~' + Icons.GetIcon('arrow-up-bold') + '~' + rgb_dec565(White); } } else { - if (activePage.prevIcon != undefined){ - navigationString = 'button~bSubPrev~' + Icons.GetIcon(activePage.prevIcon); - if (activePage.prevIconColor != undefined){ - navigationString += '~' + rgb_dec565(activePage.prevIconColor); + if (activePage!.prevIcon != undefined){ + navigationString = 'button~bSubPrev~' + Icons.GetIcon(activePage!.prevIcon); + if (activePage!.prevIconColor != undefined){ + navigationString += '~' + rgb_dec565(activePage!.prevIconColor); } else { navigationString += '~' + rgb_dec565(White); } @@ -6987,11 +7021,11 @@ function GetNavigationString(pageId: number): string { } //Right icon - if (activePage.next == undefined){ - if (activePage.homeIcon != undefined){ - navigationString += '~~~button~bHome~' + Icons.GetIcon(activePage.homeIcon); - if (activePage.homeIconColor != undefined){ - navigationString += '~' + rgb_dec565(activePage.homeIconColor) + '~~';; + if (activePage!.next == undefined){ + if (activePage!.homeIcon != undefined){ + navigationString += '~~~button~bHome~' + Icons.GetIcon(activePage!.homeIcon); + if (activePage!.homeIconColor != undefined){ + navigationString += '~' + rgb_dec565(activePage!.homeIconColor) + '~~';; } else { navigationString += '~' + rgb_dec565(White) + '~~'; } @@ -6999,10 +7033,10 @@ function GetNavigationString(pageId: number): string { navigationString += '~~~button~bHome~' + Icons.GetIcon('home') + '~' + rgb_dec565(White) + '~~'; } } else { - if (activePage.nextIcon != undefined){ - navigationString += '~~~button~bSubNext~' + Icons.GetIcon(activePage.nextIcon); - if (activePage.nextIconColor != undefined){ - navigationString += '~' + rgb_dec565(activePage.nextIconColor) + '~~'; + if (activePage!.nextIcon != undefined){ + navigationString += '~~~button~bSubNext~' + Icons.GetIcon(activePage!.nextIcon); + if (activePage!.nextIconColor != undefined){ + navigationString += '~' + rgb_dec565(activePage!.nextIconColor) + '~~'; } else { navigationString += '~' + rgb_dec565(White) + '~~'; } @@ -7012,7 +7046,7 @@ function GetNavigationString(pageId: number): string { } } - if (activePage.subPage && (navigationString != "")){ + if (activePage!.subPage && (navigationString != "")){ return navigationString } @@ -7023,25 +7057,25 @@ function GetNavigationString(pageId: number): string { return 'button~bUp~' + Icons.GetIcon('arrow-up-bold') + '~' + rgb_dec565(White) + '~~~delete~~~~~'; default: { - if (activePage.prevIcon != undefined){ - navigationString = 'button~bPrev~' + Icons.GetIcon(activePage.prevIcon); + if (activePage!.prevIcon != undefined){ + navigationString = 'button~bPrev~' + Icons.GetIcon(activePage!.prevIcon); } else { navigationString = 'button~bPrev~' + Icons.GetIcon('arrow-left-bold'); } - if (activePage.prevIconColor != undefined){ - navigationString += '~' + rgb_dec565(activePage.prevIconColor); + if (activePage!.prevIconColor != undefined){ + navigationString += '~' + rgb_dec565(activePage!.prevIconColor); } else { navigationString += '~' + rgb_dec565(White); } - if (activePage.nextIcon != undefined){ - navigationString += '~~~button~bNext~' + Icons.GetIcon(activePage.nextIcon); + if (activePage!.nextIcon != undefined){ + navigationString += '~~~button~bNext~' + Icons.GetIcon(activePage!.nextIcon); } else { navigationString += '~~~button~bNext~' + Icons.GetIcon('arrow-right-bold'); } - if (activePage.nextIconColor != undefined){ - navigationString += '~' + rgb_dec565(activePage.nextIconColor) + '~~'; + if (activePage!.nextIconColor != undefined){ + navigationString += '~' + rgb_dec565(activePage!.nextIconColor) + '~~'; } else { navigationString += '~' + rgb_dec565(White) + '~~'; } @@ -7049,18 +7083,19 @@ function GetNavigationString(pageId: number): string { } } - } catch (err) { + } catch (err: any) { log('error at function GetNavigationString: ' + err.message, 'warn'); } + return ''; } -function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, placeId: number): Payload[] { +function GenerateDetailPage(type: string, optional: string | undefined, pageItem: PageItem, placeId: number | undefined): Payload[] { if (Debug) log('GenerateDetailPage Übergabe Type: ' + type + ' - optional: ' + optional + ' - pageItem.id: ' + pageItem.id, 'info'); try { let out_msgs: Array = []; let id = pageItem.id; - if (existsObject(id)) { + if (id && existsObject(id)) { let o = getObject(id); let val: (boolean | number) = 0; @@ -7206,7 +7241,7 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, if (getState(id + '.HUE').val != null) { colorMode = 'enable'; let huecolor = hsv2rgb(getState(id + '.HUE').val, 1, 1); - let rgb = { red: Math.round(huecolor[0]), green: Math.round(huecolor[1]), blue: Math.round(huecolor[2]) } + let rgb: RGB = { red: Math.round(huecolor[0]), green: Math.round(huecolor[1]), blue: Math.round(huecolor[2]) } iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); } } @@ -7277,7 +7312,7 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, if (existsState(id + '.RED') && existsState(id + '.GREEN') && existsState(id + '.BLUE')) { if (getState(id + '.RED').val != null && getState(id + '.GREEN').val != null && getState(id + '.BLUE').val != null) { colorMode = 'enable'; - let rgb = { red: Math.round(getState(id + '.RED').val), green: Math.round(getState(id + '.GREEN').val), blue: Math.round(getState(id + '.BLUE').val) } + let rgb: RGB = { red: Math.round(getState(id + '.RED').val), green: Math.round(getState(id + '.GREEN').val), blue: Math.round(getState(id + '.BLUE').val) } iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); } } @@ -7286,7 +7321,7 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, colorTemp = 0; if (getState(id + '.TEMPERATURE').val != null) { if (pageItem.minValueColorTemp !== undefined && pageItem.minValueColorTemp !== undefined) { - colorTemp = Math.trunc(scale(getState(id + '.TEMPERATURE').val, pageItem.minValueColorTemp, pageItem.maxValueColorTemp, 100, 0)); + colorTemp = Math.trunc(scale(getState(id + '.TEMPERATURE').val, pageItem.minValueColorTemp, pageItem.maxValueColorTemp!, 100, 0)); } else { colorTemp = getState(id + '.TEMPERATURE').val; } @@ -7352,7 +7387,7 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, let hexRed = parseInt(hex[1] + hex[2], 16); let hexGreen = parseInt(hex[3] + hex[4], 16); let hexBlue = parseInt(hex[5] + hex[6], 16); - let rgb = { red: Math.round(hexRed), green: Math.round(hexGreen), blue: Math.round(hexBlue) } + let rgb: RGB = { red: Math.round(hexRed), green: Math.round(hexGreen), blue: Math.round(hexBlue) } iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); } } @@ -7566,28 +7601,28 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, let payloadParameters1 = '~~~~' if (pageItem.popupThermoMode1 != undefined) { - RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias[0], pageItem, type, placeId); - payloadParameters1 = pageItem.popUpThermoName[0] + '~' //{heading}~ Mode 1 + RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias![0], pageItem, type, placeId); + payloadParameters1 = pageItem.popUpThermoName![0] + '~' //{heading}~ Mode 1 + 'modus1' + '~' //{id}~ Mode 1 - + getState(pageItem.id + "." + pageItem.setThermoAlias[0]).val + '~' //{ACTUAL}~ Mode 1 + + getState(pageItem.id + "." + pageItem.setThermoAlias![0]).val + '~' //{ACTUAL}~ Mode 1 + mode1 + '~'; //{possible values} Mode 1 (1-n) } let payloadParameters2 = '~~~~' if (pageItem.popupThermoMode2 != undefined) { - RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias[1], pageItem, type, placeId); - payloadParameters2 = pageItem.popUpThermoName[1] + '~' //{heading}~ Mode 2 + RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias![1], pageItem, type, placeId); + payloadParameters2 = pageItem.popUpThermoName![1] + '~' //{heading}~ Mode 2 + 'modus2' + '~' //{id}~ Mode 2 - + getState(pageItem.id + "." + pageItem.setThermoAlias[1]).val + '~' //{ACTUAL}~ Mode 2 + + getState(pageItem.id + "." + pageItem.setThermoAlias![1]).val + '~' //{ACTUAL}~ Mode 2 + mode2 + '~'; //{possible values} } let payloadParameters3 = '~~~~' if (pageItem.popupThermoMode3 != undefined) { - RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias[2], pageItem, type, placeId); - payloadParameters3 = pageItem.popUpThermoName[2] + '~' //{heading}~ Mode 3 + RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias![2], pageItem, type, placeId); + payloadParameters3 = pageItem.popUpThermoName![2] + '~' //{heading}~ Mode 3 + 'modus3' + '~' //{id}~ Mode 3 - + getState(pageItem.id + "." + pageItem.setThermoAlias[2]).val + '~' //{ACTUAL}~ Mode 3 + + getState(pageItem.id + "." + pageItem.setThermoAlias![2]).val + '~' //{ACTUAL}~ Mode 3 + mode3; //{possible values} Mode 3 (1-n) } @@ -7714,8 +7749,8 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, let actualSpeed = getState(id + '.SPEED').val; let maxSpeed = (pageItem.maxValue != undefined) ? pageItem.maxValue : 100; - let modeList = pageItem.modeList.join('?'); - let actualMode = pageItem.modeList[getState(id + '.MODE').val]; + let modeList = pageItem.modeList!.join('?'); + let actualMode = pageItem.modeList![getState(id + '.MODE').val]; let tempId = placeId != undefined ? placeId : id; @@ -7740,7 +7775,7 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, let optionalString: string = 'Kein Eintrag'; let mode: string = ''; - let vTempAdapter = (pageItem.adapterPlayerInstance).split('.'); + let vTempAdapter = (pageItem.adapterPlayerInstance!).split('.'); let vAdapter = vTempAdapter[0]; if (optional == 'seek') { let actualStateTemp: number = getState(pageItem.adapterPlayerInstance + 'root.' + pageItem.mediaDevice + '.seek').val; @@ -7797,9 +7832,9 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, } else if (vAdapter == 'squeezeboxrpc') { actualState = pageItem.mediaDevice; } - let tempSpeakerList = []; - for (let i = 0; i < pageItem.speakerList.length; i++) { - tempSpeakerList[i] = formatInSelText(pageItem.speakerList[i]).trim(); + let tempSpeakerList: string[] = []; + for (let i = 0; i < pageItem.speakerList!.length; i++) { + tempSpeakerList[i] = formatInSelText(pageItem.speakerList![i]).trim(); } optionalString = pageItem.speakerList != undefined ? tempSpeakerList.join('?') : ''; mode = 'speakerlist'; @@ -7808,9 +7843,9 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, if (existsObject(pageItem.adapterPlayerInstance + 'player.playlist.name')) { actualState = formatInSelText(getState(pageItem.adapterPlayerInstance + 'player.playlist.name').val); } - let tempPlayList = []; - for (let i = 0; i < pageItem.playList.length; i++) { - tempPlayList[i] = formatInSelText(pageItem.playList[i]); + let tempPlayList: string[] = []; + for (let i = 0; i < pageItem.playList!.length; i++) { + tempPlayList[i] = formatInSelText(pageItem.playList![i]); } optionalString = pageItem.playList != undefined ? tempPlayList.join('?') : '' } else if (vAdapter == 'alexa2') { @@ -7818,13 +7853,13 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, actualState = formatInSelText(getState(pageItem.adapterPlayerInstance + 'Echo-Devices.' + pageItem.mediaDevice + '.Player.currentAlbum').val); let tPlayList: any = [] - for (let i = 0; i < pageItem.playList.length; i++) { - if (Debug) log('function GenerateDetailPage role:media -> Playlist ' + pageItem.playList[i], 'info'); - let tempItem = pageItem.playList[i].split('.'); + for (let i = 0; i < pageItem.playList!.length; i++) { + if (Debug) log('function GenerateDetailPage role:media -> Playlist ' + pageItem.playList![i], 'info'); + let tempItem = pageItem.playList![i].split('.'); tPlayList[i] = tempItem[1]; } - let tempPlayList = []; + let tempPlayList: string[] = []; for (let i = 0; i < tPlayList.length; i++) { tempPlayList[i] = formatInSelText(tPlayList[i]); } @@ -7834,30 +7869,30 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, if (existsObject(pageItem.adapterPlayerInstance + 'root.' + pageItem.mediaDevice + '.playlist_set')) { actualState = formatInSelText(getState(pageItem.adapterPlayerInstance + 'root.' + pageItem.mediaDevice + '.playlist_set').val); } - let tempPlayList = []; - for (let i = 0; i < pageItem.playList.length; i++) { - tempPlayList[i] = formatInSelText(pageItem.playList[i]); + let tempPlayList: string[] = []; + for (let i = 0; i < pageItem.playList!.length; i++) { + tempPlayList[i] = formatInSelText(pageItem.playList![i]); } optionalString = pageItem.playList != undefined ? tempPlayList.join('?') : '' } else if (vAdapter == 'volumio') { /* Volumio: limit 900 chars */ actualState = ''; //todo: no actual playlistname saving - let tempPlayList = []; let tempPll = 0; - for (let i = 0; i < pageItem.playList.length; i++) { - tempPll += pageItem.playList[i].length; if (tempPll > 900) break; - tempPlayList[i] = formatInSelText(pageItem.playList[i]); + let tempPlayList: string[] = []; let tempPll = 0; + for (let i = 0; i < pageItem.playList!.length; i++) { + tempPll += pageItem.playList![i].length; if (tempPll > 900) break; + tempPlayList[i] = formatInSelText(pageItem.playList![i]); } optionalString = pageItem.playList != undefined ? tempPlayList.join('?') : '' } else if(vAdapter == 'squeezeboxrpc') { // Playlist browsing not supported by squeezeboxrpc adapter. But Favorites can be used actualState = ''; // Not supported by squeezeboxrpc adapter - let tempPlayList = []; - let pathParts: Array = pageItem.adapterPlayerInstance.split('.'); + let tempPlayList: string[] = []; + let pathParts: Array = pageItem.adapterPlayerInstance!.split('.'); for (let favorite_index=0; favorite_index < 45; favorite_index++) { let favorite_name_selector: string = [pathParts[0], pathParts[1], 'Favorites', favorite_index, 'Name'].join('.'); if(!existsObject(favorite_name_selector)) { break; } - let favoritename = getState(favorite_name_selector).val; + let favoritename: string = getState(favorite_name_selector).val; tempPlayList.push(formatInSelText(favoritename)); } optionalString = tempPlayList.length > 0 ? tempPlayList.join('?') : ''; @@ -7882,7 +7917,7 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, if (Debug) log(actualState, 'info'); if (Debug) log(globalTracklist, 'info'); //Limit 900 characters, then memory overflow --> Shorten as much as possible - let temp_array = []; + let temp_array: any[] = []; //let trackArray = (function () { try {return JSON.parse(getState(pageItem.adapterPlayerInstance + 'player.playlist.trackListArray').val);} catch(e) {return {};}})(); for (let track_index=0; track_index < 45; track_index++) { let temp_cut_array = getAttr(globalTracklist, track_index + '.title'); @@ -7905,14 +7940,14 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, break; } } - let tempTrackList = []; + let tempTrackList: string[] = []; for (let i = 0; i < temp_array.length; i++) { tempTrackList[i] = formatInSelText(temp_array[i]); } optionalString = pageItem.playList != undefined ? tempTrackList.join('?') : '' mode = 'tracklist'; } else if (optional == 'equalizer') { - + if (pageItem.id == undefined) throw new Error ('Missing pageItem.id in equalizer!'); let lastIndex = (pageItem.id.split('.')).pop(); if (existsObject(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode') == false || @@ -7926,22 +7961,22 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, actualState = formatInSelText(getState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode').val); } - let tempEQList = []; - for (let i = 0; i < pageItem.equalizerList.length; i++) { - tempEQList[i] = formatInSelText(pageItem.equalizerList[i]); + let tempEQList: string[] = []; + for (let i = 0; i < pageItem.equalizerList!.length; i++) { + tempEQList[i] = formatInSelText(pageItem!.equalizerList![i]); } optionalString = pageItem.equalizerList != undefined ? tempEQList.join('?') : ''; mode = 'equalizer'; } else if (optional == 'repeat') { actualState = getState(pageItem.adapterPlayerInstance + 'player.repeat').val; - optionalString = pageItem.repeatList.join('?'); + optionalString = pageItem.repeatList!.join('?'); mode = 'repeat'; } else if (optional == 'favorites') { if (Debug) log(getState(pageItem.adapterPlayerInstance + 'root.' + pageItem.mediaDevice + '.favorites_set').val, 'info') actualState = formatInSelText(getState(pageItem.adapterPlayerInstance + 'root.' + pageItem.mediaDevice + '.favorites_set').val); - let tempFavList = []; + let tempFavList:string [] = []; let favList = getState(pageItem.adapterPlayerInstance + 'root.' + pageItem.mediaDevice + '.favorites_list_array').val; for (let i = 0; i < favList.length; i++) { tempFavList[i] = formatInSelText(favList[i]); @@ -7960,21 +7995,21 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, + actualState + '~' + optionalString }); - GeneratePage(activePage); + GeneratePage(activePage!); } else if (o.common.role == 'buttonSensor') { let actualValue: string = ''; if (pageItem.inSel_ChoiceState || pageItem.inSel_ChoiceState == undefined) { if (existsObject(pageItem.id + '.VALUE')) { - actualValue = formatInSelText(pageItem.modeList[getState(pageItem.id + '.VALUE').val]); + actualValue = formatInSelText(pageItem.modeList![getState(pageItem.id + '.VALUE').val]); RegisterDetailEntityWatcher(id + '.VALUE', pageItem, type, placeId); } } - let tempModeList = []; - for (let i = 0; i < pageItem.modeList.length; i++) { - tempModeList[i] = formatInSelText(pageItem.modeList[i]); + let tempModeList: string[] = []; + for (let i = 0; i < pageItem.modeList!.length; i++) { + tempModeList[i] = formatInSelText(pageItem.modeList![i]); } let valueList = pageItem.modeList != undefined ? tempModeList.join('?') : ''; @@ -8007,7 +8042,7 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, } } - let tempModeList = []; + let tempModeList: string[] = []; for (let i = 0; i < pageItem.modeList.length; i++) { tempModeList[i] = formatInSelText(pageItem.modeList[i]); } @@ -8028,20 +8063,22 @@ function GenerateDetailPage(type: string, optional: string, pageItem: PageItem, } } } - if (Debug) log('GenerateDetailPage -> payload: ' + JSON.stringify(out_msgs), 'info'); + if (Debug) log('GenerateDetailPage -> payload: ' + JSON.stringify(out_msgs), 'info'); return out_msgs; - } catch (err) { + } catch (err: any) { log('error at function GenerateDetailPage: ' + err.message, 'warn'); } + return []; } function scale(number: number, inMin: number, inMax: number, outMin: number, outMax: number): number { try { return (outMax + outMin) - ((number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin); - } catch (err) { + } catch (err: any) { log('error at function scale: ' + err.message, 'warn'); } + return 0 } function UnsubscribeWatcher(): void { @@ -8050,7 +8087,7 @@ function UnsubscribeWatcher(): void { unsubscribe(value); delete subscriptions[key]; } - } catch (err) { + } catch (err: any) { log('error at function UnsubscribeWatcher: ' + err.message, 'warn'); } } @@ -8125,7 +8162,7 @@ function HandleScreensaverUpdate(): void { let i = 0; for (i = 0; i < 3; i++) { - if (config.leftScreensaverEntity[i] == null) { + if (config.leftScreensaverEntity[i] == null || config.leftScreensaverEntity[i] == undefined) { checkpoint = false; break; } @@ -8134,8 +8171,8 @@ function HandleScreensaverUpdate(): void { let val = getState(config.leftScreensaverEntity[i].ScreensaverEntity).val; let iconColor = rgb_dec565(White); let icon; - if (existsObject(config.leftScreensaverEntity[i].ScreensaverEntityIconOn)) { - let iconName = getState(config.leftScreensaverEntity[i].ScreensaverEntityIconOn).val; + if (typeof config.leftScreensaverEntity[i].ScreensaverEntityIconOn == 'string' && existsObject(config.leftScreensaverEntity[i].ScreensaverEntityIconOn as string)) { + let iconName = getState(config.leftScreensaverEntity[i].ScreensaverEntityIconOn!).val; icon = Icons.GetIcon(iconName); } else { icon = Icons.GetIcon(config.leftScreensaverEntity[i].ScreensaverEntityIconOn); @@ -8146,7 +8183,7 @@ function HandleScreensaverUpdate(): void { } if (typeof(val) == 'number') { - val = (val * config.leftScreensaverEntity[i].ScreensaverEntityFactor).toFixed(config.leftScreensaverEntity[i].ScreensaverEntityDecimalPlaces) + config.leftScreensaverEntity[i].ScreensaverEntityUnitText; + val = (val * (config.leftScreensaverEntity[i].ScreensaverEntityFactor ? config.leftScreensaverEntity[i].ScreensaverEntityFactor! : 0)).toFixed(config.leftScreensaverEntity[i].ScreensaverEntityDecimalPlaces) + config.leftScreensaverEntity[i].ScreensaverEntityUnitText; iconColor = GetScreenSaverEntityColor(config.leftScreensaverEntity[i]); } else if (typeof(val) == 'boolean') { @@ -8168,9 +8205,9 @@ function HandleScreensaverUpdate(): void { } } } - - if (existsObject(config.leftScreensaverEntity[i].ScreensaverEntityIconColor)) { - iconColor = getState(config.leftScreensaverEntity[i].ScreensaverEntityIconColor).val; + const temp = config.leftScreensaverEntity[i].ScreensaverEntityIconColor; + if (temp && typeof temp == 'string' && existsObject(temp)) { + iconColor = getState(temp).val; } payloadString += '~' + @@ -8248,8 +8285,8 @@ function HandleScreensaverUpdate(): void { if (weatherAdapterInstance == 'accuweather.' + weatherAdapterInstanceNumber + '.' && i == 6) { let nextSunEvent = 0 - let valDateNow = new Date; - let arraySunEvent = []; + let valDateNow = new Date().getTime(); + let arraySunEvent: number[] = []; arraySunEvent[0] = getDateObject(getState('accuweather.' + weatherAdapterInstanceNumber + '.Daily.Day1.Sunrise').val).getTime(); arraySunEvent[1] = getDateObject(getState('accuweather.' + weatherAdapterInstanceNumber + '.Daily.Day1.Sunset').val).getTime(); @@ -8293,7 +8330,7 @@ function HandleScreensaverUpdate(): void { } let iconColor = rgb_dec565(White); if (typeof(val) == 'number') { - val = (val * config.bottomScreensaverEntity[4].ScreensaverEntityFactor).toFixed(config.bottomScreensaverEntity[4].ScreensaverEntityDecimalPlaces) + config.bottomScreensaverEntity[4].ScreensaverEntityUnitText; + val = (val * (config.bottomScreensaverEntity[4].ScreensaverEntityFactor ? config.bottomScreensaverEntity[4].ScreensaverEntityFactor : 0)).toFixed(config.bottomScreensaverEntity[4].ScreensaverEntityDecimalPlaces) + config.bottomScreensaverEntity[4].ScreensaverEntityUnitText; iconColor = GetScreenSaverEntityColor(config.bottomScreensaverEntity[4]); } else if (typeof(val) == 'boolean') { @@ -8314,8 +8351,9 @@ function HandleScreensaverUpdate(): void { } } - if (existsObject(config.bottomScreensaverEntity[4].ScreensaverEntityIconColor)) { - iconColor = getState(config.bottomScreensaverEntity[4].ScreensaverEntityIconColor).val; + const temp = config.bottomScreensaverEntity[4].ScreensaverEntityIconColor + if (temp && typeof temp == 'string' && existsObject(temp)) { + iconColor = getState(temp).val; } payloadString += '~' + '~' + @@ -8341,15 +8379,15 @@ function HandleScreensaverUpdate(): void { } let iconColor = rgb_dec565(White); let icon; - if (existsObject(config.bottomScreensaverEntity[i].ScreensaverEntityIconOn)) { - let iconName = getState(config.bottomScreensaverEntity[i].ScreensaverEntityIconOn).val; + if (config.bottomScreensaverEntity[i].ScreensaverEntityIconOn && existsObject(config.bottomScreensaverEntity[i].ScreensaverEntityIconOn!)) { + let iconName = getState(config.bottomScreensaverEntity[i].ScreensaverEntityIconOn!).val; icon = Icons.GetIcon(iconName); } else { icon = Icons.GetIcon(config.bottomScreensaverEntity[i].ScreensaverEntityIconOn); } if (typeof(val) == 'number') { - val = (val * config.bottomScreensaverEntity[i].ScreensaverEntityFactor).toFixed(config.bottomScreensaverEntity[i].ScreensaverEntityDecimalPlaces) + config.bottomScreensaverEntity[i].ScreensaverEntityUnitText; + val = (val * (config.bottomScreensaverEntity[i].ScreensaverEntityFactor ? config.bottomScreensaverEntity[i].ScreensaverEntityFactor! : 0)).toFixed(config.bottomScreensaverEntity[i].ScreensaverEntityDecimalPlaces) + config.bottomScreensaverEntity[i].ScreensaverEntityUnitText; iconColor = GetScreenSaverEntityColor(config.bottomScreensaverEntity[i]); } else if (typeof(val) == 'boolean') { @@ -8379,8 +8417,9 @@ function HandleScreensaverUpdate(): void { } } - if (existsObject(config.bottomScreensaverEntity[i].ScreensaverEntityIconColor)) { - iconColor = getState(config.bottomScreensaverEntity[i].ScreensaverEntityIconColor).val; + const temp = config.bottomScreensaverEntity[4].ScreensaverEntityIconColor + if (temp && typeof temp == 'string' && existsObject(temp)) { + iconColor = getState(temp).val; } if (i < maxEntities - 1) { val = val + '~'; @@ -8416,15 +8455,15 @@ function HandleScreensaverUpdate(): void { let iconColor = rgb_dec565(White); let icon; - if (existsObject(config.indicatorScreensaverEntity[i].ScreensaverEntityIconOn)) { - let iconName = getState(config.indicatorScreensaverEntity[i].ScreensaverEntityIconOn).val; + if (config.indicatorScreensaverEntity[i].ScreensaverEntityIconOn && existsObject(config.indicatorScreensaverEntity[i].ScreensaverEntityIconOn!)) { + let iconName = getState(config.indicatorScreensaverEntity[i].ScreensaverEntityIconOn!).val; icon = Icons.GetIcon(iconName); } else { icon = Icons.GetIcon(config.indicatorScreensaverEntity[i].ScreensaverEntityIconOn); } if (typeof(val) == 'number') { - val = (val * config.indicatorScreensaverEntity[i].ScreensaverEntityFactor).toFixed(config.indicatorScreensaverEntity[i].ScreensaverEntityDecimalPlaces) + config.indicatorScreensaverEntity[i].ScreensaverEntityUnitText; + val = (val * (config.indicatorScreensaverEntity[i].ScreensaverEntityFactor ? config.indicatorScreensaverEntity[i].ScreensaverEntityFactor! : 0)).toFixed(config.indicatorScreensaverEntity[i].ScreensaverEntityDecimalPlaces) + config.indicatorScreensaverEntity[i].ScreensaverEntityUnitText; iconColor = GetScreenSaverEntityColor(config.indicatorScreensaverEntity[i]); } else if (typeof(val) == 'boolean') { @@ -8433,8 +8472,9 @@ function HandleScreensaverUpdate(): void { icon = Icons.GetIcon(config.indicatorScreensaverEntity[i].ScreensaverEntityIconOff) } } - if (existsObject(config.indicatorScreensaverEntity[i].ScreensaverEntityIconColor)) { - iconColor = getState(config.indicatorScreensaverEntity[i].ScreensaverEntityIconColor).val; + const temp = config.indicatorScreensaverEntity[4].ScreensaverEntityIconColor + if (temp && typeof temp == 'string' && existsObject(temp)) { + iconColor = getState(temp).val; } payloadString += '~' + '~' + @@ -8452,7 +8492,7 @@ function HandleScreensaverUpdate(): void { } - } catch (err) { + } catch (err: any) { log('error at function HandleScreensaverUpdate: ' + err.message, 'warn'); } } @@ -8466,7 +8506,7 @@ function RegisterScreensaverEntityWatcher(id: string): void { subscriptions[id] = (on({ id: id, change: 'any' }, () => { HandleScreensaverUpdate(); })); - } catch (err) { + } catch (err: any) { log('function RegisterEntityWatcher: ' + err.message, 'warn'); } } @@ -8646,7 +8686,7 @@ function HandleScreensaverStatusIcons() : void { SendToPanel({ payload: 'statusUpdate~' + payloadString }); - } catch (err) { + } catch (err: any) { log('error at function HandleScreensaverStatusIcons: ' + err.message, 'warn'); } } @@ -8675,12 +8715,14 @@ function HandleColorScale(valueScaletemp: string): number { return rgb_dec565(colorScale9); case '10': return rgb_dec565(colorScale10); + default: + return rgb_dec565(colorScale10); } } function HandleScreensaverColors(): void { try { - let vwIcon = []; + let vwIcon: number[] = []; if (getState(NSPanel_Path + 'Config.Screensaver.autoWeatherColorScreensaverLayout').val) { vwIcon[0] = vwIconColor[0]; vwIcon[1] = vwIconColor[1]; @@ -8734,23 +8776,24 @@ function HandleScreensaverColors(): void { rgb_dec565(sctTimeAdd); //tTimeAdd SendToPanel({ payload: payloadString }); - } catch (err) { + } catch (err: any) { log('error at function HandleScreensaverColors: '+ err.message, 'warn'); } } function GetScreenSaverEntityColor(configElement: ScreenSaverElement | null): number { try { - let colorReturn: any; - if (configElement.ScreensaverEntityIconColor != undefined) { + let colorReturn: number; + if (configElement && configElement.ScreensaverEntityIconColor != undefined) { + const ScreensaverEntityIconColor = configElement.ScreensaverEntityIconColor as IconScaleElement; if (typeof getState(configElement.ScreensaverEntity).val == 'boolean') { - let iconvalbest = (configElement.ScreensaverEntityIconColor.val_best != undefined) ? configElement.ScreensaverEntityIconColor.val_best : false ; + let iconvalbest = (typeof ScreensaverEntityIconColor == 'object' && ScreensaverEntityIconColor.val_best !== undefined ) ? ScreensaverEntityIconColor.val_best : false ; colorReturn = (getState(configElement.ScreensaverEntity).val == iconvalbest) ? rgb_dec565(colorScale0) : rgb_dec565(colorScale10); - } else if (typeof configElement.ScreensaverEntityIconColor == 'object') { - let iconvalmin = (configElement.ScreensaverEntityIconColor.val_min != undefined) ? configElement.ScreensaverEntityIconColor.val_min : 0 ; - let iconvalmax = (configElement.ScreensaverEntityIconColor.val_max != undefined) ? configElement.ScreensaverEntityIconColor.val_max : 100 ; - let iconvalbest = (configElement.ScreensaverEntityIconColor.val_best != undefined) ? configElement.ScreensaverEntityIconColor.val_best : iconvalmin ; - let valueScale = getState(configElement.ScreensaverEntity).val * configElement.ScreensaverEntityFactor; + } else if (typeof ScreensaverEntityIconColor == 'object') { + const iconvalmin: number = ScreensaverEntityIconColor.val_min != undefined ? ScreensaverEntityIconColor.val_min : 0 ; + const iconvalmax: number = ScreensaverEntityIconColor.val_max != undefined ? ScreensaverEntityIconColor.val_max : 100 ; + const iconvalbest: number = ScreensaverEntityIconColor.val_best != undefined ? ScreensaverEntityIconColor.val_best : iconvalmin ; + let valueScale = getState(configElement.ScreensaverEntity).val * configElement.ScreensaverEntityFactor!; if (iconvalmin == 0 && iconvalmax == 1) { colorReturn = (getState(configElement.ScreensaverEntity).val == 1) ? rgb_dec565(colorScale0) : rgb_dec565(colorScale10); @@ -8773,16 +8816,16 @@ function GetScreenSaverEntityColor(configElement: ScreenSaverElement | null): nu let valueScaletemp = (Math.round(valueScale)).toFixed(); colorReturn = HandleColorScale(valueScaletemp); } - if (configElement.ScreensaverEntityIconColor.val_min == undefined) { - colorReturn = rgb_dec565(configElement.ScreensaverEntityIconColor); + if (ScreensaverEntityIconColor.val_min == undefined) { + colorReturn = rgb_dec565(configElement.ScreensaverEntityIconColor as RGB); } } else { - colorReturn = rgb_dec565(White); } } else { - if (typeof getState(configElement.ScreensaverEntity).val == 'boolean') { - if (getState(configElement.ScreensaverEntity).val) { + const value: number | boolean = configElement ? getState(configElement.ScreensaverEntity).val : 0; + if (configElement && typeof value == 'boolean') { + if (value) { if (configElement.ScreensaverEntityOnColor != undefined) { colorReturn = rgb_dec565(configElement.ScreensaverEntityOnColor); } else { @@ -8800,9 +8843,10 @@ function GetScreenSaverEntityColor(configElement: ScreenSaverElement | null): nu } } return colorReturn; - } catch (err) { + } catch (err: any) { log('error at function GetScreenSaverEntityColor: '+ err.message, 'warn'); } + return rgb_dec565(White); } function GetAccuWeatherIcon(icon: number): string { @@ -8881,9 +8925,10 @@ function GetAccuWeatherIcon(icon: number): string { default: return 'alert-circle-outline'; } - } catch (err) { + } catch (err: any) { log('error at function GetAccuWeatherIcon: '+ err.message, 'warn'); } + return ''; } function GetAccuWeatherIconColor(icon: number): number { @@ -8960,9 +9005,10 @@ function GetAccuWeatherIconColor(icon: number): number { default: return rgb_dec565(White); } - } catch (err) { + } catch (err: any) { log('error at function GetAccuWeatherIconColor: '+ err.message, 'warn'); } + return 0; } function GetDasWetterIcon(icon: number): string { @@ -9019,9 +9065,10 @@ function GetDasWetterIcon(icon: number): string { default: return 'alert-circle-outline'; } - } catch (err) { + } catch (err: any) { log('error at function GetDasWetterIcon: '+ err.message, 'warn'); } + return ''; } function GetDasWetterIconColor(icon: number): number { @@ -9078,9 +9125,10 @@ function GetDasWetterIconColor(icon: number): number { default: return rgb_dec565(White); } - } catch (err) { + } catch (err: any) { log('error at function GetDasWetterIconColor: '+ err.message, 'warn'); } + return 0; } //------------------Begin Read Internal Sensor Data @@ -9114,16 +9162,16 @@ on({ id: config.panelRecvTopic.substring(0, config.panelRecvTopic.length - 'RESU await createAliasAsync(AliasPath + 'Sensor.Time.ACTUAL', NSPanel_Path + 'Sensor.Time', true, { type: 'string' }); await createAliasAsync(AliasPath + 'Sensor.TempUnit.ACTUAL', NSPanel_Path + 'Sensor.TempUnit', true, { type: 'string' }); } - } catch (err) { + } catch (err: any) { log('error Trigger reading senor-data: '+ err.message, 'warn'); } }); //------------------End Read Internal Sensor Data -function formatInSelText(Text: string ) : string { +function formatInSelText(Text: string ): string { let splitText = Text.split(' '); let lengthLineOne = 0; - let arrayLineOne = []; + let arrayLineOne: string[] = []; for (let i = 0; i < splitText.length; i++) { lengthLineOne = lengthLineOne + splitText[i].length + 1; if (lengthLineOne > 12) { @@ -9133,7 +9181,7 @@ function formatInSelText(Text: string ) : string { } } let textLineOne = arrayLineOne.join(' '); - let arrayLineTwo = []; + let arrayLineTwo: string[] = []; for (let i = arrayLineOne.length; i < splitText.length; i++) { arrayLineTwo[i] = splitText[i]; } @@ -9172,44 +9220,46 @@ function rgb_dec565(rgb: RGB): number { return ((rgb.red >> 3) << 11) | ((rgb.green >> 2)) << 5 | ((rgb.blue) >> 3); } -/* Convert radians to degrees -rad - radians to convert, expects rad in range +/- PI per Math.atan2 -returns {number} degrees equivalent of rad -*/ -function rad2deg(rad) { +/** + * Convert radians to degrees + * @param rad radians to convert, expects rad in range +/- PI per Math.atan2 + * @returns {number} degrees equivalent of rad + */ +function rad2deg(rad): number { return (360 + 180 * rad / Math.PI) % 360; } -function ColorToHex(color) { - let hexadecimal = color.toString(16); +function ColorToHex(color): string { + let hexadecimal: string = color.toString(16); return hexadecimal.length == 1 ? '0' + hexadecimal : hexadecimal; } -function ConvertRGBtoHex(red: number, green: number, blue: Number) { +function ConvertRGBtoHex(red: number, green: number, blue: Number): string { return '#' + ColorToHex(red) + ColorToHex(green) + ColorToHex(blue); } -/* Convert h,s,v values to r,g,b -hue - in range [0, 360] -saturation - in range 0 to 1 -value - in range 0 to 1 -returns {Array|number} [r, g,b] in range 0 to 255 +/** + * Convert h,s,v values to r,g,b + * @param hue in range [0, 360] + * @param saturation in range 0 to 1 + * @param value in range 0 to 1 + * @returns {[number, number, number]} [r, g,b] in range 0 to 255 */ -function hsv2rgb(hue: number, saturation: number, value: number) { +function hsv2rgb(hue: number, saturation: number, value: number): [number, number, number] { hue /= 60; let chroma = value * saturation; let x = chroma * (1 - Math.abs((hue % 2) - 1)); - let rgb = hue <= 1 ? [chroma, x, 0] : + let rgb: [number, number, number] = hue <= 1 ? [chroma, x, 0] : hue <= 2 ? [x, chroma, 0] : hue <= 3 ? [0, chroma, x] : hue <= 4 ? [0, x, chroma] : hue <= 5 ? [x, 0, chroma] : [chroma, 0, x]; - return rgb.map(v => (v + value - chroma) * 255); + return rgb.map(v => (v + value - chroma) * 255) as [number, number, number]; } -function getHue(red: number, green: number, blue: number) { +function getHue(red: number, green: number, blue: number): number { let min = Math.min(Math.min(red, green), blue); let max = Math.max(Math.max(red, green), blue); @@ -9251,10 +9301,17 @@ function pos_to_color(x: number, y: number): RGB { let hsv = rad2deg(Math.atan2(y, x)); let rgb = hsv2rgb(hsv, sat, 1); - return { red: Math.round(rgb[0]), green: Math.round(rgb[1]), blue: Math.round(rgb[2]) }; + return { red: Math.round(rgb[0]), green: Math.round(rgb[1]), blue: Math.round(rgb[2]) }; } -function rgb_to_cie(red, green, blue) +/** + * + * @param red + * @param green + * @param blue + * @returns + */ +function rgb_to_cie(red: number, green: number, blue: number): string { //Apply a gamma correction to the RGB values, which makes the color more vivid and more the like the color displayed on the screen of your device let vred = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92); @@ -9273,13 +9330,17 @@ function rgb_to_cie(red, green, blue) return cie; } - -function spotifyGetDeviceID(vDeviceString) { - const availableDeviceIDs = getState("spotify-premium.0.devices.availableDeviceListIds").val; - const availableDeviceNames = getState("spotify-premium.0.devices.availableDeviceListString").val; - let arrayDeviceListIds = availableDeviceIDs.split(";"); - let arrayDeviceListSting = availableDeviceNames.split(";"); - let indexPos = arrayDeviceListSting.indexOf(vDeviceString); +/** + * + * @param vDeviceString + * @returns + */ +function spotifyGetDeviceID(vDeviceString: string): string { + const availableDeviceIDs: string = getState("spotify-premium.0.devices.availableDeviceListIds").val; + const availableDeviceNames: string = getState("spotify-premium.0.devices.availableDeviceListString").val; + let arrayDeviceListIds: string[] = availableDeviceIDs.split(";"); + let arrayDeviceListSting: string[] = availableDeviceNames.split(";"); + let indexPos: number = arrayDeviceListSting.indexOf(vDeviceString); let strDevID = arrayDeviceListIds[indexPos]; return strDevID; } @@ -9294,142 +9355,151 @@ type Payload = { payload: string; }; -type Page = { - type: string, +type PageBaseType = { + type: PagetypeType, heading: string, items: PageItem[], - useColor: (boolean | false), - subPage: (boolean | false), - parent: (Page | undefined), - parentIcon: (string | undefined), - parentIconColor: (RGB | undefined), - prev: (string | undefined), - prevIcon: (string | undefined), - prevIconColor: (RGB | undefined), - next: (string | undefined), - nextIcon: (string | undefined), - nextIconColor: (RGB | undefined), - home: (string | undefined), - homeIcon: (string | undefined), - homeIconColor: (RGB | undefined) + useColor: boolean, + subPage?: boolean, + parent?: PageType, + parentIcon?: string, + parentIconColor?: RGB, + prev?: string, + prevIcon?: string, + prevIconColor?: RGB, + next?: string, + nextIcon?: string, + nextIconColor?: RGB, + home?: string, + homeIcon?: string, + homeIconColor?: RGB }; -interface PageEntities extends Page { +type PagetypeType = 'cardChart' | 'cardLChart' | 'cardEntities' |'cardGrid'|'cardGrid2'|'cardThermo'|'cardMedia'|'cardUnlock'|'cardQR'|'cardAlarm'|'cardPower' + +type PageType = PageChart | PageEntities | PageGrid | PageGrid2 | PageThermo | PageMedia | PageUnlock | PageQR | PageAlarm | PagePower + +// If u get a error here u forgot something in PagetypeType or PageType +function checkPageType(F: PagetypeType, A: PageType) { + A.type = F; +} + +type PageEntities = { type: 'cardEntities', items: PageItem[], -} +} & PageBaseType -interface PageGrid extends Page { +type PageGrid = { type: 'cardGrid', items: PageItem[], -} +} & PageBaseType -interface PageGrid2 extends Page { +type PageGrid2 = { type: 'cardGrid2', items: PageItem[], -} +} & PageBaseType -interface PageThermo extends Page { +type PageThermo = { type: 'cardThermo', items: PageItem[], -} +} & Omit -interface PageMedia extends Page { +type PageMedia = { type: 'cardMedia', items: PageItem[], -} +} & Omit -interface PageAlarm extends Page { +type PageAlarm = { type: 'cardAlarm', items: PageItem[], -} +} & Omit -interface PageUnlock extends Page { +type PageUnlock = { type: 'cardUnlock', items: PageItem[], -} +} & Omit & Partial> -interface PageQR extends Page { +type PageQR = { type: 'cardQR', items: PageItem[], -} +} & Omit -interface PagePower extends Page { +type PagePower = { type: 'cardPower', items: PageItem[], -} +} & Omit -interface PageChart extends Page { +type PageChart = { type: 'cardChart' | 'cardLChart', items: PageItem[], -} +} & Omit type PageItem = { - id: string, - icon: (string | undefined), - icon2: (string | undefined), - onColor: (RGB | undefined), - offColor: (RGB | undefined), - useColor: (boolean | undefined), - interpolateColor: (boolean | undefined), - minValueBrightness: (number | undefined), - maxValueBrightness: (number | undefined), - minValueColorTemp: (number | undefined), - maxValueColorTemp: (number | undefined), - minValueLevel: (number | undefined), - maxValueLevel: (number | undefined), - minValueTilt: (number | undefined), - maxValueTilt: (number | undefined), - minValue: (number | undefined), - maxValue: (number | undefined), - stepValue: (number | undefined), - prefixName: (string | undefined), - suffixName: (string | undefined), - name: (string | undefined), - secondRow: (string | undefined), - buttonText: (string | undefined), - unit: (string | undefined), - navigate: (boolean | undefined), - colormode: (string | undefined), - colorScale: (any | undefined), - adapterPlayerInstance: (string | undefined), - mediaDevice: (string | undefined), - targetPage: (string | undefined), - speakerList: (string[] | undefined), - playList: (string[] | undefined), - equalizerList: (string[] | undefined), - repeatList: (string[] | undefined), - globalTracklist: (string[] | undefined), - modeList: (string[] | undefined), - hidePassword: (boolean | undefined), - autoCreateALias: (boolean | undefined) - colorMediaIcon: (RGB | undefined), - colorMediaArtist: (RGB | undefined), - colorMediaTitle: (RGB | undefined), - popupThermoMode1: (string[] | undefined), - popupThermoMode2: (string[] | undefined), - popupThermoMode3: (string[] | undefined), - popUpThermoName: (string[] | undefined), - popupMediaMode1: (string[] | undefined), - popupMediaMode2: (string[] | undefined), - popupMediaMode3: (string[] | undefined), - popUpMediaName: (string[] | undefined), - setThermoAlias: (string[] | undefined), - setThermoDestTemp2: (string | undefined), - yAxis: (string | undefined), - yAxisTicks: (number[] | string | undefined), - xAxisDecorationId: (string | undefined), - popupType: (string | undefined), - popupOptions: (string[] | undefined), - useValue: (boolean | undefined), - monobutton: (boolean | undefined), - inSel_ChoiceState: (boolean | undefined), - iconArray: (string[] | undefined), - fontSize: (number | undefined), - actionStringArray: (string[] | undefined), - popupTimerType: (string | undefined), - alwaysOnDisplay: (boolean | undefined), - crossfade: (boolean | undefined), + id?: string | null, + icon?: string, + icon2?: string, + onColor?: RGB, + offColor?: RGB, + useColor?: boolean, + interpolateColor?: boolean, + minValueBrightness?: number, + maxValueBrightness?: number, + minValueColorTemp?: number, + maxValueColorTemp?: number, + minValueLevel?: number, + maxValueLevel?: number, + minValueTilt?: number, + maxValueTilt?: number, + minValue?: number, + maxValue?: number, + stepValue?: number, + prefixName?: string, + suffixName?: string, + name?: string, + secondRow?: string, + buttonText?: string, + unit?: string, + navigate?: boolean, + colormode?: string, + colorScale?: any, + adapterPlayerInstance?: string, + mediaDevice?: string, + targetPage?: string, + speakerList?: string[], + playList?: string[], + equalizerList?: string[], + repeatList?: string[], + globalTracklist?: string[], + modeList?: string[], + hidePassword?: boolean, + autoCreateALias?: boolean + colorMediaIcon?: RGB, + colorMediaArtist?: RGB, + colorMediaTitle?: RGB, + popupThermoMode1?: string[], + popupThermoMode2?: string[], + popupThermoMode3?: string[], + popUpThermoName?: string[], + popupMediaMode1?: string[], + popupMediaMode2?: string[], + popupMediaMode3?: string[], + popUpMediaName?: string[], + setThermoAlias?: string[], + setThermoDestTemp2?: string, + yAxis?: string, + yAxisTicks?: number[] | string, + xAxisDecorationId?: string, + popupType?: string, + popupOptions?: string[], + useValue?: boolean, + monobutton?: boolean, + inSel_ChoiceState?: boolean, + iconArray?: string[], + fontSize?: number, + actionStringArray?: string[], + popupTimerType?: string, + alwaysOnDisplay?: boolean, + crossfade?: boolean, } type DimMode = { @@ -9441,45 +9511,45 @@ type DimMode = { } type ConfigButtonFunction = { - mode: string | null, + mode: 'page' | 'toggle' | 'set' | null, page: (PageThermo | PageMedia | PageAlarm | PageQR | PageEntities | PageGrid | PageGrid2 | PagePower | PageChart | PageUnlock | null), entity: string | null, - setValue: string | number | null + setValue: string | number | boolean | null } type Config = { panelRecvTopic: string, panelSendTopic: string, - weatherEntity: string | null, - leftScreensaverEntity: ScreenSaverElement[] | null, - bottomScreensaverEntity: ScreenSaverElement[] | null, - indicatorScreensaverEntity: ScreenSaverElement[] | null, - mrIcon1ScreensaverEntity: ScreenSaverMRElement | null, - mrIcon2ScreensaverEntity: ScreenSaverMRElement | null, + weatherEntity: string, + leftScreensaverEntity: ScreenSaverElement[], + bottomScreensaverEntity: ScreenSaverElement[], + indicatorScreensaverEntity: ScreenSaverElement[], + mrIcon1ScreensaverEntity: ScreenSaverMRElement, + mrIcon2ScreensaverEntity: ScreenSaverMRElement, defaultColor: RGB, defaultOnColor: RGB, defaultOffColor: RGB, defaultBackgroundColor: RGB, - pages: (PageThermo | PageMedia | PageAlarm | PageQR | PageEntities | PageGrid | PageGrid2 | PagePower | PageChart | PageUnlock )[], - subPages: (PageThermo | PageMedia | PageAlarm | PageQR | PageEntities | PageGrid | PageGrid2 | PagePower | PageChart | PageUnlock)[], + pages: PageType[], + subPages: PageType[], button1: ConfigButtonFunction, button2: ConfigButtonFunction } type ScreenSaverElement = { - ScreensaverEntity: string | null, - ScreensaverEntityFactor: number | 1, - ScreensaverEntityDecimalPlaces: number | 0, - ScreensaverEntityDateFormat: any | null, - ScreensaverEntityIconOn: string | null, - ScreensaverEntityIconOff: string | null, - ScreensaverEntityText: string | null, - ScreensaverEntityUnitText: string | null, - ScreensaverEntityIconColor: any | null - ScreensaverEntityOnColor: any | null - ScreensaverEntityOffColor: any | null - ScreensaverEntityOnText: string | null, - ScreensaverEntityOffText: string | null, + ScreensaverEntity: string, + ScreensaverEntityFactor?: number, + ScreensaverEntityDecimalPlaces?: number, + ScreensaverEntityDateFormat?: any | null, + ScreensaverEntityIconOn?: string | null, + ScreensaverEntityIconOff?: string | null, + ScreensaverEntityText: string, + ScreensaverEntityUnitText?: string | null, + ScreensaverEntityIconColor?: RGB | IconScaleElement | string + ScreensaverEntityOnColor?: RGB + ScreensaverEntityOffColor?: RGB + ScreensaverEntityOnText?: string | null, + ScreensaverEntityOffText?: string | null, } type ScreenSaverMRElement = { @@ -9492,3 +9562,9 @@ type ScreenSaverMRElement = { ScreensaverEntityOnColor: RGB, ScreensaverEntityOffColor: RGB } + +type IconScaleElement = { + val_min:number, + val_max:number, + val_best?: number +} \ No newline at end of file