diff --git a/ioBroker/NsPanelTs.ts b/ioBroker/NsPanelTs.ts index 75faa033..d74cf3e8 100644 --- a/ioBroker/NsPanelTs.ts +++ b/ioBroker/NsPanelTs.ts @@ -451,7 +451,7 @@ let NSPanel_Service_SubPage: PageEntities = ] }; //Level_2 - let NSPanel_Wifi_Info_1: PageEntities = + let NSPanel_Wifi_Info_1: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('nspanel_wifi1'), @@ -467,7 +467,7 @@ let NSPanel_Service_SubPage: PageEntities = ] }; - let NSPanel_Wifi_Info_2: PageEntities = + let NSPanel_Wifi_Info_2: PageType = { 'type': 'cardEntities', 'heading': findLocaleServMenu('nspanel_wifi2'), @@ -2077,7 +2077,7 @@ InitPopupNotify(); let subscriptions: any = {}; let screensaverEnabled: boolean = false; let pageId = 0; -let activePage: Page | undefined = undefined; +let activePage: PageType | undefined = undefined; //Send time to NSPanel let scheduleSendTime = schedule('* * * * *', () => { @@ -2977,6 +2977,9 @@ function HandleMessage(typ: string, method: string, page: number | undefined, wo 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]; } @@ -3036,7 +3039,7 @@ function findPageItem(searching: String): PageItem { } } -function GeneratePage(page: Page): void { +function GeneratePage(page: PageType): void { try { activePage = page; setIfExists(NSPanel_Path + 'ActivePage.type', activePage!.type); @@ -3044,38 +3047,38 @@ function GeneratePage(page: Page): void { 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: any) { @@ -3200,7 +3203,7 @@ function GenerateGridPage2(page: PageGrid2): Payload[] { } } -function GeneratePageElements(page: Page): string { +function GeneratePageElements(page: PageType): string { try { activePage = page; let maxItems = 0; @@ -3245,7 +3248,7 @@ 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'); @@ -3268,7 +3271,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' }); @@ -3280,7 +3283,7 @@ 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'; @@ -3824,7 +3827,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); @@ -4204,7 +4207,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; @@ -4819,9 +4822,11 @@ 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 = []; - + if (!page.items[0].adapterPlayerInstance!) throw new Error('page.items[0].adapterPlayerInstance is undefined!') let vInstance = page.items[0].adapterPlayerInstance!; let v1Adapter = vInstance.split('.'); @@ -4829,7 +4834,7 @@ function GenerateMediaPage(page: PageMedia): Payload[] { // 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 ?? ''; @@ -5385,6 +5390,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; @@ -5393,6 +5399,7 @@ 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); } @@ -5556,6 +5563,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) } @@ -5623,7 +5631,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' }); @@ -5741,6 +5749,8 @@ function subscribePowerSubscriptions(id: string): void { function GeneratePowerPage(page: PagePower): Payload[] { try { + 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){ @@ -5962,7 +5972,8 @@ 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); } @@ -7046,7 +7057,7 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem let out_msgs: Array = []; let id = pageItem.id; - if (existsObject(id)) { + if (id && existsObject(id)) { let o = getObject(id); let val: (boolean | number) = 0; @@ -7898,7 +7909,7 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem 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 || @@ -9306,13 +9317,13 @@ type Payload = { payload: string; }; -type Page = { - type: string, +type PageBaseType = { + type: PagetypeType, heading: string, items: PageItem[], useColor: boolean, subPage?: boolean, - parent?: Page, + parent?: PageType, parentIcon?: string, parentIconColor?: RGB, prev?: string, @@ -9326,58 +9337,67 @@ type Page = { homeIconColor?: RGB }; +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[], -} & Page +} & PageBaseType type PageGrid = { type: 'cardGrid', items: PageItem[], -} & Page +} & PageBaseType type PageGrid2 = { type: 'cardGrid2', items: PageItem[], -} & Page +} & PageBaseType type PageThermo = { type: 'cardThermo', items: PageItem[], -} & Page +} & PageBaseType type PageMedia = { type: 'cardMedia', items: PageItem[], -} & Page +} & PageBaseType type PageAlarm = { type: 'cardAlarm', items: PageItem[], -} & Page +} & PageBaseType type PageUnlock = { type: 'cardUnlock', items: PageItem[], -} & Page +} & PageBaseType type PageQR = { type: 'cardQR', items: PageItem[], -} & Page +} & PageBaseType type PagePower = { type: 'cardPower', items: PageItem[], -} & Page +} & PageBaseType type PageChart = { type: 'cardChart' | 'cardLChart', items: PageItem[], -} & Page +} & Omit type PageItem = { - id: string, + id?: string | null, icon?: string, icon2?: string, onColor?: RGB, @@ -9472,8 +9492,8 @@ type Config = { 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 } @@ -9509,4 +9529,4 @@ type IconScaleElement = { val_min:number, val_max:number, val_best?: number -} +} \ No newline at end of file