Merge pull request #1140 from ticaki/main

siehe Beschreibung
This commit is contained in:
Armilar
2024-01-19 12:52:22 +01:00
committed by GitHub

View File

@@ -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 - 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 @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 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: schedule SendTime
- 09.01.2024 - v4.3.3.36 Fix: Function _schedule SummerTime/WinterTime - 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. - 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: Todo:
- XX.XX.XXXX - v5.0.0 Change the bottomScreensaverEntity (rolling) if more than 6 entries are defined - 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 _____________________________________ // _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________
// _________________________________ EN: No more configuration from here _____________________________________ // _________________________________ 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 tft_version: string = 'v4.3.3';
const desired_display_firmware_version = 53; const desired_display_firmware_version = 53;
const berry_driver_version = 9; const berry_driver_version = 9;
@@ -1045,7 +1051,7 @@ async function CheckConfigParameters() {
const i = n.shift(); const i = n.shift();
if (a === 'mqtt' && !isNaN(Number(i))) { 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); await sleep(500);
} }
if (await existsObjectAsync(config.panelSendTopic) == false) { 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) { on({id: NSPanel_Path + 'ScreensaverInfo.bgColorIndicator', change: "ne"}, async function (obj) {
try { try {
bgColorScrSaver = obj.state.val; bgColorScrSaver = obj.state.val;
if (bgColorScrSaver < 4) { if (bgColorScrSaver < 6) {
HandleScreensaverUpdate(); HandleScreensaverUpdate();
} }
} catch (err: any) { } catch (err: any) {
@@ -1784,9 +1790,11 @@ on({id: [String(NSPanel_Path) + 'Relay.1',String(NSPanel_Path) + 'Relay.2'], cha
async function SubscribeMRIcons () { async function SubscribeMRIcons () {
try { try {
if (config.mrIcon1ScreensaverEntity.ScreensaverEntity != null) { let arr = config.mrIcon1ScreensaverEntity.ScreensaverEntity != null ? [config.mrIcon1ScreensaverEntity.ScreensaverEntity] : [];
on({id: config.mrIcon1ScreensaverEntity.ScreensaverEntity, change: "ne"}, async function (obj) { arr = config.mrIcon1ScreensaverEntity.ScreensaverEntityValue != null ? [...arr, config.mrIcon1ScreensaverEntity.ScreensaverEntityValue] : arr;
if (obj.id!.substring(0,4) == 'mqtt') { if (arr.length > 0) {
on({id: arr, change: "ne"}, async function (obj) {
if (obj.id!.substring(0,4) == 'mqtt') {
let Button = obj.id!.split('.'); let Button = obj.id!.split('.');
if (getState(NSPanel_Path + 'Relay.' + Button[Button.length - 1].substring(5,6)).val != obj.state.val) { 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); 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) { arr = config.mrIcon2ScreensaverEntity.ScreensaverEntity != null ? [config.mrIcon2ScreensaverEntity.ScreensaverEntity] : [];
on({id: config.mrIcon2ScreensaverEntity.ScreensaverEntity, change: "ne"}, async function (obj) { 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') { if (obj.id!.substring(0,4) == 'mqtt') {
let Button = obj.id!.split('.'); let Button = obj.id!.split('.');
if (getState(NSPanel_Path + 'Relay.' + Button[Button.length - 1].substring(5,6)).val != obj.state.val) { 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<string> | undefined): void { function HandleMessage(typ: string, method: NSPanel.EventMethod, page: number | undefined, words: string[] | undefined): void {
try { try {
if (typ == 'event') { if (typ == 'event') {
switch (method as NSPanel.EventMethod) { switch (method as NSPanel.EventMethod) {
@@ -3154,9 +3164,9 @@ function findPageItem(searching: String): PageItem {
function GeneratePage(page: PageType): void { function GeneratePage(page: PageType): void {
try { try {
activePage = page; activePage = page;
setIfExists(NSPanel_Path + 'ActivePage.type', activePage!.type); setIfExists(NSPanel_Path + 'ActivePage.type', activePage.type);
setIfExists(NSPanel_Path + 'ActivePage.heading', activePage!.heading); setIfExists(NSPanel_Path + 'ActivePage.heading', activePage.heading);
setIfExists(NSPanel_Path + 'ActivePage.id0', activePage!.items[0].id); setIfExists(NSPanel_Path + 'ActivePage.id0', activePage.items[0] !== undefined ? activePage.items[0].id : '');
switch (page.type) { switch (page.type) {
case 'cardEntities': case 'cardEntities':
SendToPanel(GenerateEntitiesPage(page)); SendToPanel(GenerateEntitiesPage(page));
@@ -3258,7 +3268,7 @@ function SendDate(): void {
const options: any = { weekday: dpWeekday, year: 'numeric', month: dpMonth, day: 'numeric' }; 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); const _SendDate = dpCustomFormat != '' ? dayjs().format(dpCustomFormat) : date.toLocaleDateString(getState(NSPanel_Path + 'Config.locale').val, options);
SendToPanel(<NSPanel.Payload>{ payload: 'date~' + _SendDate }); SendToPanel({ payload: 'date~' + _SendDate });
} }
} catch (err: any) { } catch (err: any) {
if (err.message = 'Cannot convert undefined or null to object') { if (err.message = 'Cannot convert undefined or null to object') {
@@ -3271,11 +3281,12 @@ function SendDate(): void {
function SendTime(): void { function SendTime(): void {
try { try {
const d = new Date(); /*const d = new Date();
const hr = (d.getHours() < 10 ? '0' : '') + d.getHours(); const hr = (d.getHours() < 10 ? '0' : '') + d.getHours();
const min = (d.getMinutes() < 10 ? '0' : '') + d.getMinutes(); const min = (d.getMinutes() < 10 ? '0' : '') + d.getMinutes();
SendToPanel(<NSPanel.Payload>{ 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) { } catch (err: any) {
log('error at function SendTime: ' + err.message, 'warn'); log('error at function SendTime: ' + err.message, 'warn');
} }
@@ -3283,7 +3294,7 @@ function SendTime(): void {
function GenerateEntitiesPage(page: NSPanel.PageEntities): NSPanel.Payload[] { function GenerateEntitiesPage(page: NSPanel.PageEntities): NSPanel.Payload[] {
try { try {
let out_msgs: Array<NSPanel.Payload>; let out_msgs: NSPanel.Payload[];
out_msgs = [{ payload: 'pageType~cardEntities' }] out_msgs = [{ payload: 'pageType~cardEntities' }]
out_msgs.push({ payload: GeneratePageElements(page) }); out_msgs.push({ payload: GeneratePageElements(page) });
return out_msgs return out_msgs
@@ -3295,7 +3306,7 @@ function GenerateEntitiesPage(page: NSPanel.PageEntities): NSPanel.Payload[] {
function GenerateGridPage(page: NSPanel.PageGrid): NSPanel.Payload[] { function GenerateGridPage(page: NSPanel.PageGrid): NSPanel.Payload[] {
try { try {
let out_msgs: Array<NSPanel.Payload> = [{ payload: 'pageType~cardGrid' }]; let out_msgs: NSPanel.Payload[] = [{ payload: 'pageType~cardGrid' }];
out_msgs.push({ payload: GeneratePageElements(page) }); out_msgs.push({ payload: GeneratePageElements(page) });
return out_msgs; return out_msgs;
} catch (err: any) { } catch (err: any) {
@@ -3306,7 +3317,7 @@ function GenerateGridPage(page: NSPanel.PageGrid): NSPanel.Payload[] {
function GenerateGridPage2(page: NSPanel.PageGrid2): NSPanel.Payload[] { function GenerateGridPage2(page: NSPanel.PageGrid2): NSPanel.Payload[] {
try { try {
let out_msgs: Array<NSPanel.Payload> = [{ payload: 'pageType~cardGrid2' }]; let out_msgs: NSPanel.Payload[] = [{ payload: 'pageType~cardGrid2' }];
out_msgs.push({ payload: GeneratePageElements(page) }); out_msgs.push({ payload: GeneratePageElements(page) });
return out_msgs; return out_msgs;
} catch (err: any) { } catch (err: any) {
@@ -4314,7 +4325,7 @@ function GenerateThermoPage(page: NSPanel.PageThermo): NSPanel.Payload[] {
try { try {
UnsubscribeWatcher(); UnsubscribeWatcher();
let id = page.items[0].id let id = page.items[0].id
let out_msgs: Array<NSPanel.Payload> = []; let out_msgs: NSPanel.Payload[] = [];
out_msgs.push({ payload: 'pageType~cardThermo' }); out_msgs.push({ payload: 'pageType~cardThermo' });
// ioBroker // ioBroker
@@ -4695,8 +4706,9 @@ function GenerateThermoPage(page: NSPanel.PageThermo): NSPanel.Payload[] {
function unsubscribeMediaSubscriptions(): void { function unsubscribeMediaSubscriptions(): void {
for (let i = 0; i < config.pages.length; i++) { for (let i = 0; i < config.pages.length; i++) {
if (config.pages[i].type == 'cardMedia') { const page: NSPanel.PageType = config.pages[i];
let mediaID = config.pages[i].items[0].id; if (isPageMedia(page)) {
let mediaID = page.items[0].id;
unsubscribe(mediaID + '.STATE'); unsubscribe(mediaID + '.STATE');
unsubscribe(mediaID + '.ARTIST'); unsubscribe(mediaID + '.ARTIST');
unsubscribe(mediaID + '.TITLE'); unsubscribe(mediaID + '.TITLE');
@@ -4710,8 +4722,9 @@ function unsubscribeMediaSubscriptions(): void {
} }
} }
for (let i = 0; i < config.subPages.length; i++) { for (let i = 0; i < config.subPages.length; i++) {
if (config.subPages[i].type == 'cardMedia') { const page: NSPanel.PageType = config.subPages[i];
let mediaID = config.subPages[i].items[0].id; if (isPageMedia(page)) {
let mediaID = page.items[0].id;
unsubscribe(mediaID + '.STATE'); unsubscribe(mediaID + '.STATE');
unsubscribe(mediaID + '.ARTIST'); unsubscribe(mediaID + '.ARTIST');
unsubscribe(mediaID + '.TITLE'); 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!'); if (!page.items[0].id) throw new Error ('Missing page id for cardMedia!');
let id = page.items[0].id; let id = page.items[0].id;
let out_msgs: Array<NSPanel.Payload> = []; let out_msgs: NSPanel.Payload[] = [];
if (!page.items[0].adapterPlayerInstance!) throw new Error('page.items[0].adapterPlayerInstance is undefined!') if (!page.items[0].adapterPlayerInstance!) throw new Error('page.items[0].adapterPlayerInstance is undefined!')
let vInstance = page.items[0].adapterPlayerInstance!; 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 // 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 // If the constant alexaSpeakerList contains at least one entry, the constant is used - otherwise all devices from the Alexa adapter
let speakerListArray: Array<string> = []; let speakerListArray: string[] = [];
if (page.items[0].speakerList && page.items[0].speakerList.length > 0) { if (page.items[0].speakerList && page.items[0].speakerList.length > 0) {
for (let i_index in page.items[0].speakerList) { for (let i_index in page.items[0].speakerList) {
speakerListArray.push(page.items[0].speakerList[i_index]); 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 id = page.items[0].id
let name = page.heading; let name = page.heading;
let out_msgs: Array<NSPanel.Payload> = []; let out_msgs: NSPanel.Payload[] = [];
out_msgs.push({ payload: 'pageType~cardAlarm' }); out_msgs.push({ payload: 'pageType~cardAlarm' });
let nsPath = NSPanel_Alarm_Path + 'Alarm'; let nsPath = NSPanel_Alarm_Path + 'Alarm';
@@ -5827,7 +5840,7 @@ function GenerateUnlockPage(page: NSPanel.PageUnlock): NSPanel.Payload[] {
let id = page.items[0].id let id = page.items[0].id
let name = page.heading; let name = page.heading;
let out_msgs: Array<NSPanel.Payload> = []; let out_msgs: NSPanel.Payload[] = [];
out_msgs.push({ payload: 'pageType~cardAlarm' }); out_msgs.push({ payload: 'pageType~cardAlarm' });
let dpPath : string = '' let dpPath : string = ''
@@ -5908,7 +5921,7 @@ function GenerateQRPage(page: NSPanel.PageQR): NSPanel.Payload[] {
activePage = page; activePage = page;
if (!page.items[0].id) throw new Error ('Missing pageItem.id for cardQRPage!'); if (!page.items[0].id) throw new Error ('Missing pageItem.id for cardQRPage!');
let id = page.items[0].id; let id = page.items[0].id;
let out_msgs: Array<NSPanel.Payload> = []; let out_msgs: NSPanel.Payload[] = [];
out_msgs.push({ payload: 'pageType~cardQR' }); out_msgs.push({ payload: 'pageType~cardQR' });
let dpPath : string = '' let dpPath : string = ''
@@ -5998,14 +6011,16 @@ function GenerateQRPage(page: NSPanel.PageQR): NSPanel.Payload[] {
function unsubscribePowerSubscriptions(): void { function unsubscribePowerSubscriptions(): void {
for (let i = 0; i < config.pages.length; i++) { for (let i = 0; i < config.pages.length; i++) {
if (config.pages[i].type == 'cardPower') { const page: NSPanel.PageType = config.pages[i];
let powerID = config.pages[i].items[0].id; if (isPagePower(page)) {
let powerID = page.items[0].id;
unsubscribe(powerID + '.ACTUAL'); unsubscribe(powerID + '.ACTUAL');
} }
} }
for (let i = 0; i < config.subPages.length; i++) { for (let i = 0; i < config.subPages.length; i++) {
if (config.subPages[i].type == 'cardPower') { const page: NSPanel.PageType = config.subPages[i];
let powerID = config.subPages[i].items[0].id; if (isPagePower(page)) {
let powerID = page.items[0].id;
unsubscribe(powerID + '.ACTUAL'); unsubscribe(powerID + '.ACTUAL');
} }
} }
@@ -6049,7 +6064,7 @@ function GeneratePowerPage(page: NSPanel.PagePower): NSPanel.Payload[] {
obj = JSON.parse((getState(page.items[0].id + '.ACTUAL').val)); obj = JSON.parse((getState(page.items[0].id + '.ACTUAL').val));
} }
let out_msgs: Array<NSPanel.Payload> = []; let out_msgs: NSPanel.Payload[] = [];
// Leave the display on if the alwaysOnDisplay parameter is specified (true) // Leave the display on if the alwaysOnDisplay parameter is specified (true)
if (page.type == 'cardPower' && pageCounter == 0 && page.items[0].alwaysOnDisplay != undefined) { if (page.type == 'cardPower' && pageCounter == 0 && page.items[0].alwaysOnDisplay != undefined) {
@@ -6149,7 +6164,7 @@ function GenerateChartPage(page: NSPanel.PageChart): NSPanel.Payload[] {
activePage = page; activePage = page;
let id = page.items[0].id; let id = page.items[0].id;
let out_msgs: Array<NSPanel.Payload> = []; let out_msgs: NSPanel.Payload[] = [];
out_msgs.push({ payload: 'pageType~' + page.type }); out_msgs.push({ payload: 'pageType~' + page.type });
let heading = page.heading !== undefined ? page.heading : "Chart..."; 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[] { 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'); if (Debug) log('GenerateDetailPage Übergabe Type: ' + type + ' - optional: ' + optional + ' - pageItem.id: ' + pageItem.id, 'info');
try { try {
let out_msgs: Array<NSPanel.Payload> = []; let out_msgs: NSPanel.Payload[] = [];
let id = pageItem.id; let id = pageItem.id;
if (id && existsObject(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 // Playlist browsing not supported by squeezeboxrpc adapter. But Favorites can be used
actualState = ''; // Not supported by squeezeboxrpc adapter actualState = ''; // Not supported by squeezeboxrpc adapter
let tempPlayList: string[] = []; let tempPlayList: string[] = [];
let pathParts: Array<string> = pageItem.adapterPlayerInstance!.split('.'); let pathParts: string[] = pageItem.adapterPlayerInstance!.split('.');
for (let favorite_index = 0; favorite_index < 45; favorite_index++) { for (let favorite_index = 0; favorite_index < 45; favorite_index++) {
let favorite_name_selector: string = [pathParts[0], pathParts[1], 'Favorites', favorite_index, 'Name'].join('.'); let favorite_name_selector: string = [pathParts[0], pathParts[1], 'Favorites', favorite_index, 'Name'].join('.');
if (!existsObject(favorite_name_selector)) { if (!existsObject(favorite_name_selector)) {
@@ -8841,7 +8856,7 @@ function HandleScreensaverUpdate(): void {
} }
if (Debug) log('HandleScreensaverUpdate payload: weatherUpdate~' + payloadString, 'info'); if (Debug) log('HandleScreensaverUpdate payload: weatherUpdate~' + payloadString, 'info');
SendToPanel(<NSPanel.Payload>{ payload: 'weatherUpdate~' + payloadString }); SendToPanel({ payload: 'weatherUpdate~' + payloadString });
HandleScreensaverStatusIcons(); HandleScreensaverStatusIcons();
} }
@@ -8868,162 +8883,133 @@ function RegisterScreensaverEntityWatcher(id: string): void {
function HandleScreensaverStatusIcons() : void { function HandleScreensaverStatusIcons() : void {
try { try {
let payloadString = ''; let payloadString = '';
let hwBtn1Col: any = config.mrIcon1ScreensaverEntity.ScreensaverEntityOffColor; const iconData: Record<'mrIcon1' | 'mrIcon2', NSPanel.ScreenSaverMRDataElement> = {
if (config.mrIcon1ScreensaverEntity.ScreensaverEntity != null) { mrIcon1: {
// Prüfung ob ScreensaverEntity vom Typ String ist ScreensaverEntity: config.mrIcon1ScreensaverEntity.ScreensaverEntity != null
if (typeof (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val) == 'string') { && existsState(config.mrIcon1ScreensaverEntity.ScreensaverEntity)
if (Debug) log('Entity ist String', 'info') ? getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val
let hwBtn1: string = getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val; : null,
if (hwBtn1 == 'ON') { ScreensaverEntityIconOn: config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn
hwBtn1Col = config.mrIcon1ScreensaverEntity.ScreensaverEntityOnColor; ? 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 // Icon ermitteln
if (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntity).val) { if (iconData[a].ScreensaverEntityIconSelect && iconData[a].ScreensaverEntity != null) {
payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn); 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') if (Debug) log('Icon if true '+payloadString, 'info')
} else { } else {
if (config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOff != null) { if (iconData[a].ScreensaverEntityIconOff) {
payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOff); payloadString += iconData[a].ScreensaverEntityIconOff;
if (Debug) log('Icon else true '+payloadString, 'info') if (Debug) log('Icon1 else true '+payloadString, 'info')
} else { } else {
payloadString += Icons.GetIcon(config.mrIcon1ScreensaverEntity.ScreensaverEntityIconOn); payloadString += iconData[a].ScreensaverEntityIconOn;
if (Debug) log('Icon else false '+payloadString, 'info') if (Debug) log('Icon1 else false '+payloadString, 'info')
} }
} }
if (config.mrIcon1ScreensaverEntity.ScreensaverEntityValue != null) {
if (isNaN(getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val) == false) { if (iconData[a].ScreensaverEntityValue != null) {
payloadString += (getState(config.mrIcon1ScreensaverEntity.ScreensaverEntityValue).val).toFixed(config.mrIcon1ScreensaverEntity.ScreensaverEntityValueDecimalPlace); payloadString += iconData[a].ScreensaverEntityValue;
payloadString += (config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit == null) ? '' : config.mrIcon1ScreensaverEntity.ScreensaverEntityValueUnit; payloadString += (iconData[a].ScreensaverEntityValueUnit == null) ? '' : iconData[a].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
}
}
payloadString += '~' + rgb_dec565(hwBtn1Col) + '~'; 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 alternateScreensaverMFRIcon1Size = getState(NSPanel_Path + 'Config.MRIcons.alternateMRIconSize.1').val
let alternateScreensaverMFRIcon2Size = getState(NSPanel_Path + 'Config.MRIcons.alternateMRIconSize.2').val let alternateScreensaverMFRIcon2Size = getState(NSPanel_Path + 'Config.MRIcons.alternateMRIconSize.2').val
//Alternate MRIcon Size //Alternate MRIcon Size
@@ -9038,7 +9024,7 @@ function HandleScreensaverStatusIcons() : void {
payloadString += '~'; payloadString += '~';
} }
SendToPanel(<NSPanel.Payload>{ payload: 'statusUpdate~' + payloadString }); SendToPanel({ payload: 'statusUpdate~' + payloadString });
} catch (err: any) { } catch (err: any) {
log('error at function HandleScreensaverStatusIcons: ' + err.message, 'warn'); log('error at function HandleScreensaverStatusIcons: ' + err.message, 'warn');
@@ -9115,25 +9101,27 @@ function HandleScreensaverColors(): void {
scrSvrBGCol = rgb_dec565({ red: 100, green: 0, blue: 0 }); scrSvrBGCol = rgb_dec565({ red: 100, green: 0, blue: 0 });
} }
let payloadString = 'color' + '~' + let payloadString = buildNSPanelString(
scrSvrBGCol + '~' + //background 'color' ,
rgb_dec565(sctime) + '~' + //time scrSvrBGCol , //background
rgb_dec565(sctimeAMPM) + '~' + //timeAMPM~ rgb_dec565(sctime) , //time
rgb_dec565(scdate) + '~' + //date~ rgb_dec565(sctimeAMPM) , //timeAMPM~
rgb_dec565(sctMainText) + '~' + //tMainText~ rgb_dec565(scdate) , //date~
rgb_dec565(sctForecast1) + '~' + //tForecast1~ rgb_dec565(sctMainText) , //tMainText~
rgb_dec565(sctForecast2) + '~' + //tForecast2~ rgb_dec565(sctForecast1) , //tForecast1~
rgb_dec565(sctForecast3) + '~' + //tForecast3~ rgb_dec565(sctForecast2) , //tForecast2~
rgb_dec565(sctForecast4) + '~' + //tForecast4~ rgb_dec565(sctForecast3) , //tForecast3~
rgb_dec565(sctForecast1Val) + '~' + //tForecast1Val~ rgb_dec565(sctForecast4) , //tForecast4~
rgb_dec565(sctForecast2Val) + '~' + //tForecast2Val~ rgb_dec565(sctForecast1Val) , //tForecast1Val~
rgb_dec565(sctForecast3Val) + '~' + //tForecast3Val~ rgb_dec565(sctForecast2Val) , //tForecast2Val~
rgb_dec565(sctForecast4Val) + '~' + //tForecast4Val~ rgb_dec565(sctForecast3Val) , //tForecast3Val~
rgb_dec565(scbar) + '~' + //bar~ rgb_dec565(sctForecast4Val) , //tForecast4Val~
rgb_dec565(sctMainTextAlt) + '~' + //tMainTextAlt rgb_dec565(scbar) , //bar~
rgb_dec565(sctTimeAdd); //tTimeAdd rgb_dec565(sctMainTextAlt) , //tMainTextAlt
rgb_dec565(sctTimeAdd) //tTimeAdd
);
SendToPanel(<NSPanel.Payload>{ payload: payloadString }); SendToPanel({ payload: payloadString });
} catch (err: any) { } catch (err: any) {
log('error at function HandleScreensaverColors: '+ err.message, 'warn'); 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 r: number = InterpolateNum(color1.red, color2.red, fraction);
let g: number = InterpolateNum(color1.green, color2.green, fraction); let g: number = InterpolateNum(color1.green, color2.green, fraction);
let b: number = InterpolateNum(color1.blue, color2.blue, fraction); let b: number = InterpolateNum(color1.blue, color2.blue, fraction);
return <RGB>{ 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 { function InterpolateNum(d1: number, d2: number, fraction: number): number {
@@ -9704,6 +9692,14 @@ function spotifyGetDeviceID(vDeviceString: string): string {
let strDevID = arrayDeviceListIds[indexPos]; let strDevID = arrayDeviceListIds[indexPos];
return strDevID; 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 RGB = NSPanel.RGB;
type PageItem = NSPanel.PageItem; type PageItem = NSPanel.PageItem;
@@ -9835,12 +9831,24 @@ function isPageThermoItem(F: PageItem | NSPanel.PageThermoItem):F is NSPanel.Pag
return 'popupThermoMode1' in F; 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 { namespace NSPanel {
export type PopupType = 'popupFan' | 'popupInSel' | 'popupLight' | 'popupLightNew' | 'popupNotify' | 'popupShutter' | 'popupThermo' | 'popupTimer' export type PopupType = 'popupFan' | 'popupInSel' | 'popupLight' | 'popupLightNew' | 'popupNotify' | 'popupShutter' | 'popupThermo' | 'popupTimer'
export type EventMethod = 'startup' | 'sleepReached' | 'pageOpenDetail' | 'buttonPress2' | 'renderCurrentPage' | 'button1' | 'button2' 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' export type SerialType = 'button' | 'light' | 'shutter' | 'text' | 'input_sel' | 'timer' | 'number' | 'fan'
@@ -9894,48 +9902,49 @@ namespace NSPanel {
export type PageEntities = { export type PageEntities = {
type: 'cardEntities', type: 'cardEntities',
items: PageItem[], items: [PageItem?, PageItem?, PageItem?, PageItem?, PageItem?],
} & PageBaseType } & PageBaseType
export type PageGrid = { export type PageGrid = {
type: 'cardGrid', type: 'cardGrid',
items: PageItem[], items: [PageItem?, PageItem?, PageItem?, PageItem?, PageItem?, PageItem?],
} & PageBaseType } & PageBaseType
export type PageGrid2 = { export type PageGrid2 = {
type: 'cardGrid2', type: 'cardGrid2',
items: PageItem[], items: [PageItem?, PageItem?, PageItem?, PageItem?, PageItem?, PageItem?, PageItem?, PageItem?],
} & PageBaseType } & PageBaseType
export type PageThermo = { export type PageThermo = {
type: 'cardThermo', type: 'cardThermo',
items: PageThermoItem[], items: [PageThermoItem],
} & Omit<PageBaseType, 'useColor'> } & Omit<PageBaseType, 'useColor'>
export type PageMedia = { export type PageMedia = {
type: 'cardMedia', type: 'cardMedia',
items: PageMediaItem[], items: [PageMediaItem],
} & Omit<PageBaseType, 'useColor' | 'autoCreateAlias'> } & Omit<PageBaseType, 'useColor' | 'autoCreateAlias'>
export type PageAlarm = { export type PageAlarm = {
type: 'cardAlarm', type: 'cardAlarm',
items: PageItem[], items: [PageItem],
} & Omit<PageBaseType, 'useColor'> } & Omit<PageBaseType, 'useColor'>
export type PageUnlock = { export type PageUnlock = {
type: 'cardUnlock', type: 'cardUnlock',
items: PageItem[], items: [PageItem],
} & Omit<PageBaseType, 'useColor'> & Partial<Pick<PageBaseType, 'useColor'>> } & Omit<PageBaseType, 'useColor'> & Partial<Pick<PageBaseType, 'useColor'>>
export type PageQR = { export type PageQR = {
type: 'cardQR', type: 'cardQR',
items: PageItem[], items: [PageItem],
} & Omit<PageBaseType, 'useColor'> } & Omit<PageBaseType, 'useColor'>
export type PagePower = { export type PagePower = {
type: 'cardPower', type: 'cardPower',
items: PageItem[], items: [PageItem],
} & Omit<PageBaseType, 'useColor'> } & Omit<PageBaseType, 'useColor'>
export type PageChart = { export type PageChart = {
@@ -10077,6 +10086,7 @@ namespace NSPanel {
export type ScreenSaverMRElement = { export type ScreenSaverMRElement = {
ScreensaverEntity: string | null, ScreensaverEntity: string | null,
ScreensaverEntityIconOn: string | null, ScreensaverEntityIconOn: string | null,
ScreensaverEntityIconSelect?: {[key: string]: string} | null | undefined,
ScreensaverEntityIconOff: string | null, ScreensaverEntityIconOff: string | null,
ScreensaverEntityValue: string | null, ScreensaverEntityValue: string | null,
ScreensaverEntityValueDecimalPlace: number | null, ScreensaverEntityValueDecimalPlace: number | null,
@@ -10084,6 +10094,17 @@ namespace NSPanel {
ScreensaverEntityOnColor: RGB, ScreensaverEntityOnColor: RGB,
ScreensaverEntityOffColor: 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 = { export type IconScaleElement = {
val_min:number, val_min:number,