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,8 +4434,8 @@ 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;
|
||||
@@ -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];
|
||||
|
||||
@@ -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') {
|
||||
@@ -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