diff --git a/ioBroker/DEV/NSPanelTs.ts b/ioBroker/DEV/NSPanelTs.ts index 18e19a40..9b62d627 100644 --- a/ioBroker/DEV/NSPanelTs.ts +++ b/ioBroker/DEV/NSPanelTs.ts @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------- -TypeScript v4.3.3.37 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @ticaki / @Britzelpuf / @Sternmiere / @ravenS0ne +TypeScript v4.3.3.38 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @ticaki / @Britzelpuf / @Sternmiere / @ravenS0ne - 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 @@ -98,7 +98,13 @@ ReleaseNotes: - 09.01.2024 - v4.3.3.36 Fix: schedule SendTime - 09.01.2024 - v4.3.3.36 Fix: Function _schedule SummerTime/WinterTime - 15.01.2024 - v4.3.3.37 Change: Allow data points to be flushed for popUpNotify. Activate screensaver with one click. - + - 16.01.2024 - v4.3.3.38 Fix: joBr99#1098 + - 16.01.2024 - v4.3.3.38 Types: Number of PageItems defined & HandleScreensaverStatusIcons rewritten + - 16.01.2024 - v4.3.3.38 Optimate: function SendTime() + - 17.01.2024 - v4.3.3.38 Add: ScreensaverEntityIconSelect for MRIcons is like common.states for states. + - 17.01.2024 - v4.3.3.38 Add: Changing the ScreensaverEntityValue value updates the screensaver. + - 19.01.2024 - v4.3.3.38 Change: yAxisTicks parameter is not required in cardLChart PageItem + Todo: - XX.XX.XXXX - v5.0.0 Change the bottomScreensaverEntity (rolling) if more than 6 entries are defined @@ -964,7 +970,7 @@ export const config: Config = { // _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________ // _________________________________ EN: No more configuration from here _____________________________________ -const scriptVersion: string = 'v4.3.3.37'; +const scriptVersion: string = 'v4.3.3.38'; const tft_version: string = 'v4.3.3'; const desired_display_firmware_version = 53; const berry_driver_version = 9; @@ -1045,7 +1051,7 @@ async function CheckConfigParameters() { const i = n.shift(); if (a === 'mqtt' && !isNaN(Number(i))) { - sendTo(`${a}.${i}`, 'sendMessage2Client', {topic: n.join('/'), message: 'time~12:00'}); + sendTo(`${a}.${i}`, 'sendMessage2Client', {topic: n.join('/'), message: buildNSPanelString('time', '12:00')}); await sleep(500); } if (await existsObjectAsync(config.panelSendTopic) == false) { @@ -1428,7 +1434,7 @@ Init_Screensaver_Backckground_Color_Switch(); on({id: NSPanel_Path + 'ScreensaverInfo.bgColorIndicator', change: "ne"}, async function (obj) { try { bgColorScrSaver = obj.state.val; - if (bgColorScrSaver < 4) { + if (bgColorScrSaver < 6) { HandleScreensaverUpdate(); } } catch (err: any) { @@ -1784,9 +1790,11 @@ on({id: [String(NSPanel_Path) + 'Relay.1',String(NSPanel_Path) + 'Relay.2'], cha 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 arr = config.mrIcon1ScreensaverEntity.ScreensaverEntity != null ? [config.mrIcon1ScreensaverEntity.ScreensaverEntity] : []; + arr = config.mrIcon1ScreensaverEntity.ScreensaverEntityValue != null ? [...arr, config.mrIcon1ScreensaverEntity.ScreensaverEntityValue] : arr; + if (arr.length > 0) { + on({id: arr, change: "ne"}, async function (obj) { + 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); @@ -1796,8 +1804,10 @@ async function SubscribeMRIcons () { } }); } - if (config.mrIcon2ScreensaverEntity.ScreensaverEntity != null) { - on({id: config.mrIcon2ScreensaverEntity.ScreensaverEntity, change: "ne"}, async function (obj) { + arr = config.mrIcon2ScreensaverEntity.ScreensaverEntity != null ? [config.mrIcon2ScreensaverEntity.ScreensaverEntity] : []; + arr = config.mrIcon2ScreensaverEntity.ScreensaverEntityValue != null ? [...arr, config.mrIcon2ScreensaverEntity.ScreensaverEntityValue] : arr; + if (arr.length > 0) { + on({id: arr, change: "ne"}, async function (obj) { 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) { @@ -3053,7 +3063,7 @@ on({ id: NSPanel_Alarm_Path + 'Alarm.AlarmState', change: 'ne' }, async (obj) => } }); -function HandleMessage(typ: string, method: NSPanel.EventMethod, page: number | undefined, words: Array | undefined): void { +function HandleMessage(typ: string, method: NSPanel.EventMethod, page: number | undefined, words: string[] | undefined): void { try { if (typ == 'event') { switch (method as NSPanel.EventMethod) { @@ -3154,9 +3164,9 @@ function findPageItem(searching: String): PageItem { 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] !== undefined ? activePage.items[0].id : ''); switch (page.type) { case 'cardEntities': SendToPanel(GenerateEntitiesPage(page)); @@ -3258,7 +3268,7 @@ function SendDate(): void { const options: any = { weekday: dpWeekday, year: 'numeric', month: dpMonth, day: 'numeric' }; const _SendDate = dpCustomFormat != '' ? dayjs().format(dpCustomFormat) : date.toLocaleDateString(getState(NSPanel_Path + 'Config.locale').val, options); - SendToPanel({ payload: 'date~' + _SendDate }); + SendToPanel({ payload: 'date~' + _SendDate }); } } catch (err: any) { if (err.message = 'Cannot convert undefined or null to object') { @@ -3271,11 +3281,12 @@ function SendDate(): void { function SendTime(): void { try { - const d = new Date(); + /*const d = new Date(); const hr = (d.getHours() < 10 ? '0' : '') + d.getHours(); const min = (d.getMinutes() < 10 ? '0' : '') + d.getMinutes(); - SendToPanel({ payload: 'time~' + hr + ':' + min }); + SendToPanel({ payload: 'time~' + hr + ':' + min });*/ + SendToPanel({ payload: `time~${new Date().toLocaleTimeString('de-DE', { hour: "2-digit", minute: "2-digit" })}`, }); } catch (err: any) { log('error at function SendTime: ' + err.message, 'warn'); } @@ -3283,7 +3294,7 @@ function SendTime(): void { function GenerateEntitiesPage(page: NSPanel.PageEntities): NSPanel.Payload[] { try { - let out_msgs: Array; + let out_msgs: NSPanel.Payload[]; out_msgs = [{ payload: 'pageType~cardEntities' }] out_msgs.push({ payload: GeneratePageElements(page) }); return out_msgs @@ -3295,7 +3306,7 @@ function GenerateEntitiesPage(page: NSPanel.PageEntities): NSPanel.Payload[] { function GenerateGridPage(page: NSPanel.PageGrid): NSPanel.Payload[] { try { - let out_msgs: Array = [{ payload: 'pageType~cardGrid' }]; + let out_msgs: NSPanel.Payload[] = [{ payload: 'pageType~cardGrid' }]; out_msgs.push({ payload: GeneratePageElements(page) }); return out_msgs; } catch (err: any) { @@ -3306,7 +3317,7 @@ function GenerateGridPage(page: NSPanel.PageGrid): NSPanel.Payload[] { function GenerateGridPage2(page: NSPanel.PageGrid2): NSPanel.Payload[] { try { - let out_msgs: Array = [{ payload: 'pageType~cardGrid2' }]; + let out_msgs: NSPanel.Payload[] = [{ payload: 'pageType~cardGrid2' }]; out_msgs.push({ payload: GeneratePageElements(page) }); return out_msgs; } catch (err: any) { @@ -4314,7 +4325,7 @@ function GenerateThermoPage(page: NSPanel.PageThermo): NSPanel.Payload[] { try { UnsubscribeWatcher(); let id = page.items[0].id - let out_msgs: Array = []; + let out_msgs: NSPanel.Payload[] = []; out_msgs.push({ payload: 'pageType~cardThermo' }); // ioBroker @@ -4695,8 +4706,9 @@ function GenerateThermoPage(page: NSPanel.PageThermo): NSPanel.Payload[] { function unsubscribeMediaSubscriptions(): void { for (let i = 0; i < config.pages.length; i++) { - if (config.pages[i].type == 'cardMedia') { - let mediaID = config.pages[i].items[0].id; + const page: NSPanel.PageType = config.pages[i]; + if (isPageMedia(page)) { + let mediaID = page.items[0].id; unsubscribe(mediaID + '.STATE'); unsubscribe(mediaID + '.ARTIST'); unsubscribe(mediaID + '.TITLE'); @@ -4710,8 +4722,9 @@ function unsubscribeMediaSubscriptions(): void { } } for (let i = 0; i < config.subPages.length; i++) { - if (config.subPages[i].type == 'cardMedia') { - let mediaID = config.subPages[i].items[0].id; + const page: NSPanel.PageType = config.subPages[i]; + if (isPageMedia(page)) { + let mediaID = page.items[0].id; unsubscribe(mediaID + '.STATE'); unsubscribe(mediaID + '.ARTIST'); unsubscribe(mediaID + '.TITLE'); @@ -5050,7 +5063,7 @@ function GenerateMediaPage(page: NSPanel.PageMedia): NSPanel.Payload[] { if (!page.items[0].id) throw new Error ('Missing page id for cardMedia!'); let id = page.items[0].id; - let out_msgs: Array = []; + let out_msgs: NSPanel.Payload[] = []; if (!page.items[0].adapterPlayerInstance!) throw new Error('page.items[0].adapterPlayerInstance is undefined!') let vInstance = page.items[0].adapterPlayerInstance!; @@ -5338,7 +5351,7 @@ function GenerateMediaPage(page: NSPanel.PageMedia): NSPanel.Payload[] { //------------------------------------------------------------------------------------------------------------- // All Alexa devices (the online / player and commands directory is available) are listed and linked below // If the constant alexaSpeakerList contains at least one entry, the constant is used - otherwise all devices from the Alexa adapter - let speakerListArray: Array = []; + let speakerListArray: string[] = []; if (page.items[0].speakerList && page.items[0].speakerList.length > 0) { for (let i_index in page.items[0].speakerList) { speakerListArray.push(page.items[0].speakerList[i_index]); @@ -5669,7 +5682,7 @@ function GenerateAlarmPage(page: NSPanel.PageAlarm): NSPanel.Payload[] { let id = page.items[0].id let name = page.heading; - let out_msgs: Array = []; + let out_msgs: NSPanel.Payload[] = []; out_msgs.push({ payload: 'pageType~cardAlarm' }); let nsPath = NSPanel_Alarm_Path + 'Alarm'; @@ -5827,7 +5840,7 @@ function GenerateUnlockPage(page: NSPanel.PageUnlock): NSPanel.Payload[] { let id = page.items[0].id let name = page.heading; - let out_msgs: Array = []; + let out_msgs: NSPanel.Payload[] = []; out_msgs.push({ payload: 'pageType~cardAlarm' }); let dpPath : string = '' @@ -5908,7 +5921,7 @@ function GenerateQRPage(page: NSPanel.PageQR): NSPanel.Payload[] { 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 = []; + let out_msgs: NSPanel.Payload[] = []; out_msgs.push({ payload: 'pageType~cardQR' }); let dpPath : string = '' @@ -5998,14 +6011,16 @@ function GenerateQRPage(page: NSPanel.PageQR): NSPanel.Payload[] { function unsubscribePowerSubscriptions(): void { for (let i = 0; i < config.pages.length; i++) { - if (config.pages[i].type == 'cardPower') { - let powerID = config.pages[i].items[0].id; + const page: NSPanel.PageType = config.pages[i]; + if (isPagePower(page)) { + let powerID = page.items[0].id; unsubscribe(powerID + '.ACTUAL'); } } for (let i = 0; i < config.subPages.length; i++) { - if (config.subPages[i].type == 'cardPower') { - let powerID = config.subPages[i].items[0].id; + const page: NSPanel.PageType = config.subPages[i]; + if (isPagePower(page)) { + let powerID = page.items[0].id; unsubscribe(powerID + '.ACTUAL'); } } @@ -6049,7 +6064,7 @@ function GeneratePowerPage(page: NSPanel.PagePower): NSPanel.Payload[] { obj = JSON.parse((getState(page.items[0].id + '.ACTUAL').val)); } - let out_msgs: Array = []; + let out_msgs: NSPanel.Payload[] = []; // Leave the display on if the alwaysOnDisplay parameter is specified (true) if (page.type == 'cardPower' && pageCounter == 0 && page.items[0].alwaysOnDisplay != undefined) { @@ -6149,7 +6164,7 @@ function GenerateChartPage(page: NSPanel.PageChart): NSPanel.Payload[] { activePage = page; let id = page.items[0].id; - let out_msgs: Array = []; + let out_msgs: NSPanel.Payload[] = []; out_msgs.push({ payload: 'pageType~' + page.type }); let heading = page.heading !== undefined ? page.heading : "Chart..."; @@ -7437,7 +7452,7 @@ function GetNavigationString(pageId: number): string { function GenerateDetailPage(type: NSPanel.PopupType, optional: NSPanel.mediaOptional | undefined, pageItem: PageItem, placeId: number | undefined): NSPanel.Payload[] { if (Debug) log('GenerateDetailPage Übergabe Type: ' + type + ' - optional: ' + optional + ' - pageItem.id: ' + pageItem.id, 'info'); try { - let out_msgs: Array = []; + let out_msgs: NSPanel.Payload[] = []; let id = pageItem.id; if (id && existsObject(id)) { @@ -8239,7 +8254,7 @@ function GenerateDetailPage(type: NSPanel.PopupType, optional: NSPanel.mediaOpti // Playlist browsing not supported by squeezeboxrpc adapter. But Favorites can be used actualState = ''; // Not supported by squeezeboxrpc adapter let tempPlayList: string[] = []; - let pathParts: Array = pageItem.adapterPlayerInstance!.split('.'); + let pathParts: string[] = 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)) { @@ -8841,7 +8856,7 @@ function HandleScreensaverUpdate(): void { } if (Debug) log('HandleScreensaverUpdate payload: weatherUpdate~' + payloadString, 'info'); - SendToPanel({ payload: 'weatherUpdate~' + payloadString }); + SendToPanel({ payload: 'weatherUpdate~' + payloadString }); HandleScreensaverStatusIcons(); } @@ -8868,162 +8883,133 @@ function RegisterScreensaverEntityWatcher(id: string): void { function HandleScreensaverStatusIcons() : void { try { let payloadString = ''; - let hwBtn1Col: any = config.mrIcon1ScreensaverEntity.ScreensaverEntityOffColor; - if (config.mrIcon1ScreensaverEntity.ScreensaverEntity != null) { - // Prüfung ob ScreensaverEntity vom Typ String ist - if (typeof (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val) == 'string') { - if (Debug) log('Entity ist String', 'info') - let hwBtn1: string = getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val; - if (hwBtn1 == 'ON') { - hwBtn1Col = config.mrIcon1ScreensaverEntity.ScreensaverEntityOnColor; + const iconData: Record<'mrIcon1' | 'mrIcon2', NSPanel.ScreenSaverMRDataElement> = { + mrIcon1: { + ScreensaverEntity: config.mrIcon1ScreensaverEntity.ScreensaverEntity != null + && existsState(config.mrIcon1ScreensaverEntity.ScreensaverEntity) + ? getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val + : null, + ScreensaverEntityIconOn: config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn + ? Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn) + : '', + ScreensaverEntityIconOff: config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOff + ? Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOff) + : '', + ScreensaverEntityOnColor: config.mrIcon1ScreensaverEntity.ScreensaverEntityOnColor, + ScreensaverEntityOffColor: config.mrIcon1ScreensaverEntity.ScreensaverEntityOffColor, + ScreensaverEntityValue: config.mrIcon1ScreensaverEntity.ScreensaverEntityValue === null + ? null + : getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val, + ScreensaverEntityValueDecimalPlace: config.mrIcon1ScreensaverEntity.ScreensaverEntityValueDecimalPlace, + ScreensaverEntityValueUnit: config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit, + ScreensaverEntityIconSelect: config.mrIcon1ScreensaverEntity.ScreensaverEntityIconSelect + && typeof config.mrIcon1ScreensaverEntity.ScreensaverEntityIconSelect === 'object' + ? config.mrIcon1ScreensaverEntity.ScreensaverEntityIconSelect + : null, + + + }, + mrIcon2: { + ScreensaverEntity: config.mrIcon2ScreensaverEntity.ScreensaverEntity != null + && existsState(config.mrIcon2ScreensaverEntity.ScreensaverEntity) + ? getState(config.mrIcon2ScreensaverEntity.ScreensaverEntity).val + : null, + ScreensaverEntityIconOn: config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOn + ? Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOn) + : '', + ScreensaverEntityIconOff: config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOff + ? Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOff) + : '', + ScreensaverEntityOnColor: config.mrIcon2ScreensaverEntity.ScreensaverEntityOnColor, + ScreensaverEntityOffColor: config.mrIcon2ScreensaverEntity.ScreensaverEntityOffColor, + ScreensaverEntityValue: config.mrIcon2ScreensaverEntity.ScreensaverEntityValue === null + ? null + : getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val, + ScreensaverEntityValueDecimalPlace: config.mrIcon2ScreensaverEntity.ScreensaverEntityValueDecimalPlace, + ScreensaverEntityValueUnit: config.mrIcon2ScreensaverEntity.ScreensaverEntityValueUnit, + ScreensaverEntityIconSelect: config.mrIcon2ScreensaverEntity.ScreensaverEntityIconSelect + && typeof config.mrIcon2ScreensaverEntity.ScreensaverEntityIconSelect === 'object' + ? config.mrIcon2ScreensaverEntity.ScreensaverEntityIconSelect + : null, + } + } + for (const a in iconData) { + if (iconData[a].ScreensaverEntityValue !== null) { + switch (typeof iconData[a].ScreensaverEntityValue) { + case "string": + if (iconData[a].ScreensaverEntityValue === '' || isNaN(iconData[a].ScreensaverEntityValue)) break; + case "number": + case "bigint": + iconData[a].ScreensaverEntityValue = Number(iconData[a].ScreensaverEntityValue).toFixed(iconData[a].ScreensaverEntityValueDecimalPlace); + break; + case "boolean": + break; + case "symbol": + case "undefined": + case "object": + case "function": + iconData[a].ScreensaverEntityValue = null; + } + } + let hwBtn1Col: RGB = iconData[a].ScreensaverEntityOffColor; + if (iconData[a].ScreensaverEntity != null || iconData[a].ScreensaverEntityValue != null) { + // Prüfung ob ScreensaverEntity vom Typ String ist + if (iconData[a].ScreensaverEntity != null) { + if (typeof (iconData[a].ScreensaverEntity) == 'string') { + if (Debug) log('Entity ist String', 'info') + switch (String(iconData[a].ScreensaverEntity).toUpperCase()) { + case 'ON': + case 'OK': + case 'AN': + case 'YES': + case 'TRUE': + case 'ONLINE': + hwBtn1Col = iconData[a].ScreensaverEntityOnColor; + break; + default: + } + if (Debug) log('Value: ' + iconData[a].ScreensaverEntity + ' Color: ' + JSON.stringify(hwBtn1Col), 'info') + // Alles was kein String ist in Boolean umwandeln + } else { + if (Debug) log('Entity ist kein String', 'info') + if (!!iconData[a].ScreensaverEntity) { + hwBtn1Col = iconData[a].ScreensaverEntityOnColor; + } + } } - if (Debug) log('Value: ' + hwBtn1 + ' Color: ' + JSON.stringify(hwBtn1Col), 'info') // Icon ermitteln - if (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val) { - payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn); + if (iconData[a].ScreensaverEntityIconSelect && iconData[a].ScreensaverEntity != null) { + const icon = iconData[a].ScreensaverEntityIconSelect[iconData[a].ScreensaverEntity]; + if (icon !== undefined) { + payloadString += Icons.GetIcon(icon); + if (Debug) log('SelectIcon: '+payloadString, 'info') + } + } else if (iconData[a].ScreensaverEntity) { + payloadString += iconData[a].ScreensaverEntityIconOn; if (Debug) log('Icon if true '+payloadString, 'info') } else { - if (config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOff != null) { - payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOff); - if (Debug) log('Icon else true '+payloadString, 'info') + if (iconData[a].ScreensaverEntityIconOff) { + payloadString += iconData[a].ScreensaverEntityIconOff; + if (Debug) log('Icon1 else true '+payloadString, 'info') } else { - payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn); - if (Debug) log('Icon else false '+payloadString, 'info') + payloadString += iconData[a].ScreensaverEntityIconOn; + if (Debug) log('Icon1 else false '+payloadString, 'info') } } - if (config.mrIcon1ScreensaverEntity.ScreensaverEntityValue != null) { - if (isNaN(getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val) == false) { - payloadString += (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val).toFixed(config.mrIcon1ScreensaverEntity.ScreensaverEntityValueDecimalPlace); - payloadString += (config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit == null) ? '' : config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit; - if (Debug) log('Value ist eine Zahl ' + payloadString, 'info') - } else { - payloadString += getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val - if (Debug) log('Value ist keine Zahl ' + payloadString, 'info') - } - } - payloadString += '~' + rgb_dec565(hwBtn1Col) + '~'; - } else if (typeof (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val) == 'boolean') { - let hwBtn1: boolean = getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val; - if (hwBtn1) { - hwBtn1Col = config.mrIcon1ScreensaverEntity.ScreensaverEntityOnColor; - } - if (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val) { - payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn); - } else { - if (config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOff != null) { - payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOff); - } else { - payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn); - } - } - if (config.mrIcon1ScreensaverEntity.ScreensaverEntityValue != null) { - if (isNaN(getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val) == false) { - payloadString += (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val).toFixed(config.mrIcon1ScreensaverEntity.ScreensaverEntityValueDecimalPlace); - payloadString += (config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit == null) ? '' : config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit; - } else { - payloadString += getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val - } - } + + if (iconData[a].ScreensaverEntityValue != null) { + payloadString += iconData[a].ScreensaverEntityValue; + payloadString += (iconData[a].ScreensaverEntityValueUnit == null) ? '' : iconData[a].ScreensaverEntityValueUnit; + } + payloadString += '~' + rgb_dec565(hwBtn1Col) + '~'; + } else { + hwBtn1Col = Black; + payloadString += '~~'; } - } else if (config.mrIcon1ScreensaverEntity.ScreensaverEntity == null && config.mrIcon1ScreensaverEntity.ScreensaverEntityValue != null){ - - if(config.mrIcon1ScreensaverEntity.ScreensaverEntityOnColor != null){ - hwBtn1Col = config.mrIcon1ScreensaverEntity.ScreensaverEntityOnColor; - } - if(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn != null){ - payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn); - } - - if (config.mrIcon1ScreensaverEntity.ScreensaverEntityValue != null) { - if (isNaN(getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val) == false) { - payloadString += (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val).toFixed(config.mrIcon1ScreensaverEntity.ScreensaverEntityValueDecimalPlace); - payloadString += (config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit == null) ? '' : config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit; - } else { - payloadString += getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val - } - } - payloadString += '~' + rgb_dec565(hwBtn1Col) + '~'; } - else { - hwBtn1Col = Black; - payloadString += '~~'; - } - - let hwBtn2Col: any = config.mrIcon2ScreensaverEntity.ScreensaverEntityOffColor; - if (config.mrIcon2ScreensaverEntity.ScreensaverEntity != null) { - if (typeof (getState(config.mrIcon2ScreensaverEntity.ScreensaverEntity).val) == 'string') { - let hwBtn2: string = getState(config.mrIcon2ScreensaverEntity.ScreensaverEntity).val; - if (hwBtn2 == 'ON') { - hwBtn2Col = config.mrIcon2ScreensaverEntity.ScreensaverEntityOnColor; - } - if (getState(config.mrIcon2ScreensaverEntity.ScreensaverEntity).val) { - payloadString += Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOn); - } else { - if (config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOff != null) { - payloadString += Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOff); - } else { - payloadString += Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOn); - } - } - if (config.mrIcon2ScreensaverEntity.ScreensaverEntityValue != null) { - if (isNaN(getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val) == false) { - payloadString += (getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val).toFixed(config.mrIcon2ScreensaverEntity.ScreensaverEntityValueDecimalPlace); - payloadString += (config.mrIcon2ScreensaverEntity.ScreensaverEntityValueUnit == null) ? '' : config.mrIcon2ScreensaverEntity.ScreensaverEntityValueUnit; - } else { - payloadString += getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val - } - } - payloadString += '~' + rgb_dec565(hwBtn2Col) + '~'; - } else if (typeof (getState(config.mrIcon2ScreensaverEntity.ScreensaverEntity).val) == 'boolean') { - let hwBtn2: boolean = getState(config.mrIcon2ScreensaverEntity.ScreensaverEntity).val; - if (hwBtn2) { - hwBtn2Col = config.mrIcon2ScreensaverEntity.ScreensaverEntityOnColor; - } - if (getState(config.mrIcon2ScreensaverEntity.ScreensaverEntity).val) { - payloadString += Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOn); - } else { - if (config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOff != null) { - payloadString += Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOff); - } else { - payloadString += Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOn); - } - } - if (config.mrIcon2ScreensaverEntity.ScreensaverEntityValue != null) { - if (isNaN(getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val) == false) { - payloadString += (getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val).toFixed(config.mrIcon2ScreensaverEntity.ScreensaverEntityValueDecimalPlace); - payloadString += (config.mrIcon2ScreensaverEntity.ScreensaverEntityValueUnit == null) ? '' : config.mrIcon2ScreensaverEntity.ScreensaverEntityValueUnit; - } else { - payloadString += getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val - } - } - payloadString += '~' + rgb_dec565(hwBtn2Col) + '~'; - } - } else if (config.mrIcon2ScreensaverEntity.ScreensaverEntity == null && config.mrIcon2ScreensaverEntity.ScreensaverEntityValue != null){ - - if(config.mrIcon2ScreensaverEntity.ScreensaverEntityOnColor != null){ - hwBtn2Col = config.mrIcon2ScreensaverEntity.ScreensaverEntityOnColor; - } - - if(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOn != null){ - payloadString += Icons.GetIcon(config.mrIcon2ScreensaverEntity.ScreensaverEntityIconOn); - } - - if (config.mrIcon2ScreensaverEntity.ScreensaverEntityValue != null) { - if (isNaN(getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val) == false) { - payloadString += (getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val).toFixed(config.mrIcon2ScreensaverEntity.ScreensaverEntityValueDecimalPlace); - payloadString += (config.mrIcon2ScreensaverEntity.ScreensaverEntityValueUnit == null) ? '' : config.mrIcon2ScreensaverEntity.ScreensaverEntityValueUnit; - } else { - payloadString += getState(config.mrIcon2ScreensaverEntity.ScreensaverEntityValue).val - } - } - payloadString += '~' + rgb_dec565(hwBtn2Col) + '~'; - } else { - hwBtn2Col = Black; - payloadString += '~~'; - } - + let alternateScreensaverMFRIcon1Size = getState(NSPanel_Path + 'Config.MRIcons.alternateMRIconSize.1').val let alternateScreensaverMFRIcon2Size = getState(NSPanel_Path + 'Config.MRIcons.alternateMRIconSize.2').val //Alternate MRIcon Size @@ -9038,7 +9024,7 @@ function HandleScreensaverStatusIcons() : void { payloadString += '~'; } - SendToPanel({ payload: 'statusUpdate~' + payloadString }); + SendToPanel({ payload: 'statusUpdate~' + payloadString }); } catch (err: any) { log('error at function HandleScreensaverStatusIcons: ' + err.message, 'warn'); @@ -9115,25 +9101,27 @@ function HandleScreensaverColors(): void { scrSvrBGCol = rgb_dec565({ red: 100, green: 0, blue: 0 }); } - let payloadString = 'color' + '~' + - scrSvrBGCol + '~' + //background - rgb_dec565(sctime) + '~' + //time - rgb_dec565(sctimeAMPM) + '~' + //timeAMPM~ - rgb_dec565(scdate) + '~' + //date~ - rgb_dec565(sctMainText) + '~' + //tMainText~ - rgb_dec565(sctForecast1) + '~' + //tForecast1~ - rgb_dec565(sctForecast2) + '~' + //tForecast2~ - rgb_dec565(sctForecast3) + '~' + //tForecast3~ - rgb_dec565(sctForecast4) + '~' + //tForecast4~ - rgb_dec565(sctForecast1Val) + '~' + //tForecast1Val~ - rgb_dec565(sctForecast2Val) + '~' + //tForecast2Val~ - rgb_dec565(sctForecast3Val) + '~' + //tForecast3Val~ - rgb_dec565(sctForecast4Val) + '~' + //tForecast4Val~ - rgb_dec565(scbar) + '~' + //bar~ - rgb_dec565(sctMainTextAlt) + '~' + //tMainTextAlt - rgb_dec565(sctTimeAdd); //tTimeAdd + let payloadString = buildNSPanelString( + 'color' , + scrSvrBGCol , //background + rgb_dec565(sctime) , //time + rgb_dec565(sctimeAMPM) , //timeAMPM~ + rgb_dec565(scdate) , //date~ + rgb_dec565(sctMainText) , //tMainText~ + rgb_dec565(sctForecast1) , //tForecast1~ + rgb_dec565(sctForecast2) , //tForecast2~ + rgb_dec565(sctForecast3) , //tForecast3~ + rgb_dec565(sctForecast4) , //tForecast4~ + rgb_dec565(sctForecast1Val) , //tForecast1Val~ + rgb_dec565(sctForecast2Val) , //tForecast2Val~ + rgb_dec565(sctForecast3Val) , //tForecast3Val~ + rgb_dec565(sctForecast4Val) , //tForecast4Val~ + rgb_dec565(scbar) , //bar~ + rgb_dec565(sctMainTextAlt) , //tMainTextAlt + rgb_dec565(sctTimeAdd) //tTimeAdd + ); - SendToPanel({ payload: payloadString }); + SendToPanel({ payload: payloadString }); } catch (err: any) { log('error at function HandleScreensaverColors: '+ err.message, 'warn'); } @@ -9567,7 +9555,7 @@ function Interpolate(color1: RGB, color2: RGB, fraction: number): RGB { let r: number = InterpolateNum(color1.red, color2.red, fraction); let g: number = InterpolateNum(color1.green, color2.green, fraction); let b: number = InterpolateNum(color1.blue, color2.blue, fraction); - return { red: Math.round(r), green: Math.round(g), blue: Math.round(b) }; + return { red: Math.round(r), green: Math.round(g), blue: Math.round(b) }; } function InterpolateNum(d1: number, d2: number, fraction: number): number { @@ -9704,6 +9692,14 @@ function spotifyGetDeviceID(vDeviceString: string): string { let strDevID = arrayDeviceListIds[indexPos]; return strDevID; } +/** + * Join arguments with ~ and return the string; + * @param tokens unlimited numbers of strings + * @returns + */ +function buildNSPanelString(...tokens: (string|number)[]): string { + return tokens.join('~'); +} type RGB = NSPanel.RGB; type PageItem = NSPanel.PageItem; @@ -9835,12 +9831,24 @@ function isPageThermoItem(F: PageItem | NSPanel.PageThermoItem):F is NSPanel.Pag return 'popupThermoMode1' in F; } +function isPageMedia(F: NSPanel.PageType | NSPanel.PageMedia):F is NSPanel.PageMedia { + return F.type == 'cardMedia'; +} +function isPagePower(F: NSPanel.PageType | NSPanel.PagePower):F is NSPanel.PagePower { + return F.type == 'cardPower'; +} + namespace NSPanel { export type PopupType = 'popupFan' | 'popupInSel' | 'popupLight' | 'popupLightNew' | 'popupNotify' | 'popupShutter' | 'popupThermo' | 'popupTimer' export type EventMethod = 'startup' | 'sleepReached' | 'pageOpenDetail' | 'buttonPress2' | 'renderCurrentPage' | 'button1' | 'button2' + export type panelRecvType = { + event: 'event'; + method: EventMethod + } + export type SerialType = 'button' | 'light' | 'shutter' | 'text' | 'input_sel' | 'timer' | 'number' | 'fan' @@ -9894,48 +9902,49 @@ namespace NSPanel { export type PageEntities = { type: 'cardEntities', - items: PageItem[], + items: [PageItem?, PageItem?, PageItem?, PageItem?, PageItem?], } & PageBaseType export type PageGrid = { type: 'cardGrid', - items: PageItem[], + items: [PageItem?, PageItem?, PageItem?, PageItem?, PageItem?, PageItem?], } & PageBaseType export type PageGrid2 = { type: 'cardGrid2', - items: PageItem[], + items: [PageItem?, PageItem?, PageItem?, PageItem?, PageItem?, PageItem?, PageItem?, PageItem?], } & PageBaseType export type PageThermo = { type: 'cardThermo', - items: PageThermoItem[], + items: [PageThermoItem], } & Omit export type PageMedia = { type: 'cardMedia', - items: PageMediaItem[], + items: [PageMediaItem], } & Omit + export type PageAlarm = { type: 'cardAlarm', - items: PageItem[], + items: [PageItem], } & Omit export type PageUnlock = { type: 'cardUnlock', - items: PageItem[], + items: [PageItem], } & Omit & Partial> export type PageQR = { type: 'cardQR', - items: PageItem[], + items: [PageItem], } & Omit export type PagePower = { type: 'cardPower', - items: PageItem[], + items: [PageItem], } & Omit export type PageChart = { @@ -10077,6 +10086,7 @@ namespace NSPanel { export type ScreenSaverMRElement = { ScreensaverEntity: string | null, ScreensaverEntityIconOn: string | null, + ScreensaverEntityIconSelect?: {[key: string]: string} | null | undefined, ScreensaverEntityIconOff: string | null, ScreensaverEntityValue: string | null, ScreensaverEntityValueDecimalPlace: number | null, @@ -10084,6 +10094,17 @@ namespace NSPanel { ScreensaverEntityOnColor: RGB, ScreensaverEntityOffColor: RGB } + export type ScreenSaverMRDataElement = { + ScreensaverEntity: string | number | boolean | null, + ScreensaverEntityIconOn: string | null, + ScreensaverEntityIconOff: string | null, + ScreensaverEntityValue: string | number | boolean | null, + ScreensaverEntityValueDecimalPlace: number | null, + ScreensaverEntityValueUnit: string | null, + ScreensaverEntityOnColor: RGB, + ScreensaverEntityOffColor: RGB + ScreensaverEntityIconSelect: {[key: string]: string} | null, + } export type IconScaleElement = { val_min:number,