mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2025-12-19 22:24:15 +01:00
some more types
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
TypeScript v4.3.3.30 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @ticaki / @Sternmiere / @Britzelpuf / @ravenS0ne
|
||||
TypeScript v4.3.3.31 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @ticaki / @Sternmiere / @Britzelpuf / @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
|
||||
@@ -91,6 +91,9 @@ ReleaseNotes:
|
||||
- 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
|
||||
- 03.02.2024 - v4.3.3.31 Remove: autoCreateAlias from cardMedia
|
||||
- 03.02.2024 - v4.3.3.31 Remove: adapterPlayerInstance from every card except cardMedia
|
||||
- 03.02.2024 - v4.3.3.31 [dev]: optional with type - cardMedia has adapterPlayerInstance all other not
|
||||
|
||||
Todo:
|
||||
- XX.XX.XXXX - v5.0.0 Change the bottomScreensaverEntity (rolling) if more than 6 entries are defined
|
||||
@@ -953,7 +956,7 @@ export const config: Config = {
|
||||
// _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________
|
||||
// _________________________________ EN: No more configuration from here _____________________________________
|
||||
|
||||
const scriptVersion: string = 'v4.3.3.30';
|
||||
const scriptVersion: string = 'v4.3.3.31';
|
||||
const tft_version: string = 'v4.3.3';
|
||||
const desired_display_firmware_version = 53;
|
||||
const berry_driver_version = 9;
|
||||
@@ -3022,7 +3025,9 @@ function HandleMessage(typ: string, method: string, page: number | undefined, wo
|
||||
}
|
||||
let pageItem: PageItem = findPageItem(tempId);
|
||||
if (pageItem !== undefined) {
|
||||
SendToPanel(GenerateDetailPage(words[2], tempPageItem[1], pageItem, placeId));
|
||||
let temp: string | mediaOptional | undefined = tempPageItem[1]
|
||||
if (isMediaOptional(temp)) SendToPanel(GenerateDetailPage(words[2], temp, pageItem, placeId));
|
||||
else SendToPanel(GenerateDetailPage(words[2], undefined, pageItem, placeId));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -4286,8 +4291,8 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
||||
if ((i_list.length - 3) != 0) {
|
||||
|
||||
let i = 0;
|
||||
|
||||
if (o.common.role == 'thermostat') {
|
||||
switch (o.common.role) {
|
||||
case 'thermostat': {
|
||||
|
||||
if (existsState(id + '.AUTOMATIC') && getState(id + '.AUTOMATIC').val != null) {
|
||||
if (getState(id + '.AUTOMATIC').val) {
|
||||
@@ -4429,31 +4434,31 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
||||
bt[j] = '~~~~';
|
||||
}
|
||||
}
|
||||
|
||||
if (o.common.role == 'airCondition') {
|
||||
break;
|
||||
case 'airCondition': {
|
||||
if (existsState(id + '.MODE') && getState(id + '.MODE').val != null) {
|
||||
let Mode = getState(id + '.MODE').val
|
||||
let States = getObject(id + '.MODE').common.states;
|
||||
|
||||
let iconIndex: number = 1;
|
||||
for(const statekey in States) {
|
||||
for (const statekey in States) {
|
||||
let stateName: string = States[statekey];
|
||||
let stateKeyNumber: number = parseInt(statekey);
|
||||
if(stateName == 'OFF' || stateKeyNumber > 6) {
|
||||
if (stateName == 'OFF' || stateKeyNumber > 6) {
|
||||
continue;
|
||||
}
|
||||
if(stateKeyNumber == Mode) {
|
||||
if (stateKeyNumber == Mode) {
|
||||
statusStr = stateName.replace('_', ' ');
|
||||
}
|
||||
|
||||
switch(stateName) {
|
||||
switch (stateName) {
|
||||
case 'AUTO':
|
||||
if (page.items[0].iconArray !== undefined && page.items[0].iconArray[1] !== '') {
|
||||
tempIcon = page.items[0].iconArray[1];
|
||||
} else {
|
||||
tempIcon = 'air-conditioner';
|
||||
}
|
||||
if(stateKeyNumber == Mode) {
|
||||
if (stateKeyNumber == Mode) {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~1024~1~' + 'AUTO' + '~';
|
||||
} else {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~35921~0~' + 'AUTO' + '~';
|
||||
@@ -4465,7 +4470,7 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
||||
} else {
|
||||
tempIcon = 'snowflake';
|
||||
}
|
||||
if(stateKeyNumber == Mode) {
|
||||
if (stateKeyNumber == Mode) {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~11487~1~' + 'COOL' + '~';
|
||||
} else {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~35921~0~' + 'COOL' + '~';
|
||||
@@ -4477,7 +4482,7 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
||||
} else {
|
||||
tempIcon = 'fire';
|
||||
}
|
||||
if(stateKeyNumber == Mode) {
|
||||
if (stateKeyNumber == Mode) {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~64512~1~' + 'HEAT' + '~';
|
||||
} else {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~35921~0~' + 'HEAT' + '~';
|
||||
@@ -4489,7 +4494,7 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
||||
} else {
|
||||
tempIcon = 'alpha-e-circle-outline';
|
||||
}
|
||||
if(stateKeyNumber == Mode) {
|
||||
if (stateKeyNumber == Mode) {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~2016~1~' + 'ECO' + '~';
|
||||
} else {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~35921~0~' + 'ECO' + '~';
|
||||
@@ -4501,7 +4506,7 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
||||
} else {
|
||||
tempIcon = 'fan';
|
||||
}
|
||||
if(stateKeyNumber == Mode) {
|
||||
if (stateKeyNumber == Mode) {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~11487~1~' + 'FAN_ONLY' + '~';
|
||||
} else {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~35921~0~' + 'FAN_ONLY' + '~';
|
||||
@@ -4513,7 +4518,7 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
||||
} else {
|
||||
tempIcon = 'water-percent';
|
||||
}
|
||||
if(stateKeyNumber == Mode) {
|
||||
if (stateKeyNumber == Mode) {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~60897~1~' + 'DRY' + '~';
|
||||
} else {
|
||||
bt[iconIndex] = Icons.GetIcon(tempIcon) + '~35921~0~' + 'DRY' + '~';
|
||||
@@ -4569,6 +4574,8 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let destTemp2 = '';
|
||||
@@ -4887,10 +4894,9 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
|
||||
}
|
||||
}
|
||||
|
||||
if (page.items[0].autoCreateALias) {
|
||||
let vMediaDevice = (page.items[0].mediaDevice != undefined) ? page.items[0].mediaDevice : '';
|
||||
if (!vMediaDevice) throw new Error(`Error in cardMedia! mediaDevice is empty! Page: ${JSON.stringify(page)}`);
|
||||
createAutoMediaAlias(id, vMediaDevice, page.items[0].adapterPlayerInstance!);
|
||||
}
|
||||
|
||||
// Leave the display on if the alwaysOnDisplay parameter is specified (true)
|
||||
if (page.type == 'cardMedia' && pageCounter == 0 && page.items[0].alwaysOnDisplay != undefined) {
|
||||
@@ -6253,12 +6259,18 @@ function HandleButtonEvent(words: any): void {
|
||||
case 'hue':
|
||||
toggleState(id + '.ON_ACTUAL');
|
||||
case 'media':
|
||||
if (!activePage || activePage.type != 'cardMedia') {
|
||||
if (activePage) throw new Error(`Found channel role media for card: ${activePage.type} not allowed`)
|
||||
else throw new Error(`Something went wrong! Active Page is empty!`);
|
||||
}
|
||||
if (tempid[1] == undefined) {
|
||||
if (Debug) log('Logo click', 'info');
|
||||
GeneratePage(activePage!);
|
||||
} else if (tempid[1] == 'repeat') {
|
||||
|
||||
let pageItemRepeat = findPageItem(id);
|
||||
let adapterInstanceRepeat = pageItemRepeat.adapterPlayerInstance!;
|
||||
if (isPageMediaItem(pageItemRepeat)) {
|
||||
let adapterInstanceRepeat = pageItemRepeat.adapterPlayerInstance;
|
||||
let adapterRepeat = adapterInstanceRepeat.split('.');
|
||||
let deviceAdapterRP = adapterRepeat[0];
|
||||
|
||||
@@ -6294,8 +6306,8 @@ function HandleButtonEvent(words: any): void {
|
||||
GeneratePage(activePage!);
|
||||
break;
|
||||
case 'volumio':
|
||||
let urlString: string = `${getState(adapterInstanceRepeat+'info.host').val}/api/commands/?cmd=repeat`;
|
||||
axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
|
||||
let urlString: string = `${getState(adapterInstanceRepeat + 'info.host').val}/api/commands/?cmd=repeat`;
|
||||
axios.get(urlString, {headers: {'User-Agent': 'ioBroker'}})
|
||||
.then(async function (response) {
|
||||
if (response.status === 200) {
|
||||
if (Debug) {
|
||||
@@ -6312,7 +6324,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'squeezeboxrpc':
|
||||
try {
|
||||
switch(getState(id + '.REPEAT').val) {
|
||||
switch (getState(id + '.REPEAT').val) {
|
||||
case 0:
|
||||
setIfExists(id + '.REPEAT', 1);
|
||||
GeneratePage(activePage!);
|
||||
@@ -6334,6 +6346,7 @@ function HandleButtonEvent(words: any): void {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'up':
|
||||
setIfExists(id + '.OPEN', true);
|
||||
@@ -6478,6 +6491,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'media-pause':
|
||||
let pageItemTemp = findPageItem(id);
|
||||
if (isPageMediaItem(pageItemTemp)) {
|
||||
let adaInstanceSplit = pageItemTemp.adapterPlayerInstance!.split('.');
|
||||
if (adaInstanceSplit[0] == 'squeezeboxrpc') {
|
||||
let adapterPlayerInstanceStateSeceltor: string = [pageItemTemp.adapterPlayerInstance, 'Players', pageItemTemp.mediaDevice, 'state'].join('.');
|
||||
@@ -6499,30 +6513,33 @@ function HandleButtonEvent(words: any): void {
|
||||
}
|
||||
}
|
||||
GeneratePage(activePage!);
|
||||
}
|
||||
break;
|
||||
case 'media-next':
|
||||
setIfExists(id + '.NEXT', true);
|
||||
GeneratePage(activePage!);
|
||||
break;
|
||||
case 'media-shuffle':
|
||||
if ((findPageItem(id).adapterPlayerInstance!).startsWith("volumio")) {
|
||||
const tempPage = findPageItem(id);
|
||||
if (isPageMediaItem(tempPage)) {
|
||||
if (tempPage.adapterPlayerInstance.startsWith("volumio")) {
|
||||
findPageItem(id).playList = []; break;
|
||||
} //Volumio: empty playlist $uha-20230103
|
||||
if ((findPageItem(id).adapterPlayerInstance!).startsWith("spotify")) {
|
||||
if ((tempPage.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 ((tempPage.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 ((tempPage.adapterPlayerInstance).startsWith("sonos")) {
|
||||
if (getState(id + '.SHUFFLE').val == false) {
|
||||
setIfExists(id + '.SHUFFLE', true);
|
||||
} else {
|
||||
@@ -6530,6 +6547,7 @@ function HandleButtonEvent(words: any): void {
|
||||
}
|
||||
}
|
||||
GeneratePage(activePage!);
|
||||
}
|
||||
break;
|
||||
case 'volumeSlider':
|
||||
pageCounter = -1;
|
||||
@@ -6544,6 +6562,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'mode-speakerlist':
|
||||
let pageItem = findPageItem(id);
|
||||
if (isPageMediaItem(pageItem)) {
|
||||
let adapterInstance = pageItem.adapterPlayerInstance!;
|
||||
let adapter = adapterInstance!.split('.');
|
||||
let deviceAdapter = adapter[0];
|
||||
@@ -6574,6 +6593,7 @@ function HandleButtonEvent(words: any): void {
|
||||
case 'squeezeboxrpc':
|
||||
pageItem.mediaDevice = pageItem.speakerList![words[4]];
|
||||
break;
|
||||
|
||||
}
|
||||
pageCounter = 0;
|
||||
GeneratePage(activePage!);
|
||||
@@ -6581,9 +6601,11 @@ function HandleButtonEvent(words: any): void {
|
||||
pageCounter = 1;
|
||||
GeneratePage(activePage!);
|
||||
}, 3000);
|
||||
}
|
||||
break;
|
||||
case 'mode-playlist':
|
||||
let pageItemPL = findPageItem(id);
|
||||
if (!isPageMediaItem(pageItemPL)) break;
|
||||
let adapterInstancePL = pageItemPL.adapterPlayerInstance!;
|
||||
let adapterPL = adapterInstancePL.split('.');
|
||||
let deviceAdapterPL = adapterPL[0];
|
||||
@@ -6639,6 +6661,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'mode-tracklist':
|
||||
let pageItemTL = findPageItem(id);
|
||||
if (!isPageMediaItem(pageItemTL)) break;
|
||||
let adapterInstanceTL = pageItemTL.adapterPlayerInstance!;
|
||||
let adapterTL = adapterInstanceTL.split('.');
|
||||
let deviceAdapterTL = adapterTL[0];
|
||||
@@ -6683,6 +6706,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'mode-repeat':
|
||||
let pageItemRP = findPageItem(id);
|
||||
if (!isPageMediaItem(pageItemRP)) break;
|
||||
let adapterInstanceRP = pageItemRP.adapterPlayerInstance!;
|
||||
let adapterRP = adapterInstanceRP.split('.');
|
||||
let deviceAdapterRP = adapterRP[0];
|
||||
@@ -6712,6 +6736,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'mode-seek':
|
||||
let pageItemSeek = findPageItem(id);
|
||||
if (!isPageMediaItem(pageItemSeek)) break;
|
||||
let adapterInstanceSK = pageItemSeek.adapterPlayerInstance!;
|
||||
let adapterSK = adapterInstanceSK.split('.');
|
||||
let deviceAdapterSK = adapterSK[0];
|
||||
@@ -6732,6 +6757,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'mode-crossfade':
|
||||
let pageItemCrossfade = findPageItem(id);
|
||||
if (!isPageMediaItem(pageItemCrossfade)) break;
|
||||
let adapterInstanceCF = pageItemCrossfade.adapterPlayerInstance!;
|
||||
let adapterCF = adapterInstanceCF.split('.');
|
||||
let deviceAdapterCF = adapterCF[0];
|
||||
@@ -6756,6 +6782,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'mode-favorites':
|
||||
let pageItemFav = findPageItem(id);
|
||||
if (!isPageMediaItem(pageItemFav)) break;
|
||||
if (Debug) log(getState(pageItemFav.adapterPlayerInstance + 'root.' + pageItemFav.mediaDevice + '.favorites_set').val, 'info');
|
||||
let favListArray = getState(pageItemFav.adapterPlayerInstance + 'root.' + pageItemFav.mediaDevice + '.favorites_list_array').val;
|
||||
setState(pageItemFav.adapterPlayerInstance + 'root.' + pageItemFav.mediaDevice + '.favorites_set', favListArray[words[4]]);
|
||||
@@ -6771,6 +6798,7 @@ function HandleButtonEvent(words: any): void {
|
||||
break;
|
||||
case 'media-OnOff':
|
||||
let pageItemTem = findPageItem(id);
|
||||
if (!isPageMediaItem(pageItemTem)) break;
|
||||
let adaInstanceSpli = pageItemTem.adapterPlayerInstance!.split('.');
|
||||
if (adaInstanceSpli[0] == 'squeezeboxrpc') {
|
||||
let adapterPlayerInstancePowerSelector: string = [pageItemTem.adapterPlayerInstance, 'Players', pageItemTem.mediaDevice, 'Power'].join('.');
|
||||
@@ -7089,7 +7117,7 @@ function GetNavigationString(pageId: number): string {
|
||||
return '';
|
||||
}
|
||||
|
||||
function GenerateDetailPage(type: string, optional: string | undefined, pageItem: PageItem, placeId: number | undefined): Payload[] {
|
||||
function GenerateDetailPage(type: string, optional: mediaOptional | 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<Payload> = [];
|
||||
@@ -7106,7 +7134,9 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
|
||||
let switchVal = '0';
|
||||
let brightness = 0;
|
||||
if (o.common.role == 'light' || o.common.role == 'socket') {
|
||||
switch (o.common.role) {
|
||||
case 'light':
|
||||
case 'socket': {
|
||||
if (existsState(id + '.GET')) {
|
||||
val = getState(id + '.GET').val;
|
||||
RegisterDetailEntityWatcher(id + '.GET', pageItem, type, placeId);
|
||||
@@ -7152,9 +7182,9 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
+ effect_supported
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
// Dimmer
|
||||
if (o.common.role == 'dimmer') {
|
||||
case 'dimmer': {
|
||||
if (existsState(id + '.ON_ACTUAL')) {
|
||||
val = getState(id + '.ON_ACTUAL').val;
|
||||
RegisterDetailEntityWatcher(id + '.ON_ACTUAL', pageItem, type, placeId);
|
||||
@@ -7209,9 +7239,9 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
+ effect_supported
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
// HUE-Licht
|
||||
if (o.common.role == 'hue') {
|
||||
case 'hue': {
|
||||
|
||||
if (existsState(id + '.ON_ACTUAL')) {
|
||||
val = getState(id + '.ON_ACTUAL').val;
|
||||
@@ -7281,9 +7311,9 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
+ effect_supported
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
// RGB-Licht
|
||||
if (o.common.role == 'rgb') {
|
||||
case 'rgb': {
|
||||
|
||||
if (existsState(id + '.ON_ACTUAL')) {
|
||||
val = getState(id + '.ON_ACTUAL').val;
|
||||
@@ -7352,9 +7382,9 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
+ effect_supported
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
// RGB-Licht-einzeln (HEX)
|
||||
if (o.common.role == 'rgbSingle') {
|
||||
case 'rgbSingle': {
|
||||
|
||||
if (existsState(id + '.ON_ACTUAL')) {
|
||||
val = getState(id + '.ON_ACTUAL').val;
|
||||
@@ -7428,9 +7458,9 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
+ effect_supported
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
// Farbtemperatur (CT)
|
||||
if (o.common.role == 'ct') {
|
||||
case 'ct': {
|
||||
|
||||
if (existsState(id + '.ON')) {
|
||||
val = getState(id + '.ON').val;
|
||||
@@ -7492,6 +7522,8 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
+ effect_supported
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (type == 'popupShutter') {
|
||||
@@ -7774,7 +7806,7 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
let actualState: any = '';
|
||||
let optionalString: string = 'Kein Eintrag';
|
||||
let mode: string = '';
|
||||
|
||||
if (isPageMediaItem(pageItem)) {
|
||||
let vTempAdapter = (pageItem.adapterPlayerInstance!).split('.');
|
||||
let vAdapter = vTempAdapter[0];
|
||||
if (optional == 'seek') {
|
||||
@@ -7882,14 +7914,14 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
tempPlayList[i] = formatInSelText(pageItem.playList![i]);
|
||||
}
|
||||
optionalString = pageItem.playList != undefined ? tempPlayList.join('?') : ''
|
||||
} else if(vAdapter == 'squeezeboxrpc') {
|
||||
} else if (vAdapter == 'squeezeboxrpc') {
|
||||
// Playlist browsing not supported by squeezeboxrpc adapter. But Favorites can be used
|
||||
actualState = ''; // Not supported by squeezeboxrpc adapter
|
||||
let tempPlayList: string[] = [];
|
||||
let pathParts: Array<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('.');
|
||||
if(!existsObject(favorite_name_selector)) {
|
||||
if (!existsObject(favorite_name_selector)) {
|
||||
break;
|
||||
}
|
||||
let favoritename: string = getState(favorite_name_selector).val;
|
||||
@@ -7904,14 +7936,14 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
if (vAdapter == 'volumio') {
|
||||
actualState = getState(pageItem.id + '.TITLE').val;
|
||||
globalTracklist = pageItem.globalTracklist;
|
||||
}else if(vAdapter == 'squeezeboxrpc') {
|
||||
} else if (vAdapter == 'squeezeboxrpc') {
|
||||
actualState = getState(pageItem.id + '.TITLE').val;
|
||||
}else if(vAdapter == 'sonos') {
|
||||
} else if (vAdapter == 'sonos') {
|
||||
actualState = getState(pageItem.id + '.TITLE').val;
|
||||
} else {
|
||||
actualState = getState(pageItem.adapterPlayerInstance + 'player.trackName').val;
|
||||
}
|
||||
actualState = (actualState.replace('?','')).split(' -');
|
||||
actualState = (actualState.replace('?', '')).split(' -');
|
||||
actualState = actualState[0].split(" (");
|
||||
actualState = formatInSelText(actualState[0]);
|
||||
if (Debug) log(actualState, 'info');
|
||||
@@ -7919,7 +7951,7 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
//Limit 900 characters, then memory overflow --> Shorten as much as possible
|
||||
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++) {
|
||||
for (let track_index = 0; track_index < 45; track_index++) {
|
||||
let temp_cut_array = getAttr(globalTracklist, track_index + '.title');
|
||||
/* Volumio: @local/NAS no title -> name */
|
||||
if (temp_cut_array == undefined) {
|
||||
@@ -7927,13 +7959,13 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
}
|
||||
if (Debug) log('function GenerateDetailPage role:media tracklist -> ' + temp_cut_array, 'info');
|
||||
if (temp_cut_array != undefined) {
|
||||
temp_cut_array = (temp_cut_array.replace('?','')).split(' -');
|
||||
temp_cut_array = (temp_cut_array.replace('?', '')).split(' -');
|
||||
temp_cut_array = temp_cut_array[0].split(" (");
|
||||
temp_cut_array = temp_cut_array[0];
|
||||
if (String(temp_cut_array[0]).length >= 22) {
|
||||
temp_array[track_index] = temp_cut_array.substring(0,20) + '..';
|
||||
temp_array[track_index] = temp_cut_array.substring(0, 20) + '..';
|
||||
} else {
|
||||
temp_array[track_index] = temp_cut_array.substring(0,23);
|
||||
temp_array[track_index] = temp_cut_array.substring(0, 23);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -7947,13 +7979,13 @@ 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!');
|
||||
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 ||
|
||||
existsObject(NSPanel_Path + 'Media.Player.' + lastIndex + '.Speaker') == false) {
|
||||
createState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode', <iobJS.StateCommon>{ type: 'string' });
|
||||
createState(NSPanel_Path + 'Media.Player.' + lastIndex + '.Speaker', <iobJS.StateCommon>{ type: 'string' });
|
||||
createState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode', <iobJS.StateCommon> {type: 'string'});
|
||||
createState(NSPanel_Path + 'Media.Player.' + lastIndex + '.Speaker', <iobJS.StateCommon> {type: 'string'});
|
||||
}
|
||||
|
||||
actualState = ''
|
||||
@@ -7976,7 +8008,7 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
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:string [] = [];
|
||||
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]);
|
||||
@@ -7996,6 +8028,7 @@ function GenerateDetailPage(type: string, optional: string | undefined, pageItem
|
||||
+ optionalString
|
||||
});
|
||||
GeneratePage(activePage!);
|
||||
}
|
||||
} else if (o.common.role == 'buttonSensor') {
|
||||
|
||||
let actualValue: string = '';
|
||||
@@ -9406,8 +9439,8 @@ type PageThermo = {
|
||||
|
||||
type PageMedia = {
|
||||
type: 'cardMedia',
|
||||
items: PageItem[],
|
||||
} & Omit<PageBaseType, 'useColor'>
|
||||
items: PageMediaItem[],
|
||||
} & Omit<PageBaseType, 'useColor' | 'autoCreateAlias'>
|
||||
|
||||
type PageAlarm = {
|
||||
type: 'cardAlarm',
|
||||
@@ -9434,7 +9467,16 @@ type PageChart = {
|
||||
items: PageItem[],
|
||||
} & Omit<PageBaseType, 'useColor'>
|
||||
|
||||
type PageItem = {
|
||||
type PageItem = PageBaseItem | PageMediaItem
|
||||
|
||||
function isPageMediaItem(F: PageItem | PageMediaItem):F is PageMediaItem {
|
||||
return (F as PageMediaItem).adapterPlayerInstance !== undefined
|
||||
}
|
||||
type PageMediaItem = {
|
||||
adapterPlayerInstance: adapterPlayerInstanceType,
|
||||
} & PageBaseItem
|
||||
|
||||
type PageBaseItem = {
|
||||
id?: string | null,
|
||||
icon?: string,
|
||||
icon2?: string,
|
||||
@@ -9462,7 +9504,7 @@ type PageItem = {
|
||||
navigate?: boolean,
|
||||
colormode?: string,
|
||||
colorScale?: any,
|
||||
adapterPlayerInstance?: string,
|
||||
//adapterPlayerInstance?: adapterPlayerInstanceType,
|
||||
mediaDevice?: string,
|
||||
targetPage?: string,
|
||||
speakerList?: string[],
|
||||
@@ -9568,3 +9610,36 @@ type IconScaleElement = {
|
||||
val_max:number,
|
||||
val_best?: number
|
||||
}
|
||||
|
||||
type adapterPlayerInstanceType =
|
||||
'alexa2.1.' | 'sonos.1.' | 'spotify-premium.1.' | 'volumio.1.' | 'squeezebox-rpc.1.'
|
||||
| 'alexa2.2.' | 'sonos.2.' | 'spotify-premium.2.' | 'volumio.2.' | 'squeezebox-rpc.2.'
|
||||
| 'alexa2.0.' | 'sonos.0.' | 'spotify-premium.0.' | 'volumio.0.' | 'squeezebox-rpc.0.'
|
||||
| 'alexa2.3.' | 'sonos.3.' | 'spotify-premium.3.' | 'volumio.3.' | 'squeezebox-rpc.3.'
|
||||
| 'alexa2.4.' | 'sonos.4.' | 'spotify-premium.4.' | 'volumio.4.' | 'squeezebox-rpc.4.'
|
||||
| 'alexa2.5.' | 'sonos.5.' | 'spotify-premium.5.' | 'volumio.5.' | 'squeezebox-rpc.5.'
|
||||
| 'alexa2.6.' | 'sonos.6.' | 'spotify-premium.6.' | 'volumio.6.' | 'squeezebox-rpc.6.'
|
||||
| 'alexa2.7.' | 'sonos.7.' | 'spotify-premium.7.' | 'volumio.7.' | 'squeezebox-rpc.7.'
|
||||
| 'alexa2.8.' | 'sonos.8.' | 'spotify-premium.8.' | 'volumio.8.' | 'squeezebox-rpc.8.'
|
||||
| 'alexa2.9.' | 'sonos.9.' | 'spotify-premium.9.' | 'volumio.9.' | 'squeezebox-rpc.9.'
|
||||
| 'alexa2.10.' | 'sonos.10.' | 'spotify-premium.10.' | 'volumio.10.' | 'squeezebox-rpc.10'
|
||||
|
||||
|
||||
|
||||
type mediaOptional = 'seek' | 'crossfade' | 'speakerlist' | 'playlist' | 'tracklist' | 'equalizer' | 'repeat' | 'favorites'
|
||||
|
||||
function isMediaOptional(F: string | mediaOptional): F is mediaOptional {
|
||||
switch(F as mediaOptional) {
|
||||
case "seek":
|
||||
case "crossfade":
|
||||
case "speakerlist":
|
||||
case "playlist":
|
||||
case "tracklist":
|
||||
case "equalizer":
|
||||
case "repeat":
|
||||
case "favorites":
|
||||
return true;
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user