async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlayerInstance: string) { if (autoCreateAlias) { if (adapterPlayerInstance == 'alexa2.0.') { if (existsObject(id) == false){ console.log('Alexa Alias ' + id + ' existiert nicht - wird jetzt angelegt') let dpPath: string = adapterPlayerInstance + 'Echo-Devices.' + mediaDevice; try { setObject(id, {_id: id, type: 'channel', common: {role: 'media', name:'media'}, native: {}}); await createAliasAsync(id + '.ACTUAL', dpPath + '.Player.volume', true, { type: 'number', role: 'value.volume', name: 'ACTUAL' }); await createAliasAsync(id + '.ALBUM', dpPath + '.Player.currentAlbum', true, { type: 'string', role: 'media.album', name: 'ALBUM' }); await createAliasAsync(id + '.ARTIST', dpPath + '.Player.currentArtist', true, { type: 'string', role: 'media.artist', name: 'ARTIST' }); await createAliasAsync(id + '.TITLE', dpPath + '.Player.currentTitle', true, { type: 'string', role: 'media.title', name: 'TITLE' }); await createAliasAsync(id + '.NEXT', dpPath + '.Player.controlNext', true, { type: 'boolean', role: 'button.next', name: 'NEXT' }); await createAliasAsync(id + '.PREV', dpPath + '.Player.controlPrevious', true, { type: 'boolean', role: 'button.prev', name: 'PREV' }); await createAliasAsync(id + '.PLAY', dpPath + '.Player.controlPlay', true, { type: 'boolean', role: 'button.play', name: 'PLAY' }); await createAliasAsync(id + '.PAUSE', dpPath + '.Player.controlPause', true, { type: 'boolean', role: 'button.pause', name: 'PAUSE' }); await createAliasAsync(id + '.STOP', dpPath + '.Commands.deviceStop', true, { type: 'boolean', role: 'button.stop', name: 'STOP' }); await createAliasAsync(id + '.STATE', dpPath + '.Player.currentState', true, { type: 'boolean', role: 'media.state', name: 'STATE' }); await createAliasAsync(id + '.VOLUME', dpPath + '.Player.volume', true, { type: 'number', role: 'level.volume', name: 'VOLUME' }); await createAliasAsync(id + '.REPEAT', dpPath + '.Player.controlRepeat', true, { type: 'boolean', role: 'media.mode.repeat', name: 'REPEAT' }); await createAliasAsync(id + '.SHUFFLE', dpPath + '.Player.controlShuffle', true, { type: 'boolean', role: 'media.mode.shuffle', name: 'SHUFFLE' }); } catch (err) { console.warn('function createAutoMediaAlias: ' + err.message); } } } if (adapterPlayerInstance == 'spotify-premium.0.') { if (existsObject(id) == false){ console.log('Spotify Alias ' + id + ' existiert nicht - wird jetzt angelegt') let dpPath: string = adapterPlayerInstance; try { setObject(id, {_id: id + 'player', type: 'channel', common: {role: 'media', name:'media'}, native: {}}); await createAliasAsync(id + '.ACTUAL', dpPath + 'player.volume', true, { type: 'number', role: 'value.volume', name: 'ACTUAL' }); await createAliasAsync(id + '.ALBUM', dpPath + 'player.album', true, { type: 'string', role: 'media.album', name: 'ALBUM' }); await createAliasAsync(id + '.ARTIST', dpPath + 'player.artistName', true, { type: 'string', role: 'media.artist', name: 'ARTIST' }); await createAliasAsync(id + '.TITLE', dpPath + 'player.trackName', true, { type: 'string', role: 'media.title', name: 'TITLE' }); await createAliasAsync(id + '.CONTEXT_DESCRIPTION', dpPath + 'player.contextDescription', true, { type: 'string', role: 'media.station', name: 'CONTEXT_DESCRIPTION' }); await createAliasAsync(id + '.NEXT', dpPath + 'player.skipPlus', true, { type: 'boolean', role: 'button.next', name: 'NEXT' }); await createAliasAsync(id + '.PREV', dpPath + 'player.skipMinus', true, { type: 'boolean', role: 'button.prev', name: 'PREV' }); await createAliasAsync(id + '.PLAY', dpPath + 'player.play', true, { type: 'boolean', role: 'button.play', name: 'PLAY' }); await createAliasAsync(id + '.PAUSE', dpPath + 'player.pause', true, { type: 'boolean', role: 'button.pause', name: 'PAUSE' }); await createAliasAsync(id + '.STOP', dpPath + 'player.pause', true, { type: 'boolean', role: 'button.stop', name: 'STOP' }); await createAliasAsync(id + '.STATE', dpPath + 'player.isPlaying', true, { type: 'boolean', role: 'media.state', name: 'STATE' }); await createAliasAsync(id + '.VOLUME', dpPath + 'player.volume', true, { type: 'number', role: 'level.volume', name: 'VOLUME' }); await createAliasAsync(id + '.REPEAT', dpPath + 'player.repeat', true, { type: 'string', role: 'value', name: 'REPEAT' }); await createAliasAsync(id + '.SHUFFLE', dpPath + 'player.shuffle', true, { type: 'string', role: 'value', name: 'SHUFFLE' }); } catch (err) { console.warn('function createAutoMediaAlias: ' + err.message); } } } if (adapterPlayerInstance == 'sonos.0.') { if (existsObject(id) == false){ console.log('Sonos Alias ' + id + ' existiert nicht - wird jetzt angelegt') let dpPath: string = adapterPlayerInstance + 'root.' + mediaDevice; try { setObject(id, {_id: id, type: 'channel', common: {role: 'media', name:'media'}, native: {}}); await createAliasAsync(id + '.ACTUAL', dpPath + '.volume', true, { type: 'number', role: 'value.volume', name: 'ACTUAL' }); await createAliasAsync(id + '.ALBUM', dpPath + '.current_album', true, { type: 'string', role: 'media.album', name: 'ALBUM' }); await createAliasAsync(id + '.ARTIST', dpPath + '.current_artist', true, { type: 'string', role: 'media.artist', name: 'ARTIST' }); await createAliasAsync(id + '.TITLE', dpPath + '.current_title', true, { type: 'string', role: 'media.title', name: 'TITLE' }); await createAliasAsync(id + '.CONTEXT_DESCRIPTION', dpPath + '.current_station', true, { type: 'string', role: 'media.station', name: 'CONTEXT_DESCRIPTION' }); await createAliasAsync(id + '.NEXT', dpPath + '.next', true, { type: 'boolean', role: 'button.next', name: 'NEXT' }); await createAliasAsync(id + '.PREV', dpPath + '.prev', true, { type: 'boolean', role: 'button.prev', name: 'PREV' }); await createAliasAsync(id + '.PLAY', dpPath + '.play', true, { type: 'boolean', role: 'button.play', name: 'PLAY' }); await createAliasAsync(id + '.PAUSE', dpPath + '.pause', true, { type: 'boolean', role: 'button.pause', name: 'PAUSE' }); await createAliasAsync(id + '.STOP', dpPath + '.stop', true, { type: 'boolean', role: 'button.stop', name: 'STOP' }); await createAliasAsync(id + '.STATE', dpPath + '.state_simple', true, { type: 'boolean', role: 'media.state', name: 'STATE' }); await createAliasAsync(id + '.VOLUME', dpPath + '.volume', true, { type: 'number', role: 'level.volume', name: 'VOLUME' }); await createAliasAsync(id + '.REPEAT', dpPath + '.repeat', true, { type: 'number', role: 'media.mode.repeat', name: 'REPEAT' }); await createAliasAsync(id + '.SHUFFLE', dpPath + '.shuffle', true, { type: 'boolean', role: 'media.mode.shuffle', name: 'SHUFFLE' }); } catch (err) { console.warn('function createAutoMediaAlias: ' + err.message); } } } /* Volumio */ if (adapterPlayerInstance.startsWith('volumio')) { if (existsObject(id) == false){ console.log('Volumio Alias ' + id + ' existiert nicht - wird jetzt angelegt') let dpPath: string = adapterPlayerInstance; try { setObject(id, {_id: id, type: 'channel', common: {role: 'media', name:'media'}, native: {}}); await createAliasAsync(id + '.ACTUAL', dpPath + 'playbackInfo.volume', true, { type: 'number', role: 'value.volume', name: 'ACTUAL' }); await createAliasAsync(id + '.ALBUM', dpPath + 'playbackInfo.album', true, { type: 'string', role: 'media.album', name: 'ALBUM' }); await createAliasAsync(id + '.ARTIST', dpPath + 'playbackInfo.artist', true, { type: 'string', role: 'media.artist', name: 'ARTIST' }); await createAliasAsync(id + '.TITLE', dpPath + 'playbackInfo.title', true, { type: 'string', role: 'media.title', name: 'TITLE' }); await createAliasAsync(id + '.NEXT', dpPath + 'player.next', true, { type: 'boolean', role: 'button.next', name: 'NEXT' }); await createAliasAsync(id + '.PREV', dpPath + 'player.prev', true, { type: 'boolean', role: 'button.prev', name: 'PREV' }); await createAliasAsync(id + '.PLAY', dpPath + 'player.play', true, { type: 'boolean', role: 'button.play', name: 'PLAY' }); await createAliasAsync(id + '.PAUSE', dpPath + 'player.toggle', true, { type: 'boolean', role: 'button.pause', name: 'PAUSE' }); await createAliasAsync(id + '.STOP', dpPath + 'player.stop', true, { type: 'boolean', role: 'button.stop', name: 'STOP' }); await createAliasAsync(id + '.STATE', dpPath + 'playbackInfo.status', true, { type: 'boolean', role: 'media.state', name: 'STATE' }); await createAliasAsync(id + '.VOLUME', dpPath + 'playbackInfo.volume', true, { type: 'number', role: 'level.volume', name: 'VOLUME' }); await createAliasAsync(id + '.REPEAT', dpPath + 'playbackInfo.repeat', true, { type: 'number', role: 'media.mode.repeat', name: 'REPEAT' }); await createAliasAsync(id + '.SHUFFLE', dpPath + 'queue.shuffle', true, { type: 'boolean', role: 'media.mode.shuffle', name: 'SHUFFLE' }); await createAliasAsync(id + '.status', dpPath + 'playbackInfo.status', true, { type: 'string', role: 'media.state', name: 'status' }); } catch (err) { console.warn('function createAutoMediaAlias: ' + err.message); } } } } } function GenerateMediaPage(page: PageMedia): Payload[] { try { let id = page.items[0].id let out_msgs: Array = []; unsubscribeMediaSubscriptions(); subscribeMediaSubscriptions(id); if (page.items[0].autoCreateALias) { let vMediaDevice = (page.items[0].mediaDevice != undefined) ? page.items[0].mediaDevice : ''; createAutoMediaAlias(id, vMediaDevice, page.items[0].adapterPlayerInstance); } out_msgs.push({ payload: 'pageType~cardMedia' }); if (existsObject(id)) { let name = getState(id + '.ALBUM').val; let title = getState(id + '.TITLE').val; let author = getState(id + '.ARTIST').val; let shuffle = getState(id + '.SHUFFLE').val; let vInstance = page.items[0].adapterPlayerInstance; let v1Adapter = vInstance.split('.'); let v2Adapter = v1Adapter[0]; //Neue Adapter/Player let media_icon = Icons.GetIcon('playlist-music'); //Spotify-Premium if (v2Adapter == 'spotify-premium') { media_icon = Icons.GetIcon('spotify'); name = getState(id + '.CONTEXT_DESCRIPTION').val; let nameLength = name.length; if (name.substring(0,9) == 'Playlist:') { name = name.slice(10, 26) + '...'; } else if (name.substring(0,6) == 'Album:') { name = name.slice(7, 23) + '...'; } else if (name.substring(0,6) == 'Track') { name = 'Spotify-Premium'; } if (nameLength == 0) { name = 'Spotify-Premium'; } author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val; if (author.length > 30) { author = getState(id + '.ARTIST').val; } if ((getState(id + '.ARTIST').val).length == 0) { author = 'no music to control'; } } //Sonos if (v2Adapter == 'sonos') { media_icon = Icons.GetIcon('music'); name = getState(id + '.CONTEXT_DESCRIPTION').val; let nameLenght = name.length; if (nameLenght == 0) { name = 'Sonos Player'; } author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val; if ((getState(id + '.ARTIST').val).length == 0) { author = 'no music to control'; } } //Logitech Squeezebox RPC if (v2Adapter == 'squeezeboxrpc') { media_icon = Icons.GetIcon('dlna'); let nameLength = name.length; if (nameLength == 0) { name = 'Squeezebox RPC'; author = 'no music to control'; } } //Alexa2 if (v2Adapter == 'alexa2') { media_icon = Icons.GetIcon('music-circle'); name = getState(id + '.ALBUM').val; let nameLength = name.length; if (name.substring(0,9) == 'Playlist:') { name = name.slice(10, 26) + '...'; } else if (name.substring(0,6) == 'Album:') { name = name.slice(7, 23) + '...'; } else if (name.substring(0,6) == 'Track') { name = 'Alexa Player'; } if (nameLength == 0) { name = 'Alexa Player'; } author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val; if (author.length > 30) { author = getState(id + '.ARTIST').val; } if ((getState(id + '.ARTIST').val).length == 0) { author = 'no music to control'; } } //Volumio if (v2Adapter == 'volumio') { if (name != undefined) { author = author + " [" + name + "]"; } name = getState(vInstance + 'info.name').val; /* page.heading; getState(id + '.TRACK').val; */ } let volume = getState(id + '.VOLUME').val; let iconplaypause = Icons.GetIcon('pause'); //pause let shuffle_icon = Icons.GetIcon('shuffle-variant'); //shuffle let onoffbutton = 1374; if (shuffle == 'off' || shuffle == false || shuffle == 0) { shuffle_icon = Icons.GetIcon('shuffle-disabled'); //shuffle } if (v2Adapter == 'volumio') { shuffle_icon = Icons.GetIcon('refresh'); } //Volumio: refresh playlist //Für alle Player if (getState(id + '.STATE').val) { onoffbutton = 65535; iconplaypause = Icons.GetIcon('pause'); //pause } else { iconplaypause = Icons.GetIcon('play'); //play } //Ausnahme für squeezebox, da State = Power if (v2Adapter == 'squeezeboxrpc') { if (getState(id + '.PAUSE').val === false) { onoffbutton = 65535; iconplaypause = Icons.GetIcon('pause'); //pause } else { iconplaypause = Icons.GetIcon('play'); //play } } //Ausnahme Volumio: status = string: play, pause, stop usw. if (v2Adapter == 'volumio') { if (getState(id + '.status').val == 'play') { onoffbutton = 65535; iconplaypause = Icons.GetIcon('pause'); //pause } else { iconplaypause = Icons.GetIcon('play'); //play } } let currentSpeaker = 'kein Speaker gefunden'; if (v2Adapter == 'alexa2') { currentSpeaker = getState(([page.items[0].adapterPlayerInstance, 'Echo-Devices.', page.items[0].mediaDevice, '.Info.name'].join(''))).val; } else if (v2Adapter == 'spotify-premium') { currentSpeaker = getState(([page.items[0].adapterPlayerInstance, 'player.device.name'].join(''))).val; } else if (v2Adapter == 'sonos') { currentSpeaker = getState(([page.items[0].adapterPlayerInstance, 'root.', page.items[0].mediaDevice, '.members'].join(''))).val; } else if (v2Adapter == 'squeezeboxrpc') { if(existsObject(([page.items[0].adapterPlayerInstance, 'Playername'].join('')))) { currentSpeaker = getState(([page.items[0].adapterPlayerInstance, 'Playername'].join(''))).val; } } //------------------------------------------------------------------------------------------------------------- // nachfolgend alle Alexa-Devices (ist Online / Player- und Commands-Verzeichnis vorhanden) auflisten und verketten // Wenn Konstante alexaSpeakerList mind. einen Eintrag enthält, wird die Konstante verwendet - ansonsten Alle Devices aus dem Alexa Adapter let speakerList = ''; if (page.items[0].speakerList.length > 0) { for (let i_index in page.items[0].speakerList) { speakerList = speakerList + page.items[0].speakerList[i_index] + '?'; } } else { let i_list = Array.prototype.slice.apply($('[state.id="' + page.items[0].adapterPlayerInstance + 'Echo-Devices.*.Info.name"]')); for (let i_index in i_list) { let i = i_list[i_index]; let deviceId = i; deviceId = deviceId.split('.'); if (getState(([page.items[0].adapterPlayerInstance, 'Echo-Devices.', deviceId[3], '.online'].join(''))).val && existsObject(([page.items[0].adapterPlayerInstance, 'Echo-Devices.', deviceId[3], '.Player'].join(''))) && existsObject(([page.items[0].adapterPlayerInstance, 'Echo-Devices.', deviceId[3], '.Commands'].join('')))) { speakerList = speakerList + getState(i).val + '?'; } } } speakerList = speakerList.substring(0, speakerList.length - 1); //-------------------------------------------------------------------------------------------------------------- let colMediaIcon = (page.items[0].colorMediaIcon != undefined) ? page.items[0].colorMediaIcon : White; let colMediaTitle = (page.items[0].colorMediaTitle != undefined) ? page.items[0].colorMediaTitle : White; let colMediaArtist = (page.items[0].colorMediaArtist != undefined) ? page.items[0].colorMediaArtist : White; //InSel Speaker let speakerListString: string = '~~~~~~' let speakerListIconCol = rgb_dec565(HMIOff); if (page.items[0].speakerList != undefined) { speakerListIconCol = rgb_dec565(HMIOn); speakerListString = 'input_sel' + '~' + id + '?speakerlist' + '~' + Icons.GetIcon('speaker') + '~' + speakerListIconCol + '~' + 'Speaker' + '~' + 'media0~' } //InSel Playlist let playListString: string = '~~~~~~' let playListIconCol = rgb_dec565(HMIOff); if (page.items[0].playList != undefined) { /* Volumio: get actual playlist if empty */ if (v2Adapter == 'volumio') { if (page.items[0].playList.length == 0) { request({ url: `${getState(vInstance+'info.host').val}/api/listplaylists`, headers: {'User-Agent': 'ioBroker'} }, async (error, response, result) => { try { page.items[0].playList = JSON.parse(result); //console.log(page.items[0].playList); } } catch (err) { console.log('get_volumio-playlist: ' + err.message); } ); } } playListIconCol = rgb_dec565(HMIOn); playListString = 'input_sel' + '~' + id + '?playlist' + '~' + Icons.GetIcon('playlist-play') + '~' + playListIconCol + '~' + 'PlayL ' + page.heading + '~' + 'media1~' } //Testvariable ******************** //InSel Playlist let trackListString: string = '~~~~~~' let trackListIconCol = rgb_dec565(HMIOff); if (globalTracklist!= null && globalTracklist.length != 0) { trackListIconCol = rgb_dec565(HMIOn); trackListString = 'input_sel' + '~' + id + '?tracklist' + '~' + Icons.GetIcon('animation-play-outline') + '~' + trackListIconCol + '~' + 'Tracklist' + '~' + 'media2~' } //InSel EQ let equalizerListString: string = '~~~~~~' let equalizerListIconCol = rgb_dec565(HMIOff); if (page.items[0].equalizerList != undefined) { equalizerListIconCol = rgb_dec565(HMIOn); equalizerListString = 'input_sel' + '~' + id + '?equalizer' + '~' + Icons.GetIcon('equalizer-outline') + '~' + equalizerListIconCol + '~' + 'Equalizer' + '~' + 'media3~' } //Repeat Control Button let repeatIcon = Icons.GetIcon('repeat-variant'); let repeatIconCol = rgb_dec565(HMIOff); let repeatButtonString: string = '~~~~~~' if (v2Adapter == 'spotify-premium') { if (getState(id + '.REPEAT').val == 'context') { repeatIcon = Icons.GetIcon('repeat-variant'); repeatIconCol = rgb_dec565(HMIOn); } else if (getState(id + '.REPEAT').val == 'track') { repeatIcon = Icons.GetIcon('repeat-once'); repeatIconCol = rgb_dec565(HMIOn); } } else if (v2Adapter == 'alexa2') { if (getState(id + '.REPEAT').val == true) { repeatIcon = Icons.GetIcon('repeat-variant'); repeatIconCol = rgb_dec565(HMIOn); } } else if (v2Adapter == 'sonos') { if (getState(id + '.REPEAT').val == 'all') { repeatIcon = Icons.GetIcon('repeat-variant'); repeatIconCol = rgb_dec565(HMIOn); } else if (getState(id + '.REPEAT').val == 'one') { repeatIcon = Icons.GetIcon('repeat-once'); repeatIconCol = rgb_dec565(HMIOn); } } else if (v2Adapter == 'squeezeboxrpc') { if (getState(id + '.REPEAT').val == 1) { repeatIcon = Icons.GetIcon('repeat-variant'); repeatIconCol = rgb_dec565(HMIOn); } else if (getState(id + '.REPEAT').val == 2) { repeatIcon = Icons.GetIcon('repeat-once'); repeatIconCol = rgb_dec565(HMIOn); } } /* Volumio todo: 2 boolean 'Repeat' + 'RepeatSingle' */ if (v2Adapter == 'spotify-premium' || v2Adapter == 'alexa2' || v2Adapter == 'sonos') { repeatButtonString = 'button' + '~' + id + '?repeat' + '~' + repeatIcon + '~' + repeatIconCol + '~' + 'Repeat' + '~' + 'media4' } out_msgs.push({ payload: 'entityUpd~' + //entityUpd name + '~' + //heading GetNavigationString(pageId) + '~' + //navigation id + '~' + //internalNameEntiy title + '~' + //title rgb_dec565(colMediaTitle) + '~' + //titleColor author + '~' + //author rgb_dec565(colMediaArtist) + '~' + //authorColor volume + '~' + //volume iconplaypause + '~' + //playpauseicon onoffbutton + '~' + //On/Off Button Color shuffle_icon + '~' + //iconShuffle --> Code 'button' + '~' + //type MediaIcon --> Code id + '~' + //internalNameEntity MediaIcon --> Code media_icon + '~' + //icon MediaIcon rgb_dec565(colMediaIcon) + '~~~' + //iconColor MediaIcon speakerListString + playListString + trackListString + equalizerListString + repeatButtonString }); } if (Debug) { console.log(out_msgs); } return out_msgs } catch (err) { console.warn('function GenerateMediaPage: ' + err.message); } } function HandleButtonEvent(words): void { try { let tempid = words[2].split('?'); let id = tempid[0]; let buttonAction = words[3]; if (Debug) { console.log(words[0] + ' - ' + words[1] + ' - ' + words[2] + ' - ' + words[3] + ' - ' + words[4] + ' - PageId: ' + pageId); } if ((words[2]).substring(0, 8) == 'navigate') { GeneratePage(eval((words[2]).substring(9, (words[2]).length))); return; } if (Debug) { console.log(buttonAction); } let pageNum:number = 0; switch (buttonAction) { case 'bUp': if (pageId < 0) { // Prüfen, ob button1page oder button2page pageId = 0; UnsubscribeWatcher(); GeneratePage(config.pages[pageId]); } else { pageNum = (((pageId - 1) % config.pages.length) + config.pages.length) % config.pages.length; pageId = pageNum; UnsubscribeWatcher(); if (activePage != undefined && activePage.parent != undefined) { //update pageID for (let i = 0; i < config.pages.length; i++) { if (config.pages[i] == activePage.parent) { pageId = i; break; } } GeneratePage(activePage.parent); } else { GeneratePage(config.pages[pageId]); } break; } break; case 'bNext': pageNum = (((pageId + 1) % config.pages.length) + config.pages.length) % config.pages.length; pageId = pageNum; UnsubscribeWatcher(); GeneratePage(config.pages[pageId]); break; case 'bPrev': pageNum = (((pageId - 1) % config.pages.length) + config.pages.length) % config.pages.length; pageId = pageNum; UnsubscribeWatcher(); if (activePage != undefined && activePage.parent != undefined) { //update pageID for (let i = 0; i < config.pages.length; i++) { if (config.pages[i] == activePage.parent) { pageId = i; break; } } GeneratePage(activePage.parent); } else { GeneratePage(config.pages[pageId]); } break; case 'bExit': if (config.screenSaverDoubleClick && words[2] == 'screensaver') { if (words[4] >= 2) { setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyHeading', ''); setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyText', ''); if (existsObject(NSPanel_Path + 'ScreensaverInfo.bExitPage') && getState(NSPanel_Path + 'ScreensaverInfo.bExitPage').val != null) { GeneratePage(config.pages[getState(NSPanel_Path + 'ScreensaverInfo.bExitPage').val]); } else { GeneratePage(activePage); } } } else { if (Debug) { console.log('bExit: ' + words[4] + ' - ' + pageId); } setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyHeading', ''); setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyText', ''); if (existsObject(NSPanel_Path + 'ScreensaverInfo.bExitPage') && getState(NSPanel_Path + 'ScreensaverInfo.bExitPage').val != null) { GeneratePage(config.pages[getState(NSPanel_Path + 'ScreensaverInfo.bExitPage').val]); } else { GeneratePage(activePage); } } break; case 'bHome': if (Debug) { console.log('bExit: ' + words[4] + ' - ' + pageId); } UnsubscribeWatcher(); GeneratePage(config.pages[0]); break; case 'notifyAction': if (words[4] == 'yes') { setState(popupNotifyInternalName, { val: words[2], ack: true }); setState(popupNotifyAction, { val: true, ack: true }); } else if (words[4] == 'no') { setState(popupNotifyInternalName, { val: words[2], ack: true }); setState(popupNotifyAction, { val: false, ack: true }); } setIfExists(config.panelSendTopic, 'exitPopup'); break; case 'OnOff': if (existsObject(id)) { let action = false if (words[4] == '1') action = true; let o = getObject(id); switch (o.common.role) { case 'level.mode.fan': case 'socket': case 'light': setIfExists(id + '.SET', action); break; case 'dimmer': setIfExists(id + '.ON_SET', action) ? true : setIfExists(id + '.ON_ACTUAL', action); break; case 'ct': setIfExists(id + '.ON', action); break; case 'rgb': case 'rgbSingle': case 'hue': // Armilar setIfExists(id + '.ON_ACTUAL', action); } } break; case 'button': if (existsObject(id)) { let action = false if (words[4] == '1') action = true; let o = getObject(id); switch (o.common.role) { case 'lock': case 'button': toggleState(id + '.SET') ? true : toggleState(id + '.ON_SET'); break; case 'buttonSensor': if (existsObject(id + '.ACTUAL')) { toggleState(id + '.ACTUAL'); } break; case 'socket': case 'light': toggleState(id + '.SET') ? true : toggleState(id + '.ON_SET'); break; case 'dimmer': toggleState(id + '.ON_SET') ? true : toggleState(id + '.ON_ACTUAL'); break; case 'ct': toggleState(id + '.ON'); break; case 'rgb': case 'rgbSingle': case 'hue': // Armilar toggleState(id + '.ON_ACTUAL'); case 'media': if (tempid[1] == 'repeat') { let pageItemRepeat = findPageItem(id); let adapterInstanceRepeat = pageItemRepeat.adapterPlayerInstance; let adapterRepeat = adapterInstanceRepeat.split('.') let deviceAdapterRP = adapterRepeat[0]; switch (deviceAdapterRP) { case 'spotify-premium': let stateSpotifyRepeat = getState(id + '.REPEAT').val if (stateSpotifyRepeat == 'off') { setIfExists(id + '.REPEAT', 'context'); } else if (stateSpotifyRepeat == 'context') { setIfExists(id + '.REPEAT', 'track'); } else if (stateSpotifyRepeat == 'track') { setIfExists(id + '.REPEAT', 'off'); } break; case 'alexa2': try { if (getState(id + '.REPEAT').val == 'false') { setIfExists(id + '.REPEAT', true); } else { setIfExists(id + '.REPEAT', false); } } catch (err) { console.log('Repeat kann nicht verändert werden'); } break; } } } } break; case 'up': setIfExists(id + '.OPEN', true); break; case 'stop': setIfExists(id + '.STOP', true); break; case 'down': setIfExists(id + '.CLOSE', true); break; case 'positionSlider': (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })(); timeoutSlider = setTimeout(async function () { setIfExists(id + '.SET', parseInt(words[4])) ? true : setIfExists(id + '.ACTUAL', parseInt(words[4])); }, 250); break; case 'tiltOpen': setIfExists(id + '.TILT_OPEN', true); break; case 'tiltStop': setIfExists(id + '.TILT_STOP', true); break; case 'tiltClose': setIfExists(id + '.TILT_CLOSE', true); break; case 'tiltSlider': (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })(); timeoutSlider = setTimeout(async function () { setIfExists(id + '.TILT_SET', parseInt(words[4])) ? true : setIfExists(id + '.TILT_ACTUAL', parseInt(words[4])); }, 250); break; case 'brightnessSlider': (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })(); timeoutSlider = setTimeout(async function () { if (existsObject(id)) { let o = getObject(id); let pageItem = findPageItem(id); switch (o.common.role) { case 'dimmer': if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) { let sliderPos = Math.trunc(scale(parseInt(words[4]), 0, 100, pageItem.maxValueBrightness, pageItem.minValueBrightness)) setIfExists(id + '.SET', sliderPos) ? true : setIfExists(id + '.ACTUAL', sliderPos); } else { setIfExists(id + '.SET', parseInt(words[4])) ? true : setIfExists(id + '.ACTUAL', parseInt(words[4])); } break; case 'rgb': case 'ct': case 'rgbSingle': case 'hue': if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) { let sliderPos = Math.trunc(scale(parseInt(words[4]), 0, 100, pageItem.maxValueBrightness, pageItem.minValueBrightness)) setIfExists(id + '.DIMMER', sliderPos); } else { setIfExists(id + '.DIMMER', parseInt(words[4])); } break; } } }, 250); break; case 'colorTempSlider': // Armilar - Slider tickt verkehrt - Hell = 0 / Dunkel = 100 -> Korrektur (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })(); timeoutSlider = setTimeout(async function () { let pageItem = findPageItem(id); if (pageItem.minValueColorTemp !== undefined && pageItem.maxValueColorTemp !== undefined) { let colorTempK = Math.trunc(scale(parseInt(words[4]), 0, 100, pageItem.minValueColorTemp, pageItem.maxValueColorTemp)); setIfExists(id + '.TEMPERATURE', (colorTempK)); } else { setIfExists(id + '.TEMPERATURE', 100 - words[4]); } }, 250); break; case 'colorWheel': let colorCoordinates = words[4].split('|'); let rgb = pos_to_color(colorCoordinates[0], colorCoordinates[1]); if (Debug) { console.log(rgb); } if (Debug) { console.log(getHue(rgb.red, rgb.green, rgb.blue)); } let o = getObject(id); switch (o.common.role) { case 'hue': setIfExists(id + '.HUE', getHue(rgb.red, rgb.green, rgb.blue)); break; case 'rgb': setIfExists(id + '.RED', rgb.red); setIfExists(id + '.GREEN', rgb.green); setIfExists(id + '.BLUE', rgb.blue); break; case 'rgbSingle': let pageItem = findPageItem(id); if (pageItem.colormode == "xy") { //Für z.B. Deconz XY setIfExists(id + ".RGB", rgb_to_cie(rgb.red, rgb.green, rgb.blue)); if (Debug) { console.log(rgb_to_cie(rgb.red, rgb.green, rgb.blue)); } } else { //Für RGB setIfExists(id + ".RGB", ConvertRGBtoHex(rgb.red, rgb.green, rgb.blue)); } break; } break; case 'tempUpd': setIfExists(id + '.SET', parseInt(words[4]) / 10); break; case 'media-back': setIfExists(id + '.PREV', true); break; case 'media-pause': let pageItemTemp = findPageItem(id); let adaInstanceSplit = pageItemTemp.adapterPlayerInstance.split('.'); if (adaInstanceSplit[0] == 'squeezeboxrpc') { let stateVal = getState(pageItemTemp.adapterPlayerInstance + 'state').val if (stateVal == 0) { setState(pageItemTemp.adapterPlayerInstance + 'state', 1) } else if (stateVal == 1) { setState(pageItemTemp.adapterPlayerInstance + 'state', 0) } else if (stateVal == null) { setState(pageItemTemp.adapterPlayerInstance + 'state', 1) } } else { if (getState(id + '.STATE').val === true) { setIfExists(id + '.PAUSE', true); } else { setIfExists(id + '.PLAY', true); } } break; case 'media-next': setIfExists(id + '.NEXT', true); break; case 'media-shuffle': if ((findPageItem(id).adapterPlayerInstance).startsWith("volumio")) { findPageItem(id).playList = []; break; } //Volumio: empty playlist $uha-20230103 if (getState(id + '.SHUFFLE').val == 'off') { setIfExists(id + '.SHUFFLE', 'on'); } else { setIfExists(id + '.SHUFFLE', 'off'); } break; case 'volumeSlider': setIfExists(id + '.VOLUME', parseInt(words[4])) break; case 'mode-speakerlist': let pageItem = findPageItem(id); let adapterInstance = pageItem.adapterPlayerInstance; let adapter = adapterInstance.split('.') let deviceAdapter = adapter[0]; switch (deviceAdapter) { case 'spotify-premium': let strDevicePI = pageItem.speakerList[words[4]] let strDeviceID = spotifyGetDeviceID(strDevicePI); setState(adapterInstance + 'devices.' + strDeviceID + ".useForPlayback", true); break; case 'alexa2': let i_list = Array.prototype.slice.apply($('[state.id="' + adapterInstance + 'Echo-Devices.*.Info.name"]')); for (let i_index in i_list) { let i = i_list[i_index]; if ((getState(i).val) === pageItem.speakerList[words[4]]) { console.log(getState(i).val + ' - ' + pageItem.speakerList[words[4]]); let deviceId = i; deviceId = deviceId.split('.'); setIfExists(adapterInstance + 'Echo-Devices.' + pageItem.mediaDevice + '.Commands.textCommand', 'Schiebe meine Musik auf ' + pageItem.speakerList[words[4]]); pageItem.mediaDevice = deviceId[3]; } } break; case 'sonos': break; case 'chromecast': break; } break; case 'mode-playlist': let pageItemPL = findPageItem(id); let adapterInstancePL = pageItemPL.adapterPlayerInstance; let adapterPL = adapterInstancePL.split('.') let deviceAdapterPL = adapterPL[0]; switch (deviceAdapterPL) { case 'spotify-premium': let strDevicePI = pageItemPL.playList[words[4]] console.log(strDevicePI) let playlistListString = (getState(adapterInstancePL + 'playlists.playlistListString').val).split(';'); let playlistListIds = (getState(adapterInstancePL + 'playlists.playlistListIds').val).split(';'); let playlistIndex = playlistListString.indexOf(strDevicePI); setState(adapterInstancePL + 'playlists.playlistList', playlistListIds[playlistIndex]); setTimeout(async function () { globalTracklist = (function () { try {return JSON.parse(getState(adapterInstancePL + 'player.playlist.trackListArray').val);} catch(e) {return {};}})(); }, 2000); break; case 'alexa2': let tempListItem = pageItemPL.playList[words[4]].split('.'); setState(adapterInstancePL + 'Echo-Devices.' + pageItemPL.mediaDevice + '.Music-Provider.' + tempListItem[0], tempListItem[1]); break; case 'volumio': let strDevicePL = pageItemPL.playList[words[4]]; request({ url:`${getState(adapterInstancePL+'info.host').val}/api/commands/?cmd=playplaylist&name=${strDevicePL}`, headers: {'User-Agent': 'ioBroker'} }, async (error, response, result)=>{}); /* nothing todo @ error */ break; } break; case 'mode-tracklist': let pageItemTL = findPageItem(id); let adapterInstanceTL = pageItemTL.adapterPlayerInstance; let adapterTL = adapterInstanceTL.split('.') let deviceAdapterTL = adapterTL[0]; switch (deviceAdapterTL) { case 'spotify-premium': let trackArray = (function () { try {return JSON.parse(getState(pageItemTL.adapterPlayerInstance + 'player.playlist.trackListArray').val);} catch(e) {return {};}})(); setState(adapterInstanceTL + 'player.trackId', getAttr(trackArray, words[4] + '.id')); break; case 'alexa2': console.log('Aktuell hat alexa2 keine Tracklist') break; } break; case 'mode-repeat': let pageItemRP = findPageItem(id); let adapterInstanceRP = pageItemRP.adapterPlayerInstance; let adapterRP = adapterInstanceRP.split('.') let deviceAdapterRP = adapterRP[0]; switch (deviceAdapterRP) { case 'spotify-premium': setIfExists(id + '.REPEAT', pageItemRP.repeatList[words[4]]); break; case 'alexa2': break; } break; case 'mode-equalizer': let pageItemEQ = findPageItem(id); console.log(id) let lastIndex = (id.split('.')).pop(); setState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode', pageItemEQ.equalizerList[words[4]]); setTimeout(async function () { GenerateDetailPage('popupInSel','equalizer', pageItemEQ) }, 2000); break; case 'mode-insel': setIfExists(id + '.VALUE', parseInt(words[4])); break; case 'media-OnOff': let pageItemTem = findPageItem(id); let adaInstanceSpli = pageItemTem.adapterPlayerInstance.split('.'); if (adaInstanceSpli[0] == 'squeezeboxrpc') { let stateVal = getState(pageItemTem.adapterPlayerInstance + 'Power').val if (stateVal === 0) { setState(pageItemTem.adapterPlayerInstance + 'Power', 1) setIfExists(id + '.STOP', false) setIfExists(id + '.STATE', 1) } else { setState(pageItemTem.adapterPlayerInstance + 'Power', 0) setIfExists(id + '.STOP', true) setIfExists(id + '.STATE', 0) } } else { setIfExists(id + '.STOP', true) } break; case 'timer-start': if (words[4] != undefined) { let timer_panel = words[4].split(':'); setIfExists(id + '.ACTUAL', (parseInt(timer_panel[1]) * 60) + parseInt(timer_panel[2])); } setIfExists(id + '.STATE', 'active'); break; case 'timer-pause': setIfExists(id + '.STATE', 'paused'); break; case 'timer-cancle': setIfExists(id + '.STATE', 'idle'); setIfExists(id + '.ACTUAL', 0); break; case 'timer-finish': setIfExists(id + '.STATE', 'idle'); setIfExists(id + '.ACTUAL', 0); break; case 'hvac_action': if (words[4] == 'BOOT' || words[4] == 'PART' || words[4] == 'AUTT' || words[4] == 'MANT' || words[4] == 'VACT') { switch (words[4]) { case 'BOOT': setIfExists(words[2] + '.' + 'BOOST', !getState(words[2] + '.' + 'BOOST').val) break; case 'PART': setIfExists(words[2] + '.' + 'PARTY', !getState(words[2] + '.' + 'PARTY').val) break; case 'AUTT': setIfExists(words[2] + '.' + 'AUTOMATIC', !getState(words[2] + '.' + 'AUTOMATIC').val) break; case 'MANT': setIfExists(words[2] + '.' + 'MANUAL', !getState(words[2] + '.' + 'MANUAL').val) break; case 'VACT': setIfExists(words[2] + '.' + 'VACATION', !getState(words[2] + '.' + 'VACATION').val) break; } let modes = ['BOOT', 'PART', 'AUTT', 'MANT', 'VACT'] let modesDP = ['BOOST', 'PARTY', 'AUTOMATIC', 'MANUAL', 'VACATION'] for (let mode=0; mode < 5; mode++) { if (words[4] != modes[mode]) { setIfExists(words[2] + '.' + modesDP[mode], false) } } GeneratePage(config.pages[pageId]); } else { let HVACMode = 0; switch (words[4]) { case 'POWER': HVACMode = 0; setIfExists(words[2] + '.' + words[4], !getState(words[2] + '.' + words[4]).val) if (getState(words[2] + '.' + words[4]).val) { HVACMode = 1; } break; case 'AUTO': HVACMode = 1; break; case 'COOL': HVACMode = 2; break; case 'HEAT': HVACMode = 3; break; case 'ECO': HVACMode = 4; break; case 'FAN': HVACMode = 5; break; case 'DRY': HVACMode = 6; break; case 'SWING': HVACMode = getState(words[2] + '.MODE').val; if (getState(words[2] + '.SWING').val == 0) { setIfExists(words[2] + '.SWING', 1); } else { setIfExists(words[2] + '.' + 'SWING', 0); } break; } setIfExists(words[2] + '.' + 'MODE', HVACMode) GeneratePage(config.pages[pageId]); } break; case 'mode-modus1': let pageItemT1 = findPageItem(id); setIfExists(id + '.' + pageItemT1.setThermoAlias[0], pageItemT1.popupThermoMode1[parseInt(words[4])]); break; case 'mode-modus2': let pageItemT2 = findPageItem(id); setIfExists(id + '.' + pageItemT2.setThermoAlias[1], pageItemT2.popupThermoMode2[parseInt(words[4])]); break; case 'mode-modus3': let pageItemT3 = findPageItem(id); setIfExists(id + '.' + pageItemT3.setThermoAlias[2], pageItemT3.popupThermoMode3[parseInt(words[4])]); break; case 'number-set': let nobj = getObject(id); switch (nobj.common.role) { case 'level.mode.fan': setIfExists(id + '.SPEED', parseInt(words[4])); break; default: setIfExists(id + '.SET', parseInt(words[4])) ? true : setIfExists(id + '.ACTUAL', parseInt(words[4])); break; } break; case 'mode-preset_modes': setIfExists(id + '.MODE', parseInt(words[4])); break; case 'A1': // Alarm-Page Alarm 1 aktivieren if (words[4] != '') { setIfExists(id + '.TYPE', 'A1'); setIfExists(id + '.PIN', words[4]); setIfExists(id + '.ACTUAL', 'arming'); setIfExists(id + '.PANEL', NSPanel_Path); } setTimeout(function(){ GeneratePage(activePage); },250) break; case 'A2': // Alarm-Page Alarm 2 aktivieren if (words[4] != '') { setIfExists(id + '.TYPE', 'A2'); setIfExists(id + '.PIN', words[4]); setIfExists(id + '.ACTUAL', 'arming'); setIfExists(id + '.PANEL', NSPanel_Path); } setTimeout(function(){ GeneratePage(activePage); },250) break; case 'A3': // Alarm-Page Alarm 3 aktivieren if (words[4] != '') { setIfExists(id + '.TYPE', 'A3'); setIfExists(id + '.PIN', words[4]); setIfExists(id + '.ACTUAL', 'arming'); setIfExists(id + '.PANEL', NSPanel_Path); } setTimeout(function(){ GeneratePage(activePage); },250) break; case 'A4': // Alarm-Page Alarm 4 aktivieren if (words[4] != '') { setIfExists(id + '.TYPE', 'A4'); setIfExists(id + '.PIN', words[4]); setIfExists(id + '.ACTUAL', 'arming'); setIfExists(id + '.PANEL', NSPanel_Path); } setTimeout(function(){ GeneratePage(activePage); },250) break; case 'D1': // Alarm-Page Alarm Deaktivieren if (Debug) { console.log('D1: ' + getState(id + '.PIN').val); } if (Debug) { console.log(words[4]); } if (words[4] != '') { if (getState(id + '.PIN').val == words[4]) { setIfExists(id + '.PIN', '0000'); setIfExists(id + '.TYPE', 'D1'); setIfExists(id + '.ACTUAL', 'pending'); setIfExists(id + '.PIN_Failed', 0); } else { setIfExists(id + '.PIN_Failed', getState(id + '.PIN_Failed').val + 1); setIfExists(id + '.ACTUAL', 'triggered'); } setIfExists(id + '.PANEL', NSPanel_Path); setTimeout(function(){ GeneratePage(activePage); },500) } break; default: break; } } catch (err) { console.log('function HandleButtonEvent: ' + err.message); } } function GenerateDetailPage(type: string, optional: string, pageItem: PageItem): Payload[] { //console.log(type + ' - ' + optional + ' - ' + pageItem.id) try { let out_msgs: Array = []; let id = pageItem.id if (existsObject(id)) { let o = getObject(id) let val: (boolean | number) = 0; let icon = Icons.GetIcon('lightbulb'); let iconColor = rgb_dec565(config.defaultColor); if (type == 'popupLight') { let switchVal = '0'; let brightness = 0; if (o.common.role == 'light' || o.common.role == 'socket') { if (existsState(id + '.GET')) { val = getState(id + '.GET').val; RegisterDetailEntityWatcher(id + '.GET', pageItem, type); } else if (existsState(id + '.SET')) { val = getState(id + '.SET').val; RegisterDetailEntityWatcher(id + '.SET', pageItem, type); } icon = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : o.common.role == 'socket' ? Icons.GetIcon('power-socket-de') : Icons.GetIcon('lightbulb'); if (val) { switchVal = '1'; iconColor = GetIconColor(pageItem, true, true); } else { iconColor = GetIconColor(pageItem, false, true); } out_msgs.push({ payload: 'entityUpdateDetail' + '~' // entityUpdateDetail + id + '~' + icon + '~' // iconId + iconColor + '~' // iconColor + switchVal + '~' // buttonState + 'disable' + '~' // sliderBrightnessPos + 'disable' + '~' // sliderColorTempPos + 'disable' + '~' // colorMode + '' + '~' // Color-Bezeichnung + findLocale('lights', 'Temperature') + '~' // Temperature-Bezeichnung + findLocale('lights', 'Brightness') }); // Brightness-Bezeichnung } // Dimmer if (o.common.role == 'dimmer') { if (existsState(id + '.ON_ACTUAL')) { val = getState(id + '.ON_ACTUAL').val; RegisterDetailEntityWatcher(id + '.ON_ACTUAL', pageItem, type); } else if (existsState(id + '.ON_SET')) { val = getState(id + '.ON_SET').val; RegisterDetailEntityWatcher(id + '.ON_SET', pageItem, type); } if (val === true) { let iconColor = GetIconColor(pageItem, val, false); switchVal = '1' } if (existsState(id + '.ACTUAL')) { if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) { brightness = Math.trunc(scale(getState(id + '.ACTUAL').val, pageItem.minValueBrightness, pageItem.maxValueBrightness, 100, 0)); } else { brightness = getState(id + '.ACTUAL').val; } } else { console.warn('Alisas-Datenpunkt: ' + id + '.ACTUAL could not be read'); } if (val === true) { iconColor = GetIconColor(pageItem, 100 - brightness, true); switchVal = '1'; } else { iconColor = GetIconColor(pageItem, false, true); } RegisterDetailEntityWatcher(id + '.ACTUAL', pageItem, type); out_msgs.push({ payload: 'entityUpdateDetail' + '~' //entityUpdateDetail + id + '~' + icon + '~' //iconId + iconColor + '~' //iconColor + switchVal + '~' //buttonState + brightness + '~' //sliderBrightnessPos + 'disable' + '~' //sliderColorTempPos + 'disable' + '~' //colorMod + '' + '~' //Color-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Brightness') }); //Brightness-Bezeichnung } // HUE-Licht if (o.common.role == 'hue') { if (existsState(id + '.ON_ACTUAL')) { val = getState(id + '.ON_ACTUAL').val; RegisterDetailEntityWatcher(id + '.ON_ACTUAL', pageItem, type); } if (existsState(id + '.DIMMER')) { if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) { brightness = Math.trunc(scale(getState(id + '.DIMMER').val, pageItem.minValueBrightness, pageItem.maxValueBrightness, 100, 0)); } else { brightness = getState(id + '.DIMMER').val; } RegisterDetailEntityWatcher(id + '.DIMMER', pageItem, type); } else { console.warn('Alias-Datenpunkt: ' + id + '.DIMMER could not be read'); } if (val === true) { iconColor = GetIconColor(pageItem, 100 - brightness, true); switchVal = '1'; } else { iconColor = GetIconColor(pageItem, false, true); } let colorMode = 'disable'; if (existsState(id + '.HUE')) { if (getState(id + '.HUE').val != null) { colorMode = 'enable'; let huecolor = hsv2rgb(getState(id + '.HUE').val, 1, 1); let rgb = { red: Math.round(huecolor[0]), green: Math.round(huecolor[1]), blue: Math.round(huecolor[2]) } iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); //RegisterDetailEntityWatcher(id + '.HUE', pageItem, type); } } let colorTemp = 0; if (existsState(id + '.TEMPERATURE')) { if (getState(id + '.TEMPERATURE').val != null) { if (pageItem.minValueColorTemp !== undefined && pageItem.maxValueColorTemp !== undefined) { colorTemp = Math.trunc(scale(getState(id + '.TEMPERATURE').val, pageItem.minValueColorTemp, pageItem.maxValueColorTemp, 0, 100)); } else { colorTemp = 100 - getState(id + '.TEMPERATURE').val; } //RegisterDetailEntityWatcher(id + '.TEMPERATURE', pageItem, type); } } else { console.warn('Alias-Datenpunkt: ' + id + '.TEMPERATURE could not be read'); } out_msgs.push({ payload: 'entityUpdateDetail' + '~' //entityUpdateDetail + id + '~' + icon + '~' //iconId + iconColor + '~' //iconColor + switchVal + '~' //buttonState + brightness + '~' //sliderBrightnessPos + colorTemp + '~' //sliderColorTempPos + colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable) + 'Color' + '~' //Color-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Brightness') //Brightness-Bezeichnung }); } // RGB-Licht if (o.common.role == 'rgb') { if (existsState(id + '.ON_ACTUAL')) { val = getState(id + '.ON_ACTUAL').val; RegisterDetailEntityWatcher(id + '.ON_ACTUAL', pageItem, type); } if (existsState(id + '.DIMMER')) { if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) { brightness = Math.trunc(scale(getState(id + '.DIMMER').val, pageItem.minValueBrightness, pageItem.maxValueBrightness, 100, 0)); } else { brightness = getState(id + '.DIMMER').val; } RegisterDetailEntityWatcher(id + '.DIMMER', pageItem, type); } else { console.warn('Alias-Datenpunkt: ' + id + '.DIMMER could not be read'); } if (val === true) { iconColor = GetIconColor(pageItem, 100 - brightness, true); switchVal = '1'; } else { iconColor = GetIconColor(pageItem, false, true); } let colorMode = 'disable'; if (existsState(id + '.RED') && existsState(id + '.GREEN') && existsState(id + '.BLUE')) { if (getState(id + '.RED').val != null && getState(id + '.GREEN').val != null && getState(id + '.BLUE').val != null) { colorMode = 'enable'; let rgb = { red: Math.round(getState(id + '.RED').val), green: Math.round(getState(id + '.GREEN').val), blue: Math.round(getState(id + '.BLUE').val) } iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); //RegisterDetailEntityWatcher(id + '.HUE', pageItem, type); } } let colorTemp = 0; if (existsState(id + '.TEMPERATURE')) { if (getState(id + '.TEMPERATURE').val != null) { if (pageItem.minValueColorTemp !== undefined && pageItem.minValueColorTemp !== undefined) { colorTemp = Math.trunc(scale(getState(id + '.TEMPERATURE').val, pageItem.minValueColorTemp, pageItem.maxValueColorTemp, 0, 100)); } else { colorTemp = 100 - getState(id + '.TEMPERATURE').val; } //RegisterDetailEntityWatcher(id + '.TEMPERATURE', pageItem, type); } } else { console.warn('Alias-Datenpunkt: ' + id + '.TEMPERATURE could not be read'); } out_msgs.push({ payload: 'entityUpdateDetail' + '~' //entityUpdateDetail + id + '~' + icon + '~' //iconId + iconColor + '~' //iconColor + switchVal + '~' //buttonState + brightness + '~' //sliderBrightnessPos + colorTemp + '~' //sliderColorTempPos + colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable) + 'Color' + '~' //Color-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Brightness') //Brightness-Bezeichnung }); } // RGB-Licht-einzeln (HEX) if (o.common.role == 'rgbSingle') { if (existsState(id + '.ON_ACTUAL')) { val = getState(id + '.ON_ACTUAL').val; RegisterDetailEntityWatcher(id + '.ON_ACTUAL', pageItem, type); } if (existsState(id + '.DIMMER')) { if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) { brightness = Math.trunc(scale(getState(id + '.DIMMER').val, pageItem.minValueBrightness, pageItem.maxValueBrightness, 100, 0)); } else { brightness = getState(id + '.DIMMER').val; } RegisterDetailEntityWatcher(id + '.DIMMER', pageItem, type); } else { console.warn('Alias-Datenpunkt: ' + id + '.DIMMER could not be read'); } if (val === true) { iconColor = GetIconColor(pageItem, 100 - brightness, true); switchVal = '1'; } else { iconColor = GetIconColor(pageItem, false, true); } let colorMode = 'disable'; if (existsState(id + '.RGB')) { if (getState(id + '.RGB').val != null) { colorMode = 'enable'; let hex = getState(id + '.RGB').val; let hexRed = parseInt(hex[1] + hex[2], 16); let hexGreen = parseInt(hex[3] + hex[4], 16); let hexBlue = parseInt(hex[5] + hex[6], 16); let rgb = { red: Math.round(hexRed), green: Math.round(hexGreen), blue: Math.round(hexBlue) } iconColor = rgb_dec565(pageItem.interpolateColor !== undefined ? rgb : config.defaultOnColor); //RegisterDetailEntityWatcher(id + '.HUE', pageItem, type); } } let colorTemp = 0; if (existsState(id + '.TEMPERATURE')) { if (getState(id + '.TEMPERATURE').val != null) { if (pageItem.minValueColorTemp !== undefined && pageItem.maxValueColorTemp !== undefined) { colorTemp = Math.trunc(scale(getState(id + '.TEMPERATURE').val, pageItem.minValueColorTemp, pageItem.maxValueColorTemp, 0, 100)); } else { colorTemp = 100 - getState(id + '.TEMPERATURE').val; } //RegisterDetailEntityWatcher(id + '.TEMPERATURE', pageItem, type); } } else { console.warn('Alias-Datenpunkt: ' + id + '.TEMPERATURE could not be read'); } out_msgs.push({ payload: 'entityUpdateDetail' + '~' //entityUpdateDetail + id + '~' + icon + '~' //iconId + iconColor + '~' //iconColor + switchVal + '~' //buttonState + brightness + '~' //sliderBrightnessPos + colorTemp + '~' //sliderColorTempPos + colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable) + 'Color' + '~' //Color-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Brightness') //Brightness-Bezeichnung }); } // Farbtemperatur if (o.common.role == 'ct') { if (existsState(id + '.ON')) { val = getState(id + '.ON').val; RegisterDetailEntityWatcher(id + '.ON', pageItem, type); } if (existsState(id + '.DIMMER')) { if (pageItem.minValueBrightness != undefined && pageItem.maxValueBrightness != undefined) { brightness = Math.trunc(scale(getState(id + '.DIMMER').val, pageItem.minValueBrightness, pageItem.maxValueBrightness, 100, 0)); } else { brightness = getState(id + '.DIMMER').val; } RegisterDetailEntityWatcher(id + '.DIMMER', pageItem, type); } else { console.warn('Alias-Datenpunkt: ' + id + '.DIMMER could not be read'); } if (val === true) { iconColor = GetIconColor(pageItem, 100 - brightness, true); switchVal = '1'; } else { iconColor = GetIconColor(pageItem, false, true); } let colorMode = 'disable'; let colorTemp = 0; if (existsState(id + '.TEMPERATURE')) { if (getState(id + '.TEMPERATURE').val != null) { if (pageItem.minValueColorTemp !== undefined && pageItem.maxValueColorTemp !== undefined) { colorTemp = Math.trunc(scale(getState(id + '.TEMPERATURE').val, pageItem.minValueColorTemp, pageItem.maxValueColorTemp, 0, 100)); } else { colorTemp = 100 - getState(id + '.TEMPERATURE').val; } //RegisterDetailEntityWatcher(id + '.TEMPERATURE', pageItem, type); } } else { console.warn('Alias-Datenpunkt: ' + id + '.TEMPERATURE could not be read'); } out_msgs.push({ payload: 'entityUpdateDetail' + '~' //entityUpdateDetail + id + '~' + icon + '~' //iconId + iconColor + '~' //iconColor + switchVal + '~' //buttonState + brightness + '~' //sliderBrightnessPos + colorTemp + '~' //sliderColorTempPos + colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable) + 'Color' + '~' //Color-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Brightness') //Brightness-Bezeichnung }); } } if (type == 'popupShutter') { icon = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('window-open'); if (existsState(id + '.ACTUAL')) { val = getState(id + '.ACTUAL').val; RegisterDetailEntityWatcher(id + '.ACTUAL', pageItem, type); } else if (existsState(id + '.SET')) { val = getState(id + '.SET').val; RegisterDetailEntityWatcher(id + '.SET', pageItem, type); } let tilt_position: any = 'disabled' if (existsState(id + '.TILT_ACTUAL')) { tilt_position = getState(id + '.TILT_ACTUAL').val; RegisterDetailEntityWatcher(id + '.TILT_ACTUAL', pageItem, type); } else if (existsState(id + '.TILT_SET')) { tilt_position = getState(id + '.TILT_SET').val; RegisterDetailEntityWatcher(id + '.TILT_SET', pageItem, type); } let textSecondRow = ''; let icon_id = icon; let icon_up = Icons.GetIcon('arrow-up'); let icon_stop = Icons.GetIcon('stop'); let icon_down = Icons.GetIcon('arrow-down'); let icon_up_status = getState(id + '.ACTUAL').val != 100 ? 'enable' : 'disable'; let icon_stop_status = 'enable'; let icon_down_status = getState(id + '.ACTUAL').val != 0 ? 'enable' : 'disable'; let textTilt = ''; let iconTiltLeft = ''; let iconTiltStop = ''; let iconTiltRight = ''; let iconTiltLeftStatus = 'disable'; let iconTiltStopStatus = 'disable'; let iconTiltRightStatus = 'disable'; let tilt_pos = 'disable'; if (existsState(id + '.TILT_SET')) { textTilt = findLocale('blinds', 'Tilt'); iconTiltLeft = Icons.GetIcon('arrow-top-right'); iconTiltStop = Icons.GetIcon('stop'); iconTiltRight = Icons.GetIcon('arrow-bottom-left'); iconTiltLeftStatus = getState(id + '.TILT_ACTUAL').val != 100 ? 'enable' : 'disable'; iconTiltStopStatus = 'enable'; iconTiltRightStatus = getState(id + '.TILT_ACTUAL').val != 0 ? 'enable' : 'disable'; tilt_pos = tilt_position; } if (pageItem.secondRow != undefined) { textSecondRow = pageItem.secondRow; } out_msgs.push({ payload: 'entityUpdateDetail' + '~' //entityUpdateDetail + id + '~' //entity_id + val + '~' //Shutterposition + textSecondRow + '~' //pos_status 2.line + findLocale('blinds', 'Position') + '~' //pos_translation + icon_id + '~' //{icon_id}~ + icon_up + '~' //{icon_up}~ + icon_stop + '~' //{icon_stop}~ + icon_down + '~' //{icon_down}~ + icon_up_status + '~' //{icon_up_status}~ + icon_stop_status + '~' //{icon_stop_status}~ + icon_down_status + '~' //{icon_down_status}~ + textTilt + '~' //{textTilt}~ + iconTiltLeft + '~' //{iconTiltLeft}~ + iconTiltStop + '~' //{iconTiltStop}~ + iconTiltRight + '~' //{iconTiltRight}~ + iconTiltLeftStatus + '~' //{iconTiltLeftStatus}~ + iconTiltStopStatus + '~' //{iconTiltStopStatus}~ + iconTiltRightStatus + '~' //{iconTiltRightStatus}~ + tilt_pos //{tilt_pos}") }); } if (type == 'popupThermo') { let vIcon = (pageItem.icon != undefined) ? pageItem.icon : 'fan'; let mode1 = (pageItem.popupThermoMode1 != undefined) ? pageItem.popupThermoMode1.join('?') : ''; let mode2 = (pageItem.popupThermoMode2 != undefined) ? pageItem.popupThermoMode2.join('?') : ''; let mode3 = (pageItem.popupThermoMode3 != undefined) ? pageItem.popupThermoMode3.join('?') : ''; let payloadParameters1 = '~~~~' if (pageItem.popupThermoMode1 != undefined) { RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias[0], pageItem, type); payloadParameters1 = pageItem.popUpThermoName[0] + '~' //{heading}~ Mode 1 + 'modus1' + '~' //{id}~ Mode 1 + getState(pageItem.id + "." + pageItem.setThermoAlias[0]).val + '~' //{ACTUAL}~ Mode 1 + mode1 + '~' //{possible values} Mode 1 (1-n) } let payloadParameters2 = '~~~~' if (pageItem.popupThermoMode2 != undefined) { RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias[1], pageItem, type); payloadParameters2 = pageItem.popUpThermoName[1] + '~' //{heading}~ Mode 2 + 'modus2' + '~' //{id}~ Mode 2 + getState(pageItem.id + "." + pageItem.setThermoAlias[1]).val + '~' //{ACTUAL}~ Mode 2 + mode2 + '~' //{possible values} } let payloadParameters3 = '~~~~' if (pageItem.popupThermoMode3 != undefined) { RegisterDetailEntityWatcher(pageItem.id + "." + pageItem.setThermoAlias[2], pageItem, type); payloadParameters3 = pageItem.popUpThermoName[2] + '~' //{heading}~ Mode 3 + 'modus3' + '~' //{id}~ Mode 3 + getState(pageItem.id + "." + pageItem.setThermoAlias[2]).val + '~' //{ACTUAL}~ Mode 3 + mode3 //{possible values} Mode 3 (1-n) } out_msgs.push({ payload: 'entityUpdateDetail' + '~' //entityUpdateDetail + id + '~' //{entity_id} + Icons.GetIcon(vIcon) + '~' //{icon_id}~ + 11487 + '~' //{icon_color}~ + payloadParameters1 + payloadParameters2 + payloadParameters3 }); } if (type == 'popupTimer') { let timer_actual: number = 0; if (existsState(id + '.ACTUAL')) { RegisterDetailEntityWatcher(id + '.ACTUAL', pageItem, type); timer_actual = getState(id + '.ACTUAL').val; } if (existsState(id + '.STATE')) { RegisterDetailEntityWatcher(id + '.STATE', pageItem, type); } let editable = 1; let action1 = ''; let action2 = ''; let action3 = ''; let label1 = ''; let label2 = ''; let label3 = ''; let min_remaining = 0; let sec_remaining = 0; if (existsState(id + '.STATE')) { if (getState(id + '.STATE').val == 'idle' || getState(id + '.STATE').val == 'paused') { min_remaining = Math.floor(timer_actual / 60);; sec_remaining = timer_actual % 60; editable = 1; action2 = 'start'; label2 = 'START'; } else { min_remaining = Math.floor(timer_actual / 60);; sec_remaining = timer_actual % 60; editable = 0; action1 = 'pause'; action2 = 'cancle'; action3 = 'finish'; label1 = 'PAUSE'; label2 = 'CANCLE'; label3 = 'FINISH'; } out_msgs.push({ payload: 'entityUpdateDetail' + '~' //entityUpdateDetail + id + '~~' //{entity_id} + rgb_dec565(White) + '~' //{icon_color}~ + id + '~' + min_remaining + '~' + sec_remaining + '~' + editable + '~' + action1 + '~' + action2 + '~' + action3 + '~' + label1 + '~' + label2 + '~' + label3 }); } } if (type == 'popupFan') { let switchVal = '0'; if (o.common.role == 'level.mode.fan') { if (existsState(id + '.SET')) { val = getState(id + '.SET').val; RegisterDetailEntityWatcher(id + '.SET', pageItem, type); } if (existsState(id + '.MODE')) { RegisterDetailEntityWatcher(id + '.MODE', pageItem, type); } icon = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : 'fan'; if (val) { switchVal = '1'; iconColor = GetIconColor(pageItem, true, true); } else { iconColor = GetIconColor(pageItem, false, true); } let actualSpeed = getState(id + '.SPEED').val let maxSpeed = (pageItem.maxValue != undefined) ? pageItem.maxValue : 100; let modeList = pageItem.modeList.join('?') let actualMode = pageItem.modeList[getState(id + '.MODE').val]; out_msgs.push({ payload: 'entityUpdateDetail' + '~' // entityUpdateDetail + id + '~' + icon + '~' // iconId + iconColor + '~' // iconColor + switchVal + '~' // buttonState + actualSpeed + '~' + maxSpeed + '~' + 'Speed' + '~' + actualMode + '~' + modeList }); } } if (type == 'popupInSel') { if (o.common.role == 'media') { let actualState: any = ''; let optionalString: string = 'Kein Eintrag' let mode: string = ''; let vTempAdapter = (pageItem.adapterPlayerInstance).split('.'); let vAdapter = vTempAdapter[0]; if (optional == 'speakerlist') { if (vAdapter == 'spotify-premium') { if (existsObject(pageItem.adapterPlayerInstance + 'player.device.name')) { actualState = formatInSelText(getState(pageItem.adapterPlayerInstance + 'player.device.name').val); } } else if (vAdapter == 'alexa2') { if (existsObject(pageItem.adapterPlayerInstance + 'player.device.name')) { //Todo Richtiges Device finden actualState = formatInSelText(getState(pageItem.adapterPlayerInstance + 'Echo-Devices.' + pageItem.mediaDevice + '.Info.name').val); } } let tempSpeakerList = []; for (let i = 0; i < pageItem.speakerList.length; i++) { tempSpeakerList[i] = formatInSelText(pageItem.speakerList[i]); } optionalString = pageItem.speakerList != undefined ? tempSpeakerList.join('?') : '' mode = 'speakerlist'; } else if (optional == 'playlist') { if (vAdapter == 'spotify-premium') { if (existsObject(pageItem.adapterPlayerInstance + 'player.playlist.name')) { actualState = formatInSelText(getState(pageItem.adapterPlayerInstance + 'player.playlist.name').val); } let tempPlayList = []; for (let i = 0; i < pageItem.playList.length; i++) { tempPlayList[i] = formatInSelText(pageItem.playList[i]); } optionalString = pageItem.playList != undefined ? tempPlayList.join('?') : '' } else if (vAdapter == 'alexa2') { //Todo Richtiges Device finden actualState = formatInSelText(getState(pageItem.adapterPlayerInstance + 'Echo-Devices.' + pageItem.mediaDevice + '.Player.currentAlbum').val); let tPlayList: any = [] for (let i = 0; i < pageItem.playList.length; i++) { console.log(pageItem.playList[i]); let tempItem = pageItem.playList[i].split('.'); tPlayList[i] = tempItem[1]; } let tempPlayList = []; for (let i = 0; i < tPlayList.length; i++) { tempPlayList[i] = formatInSelText(tPlayList[i]); } optionalString = pageItem.playList != undefined ? tempPlayList.join('?') : '' } else if (vAdapter == 'volumio') { /* Volumio: limit 900 chars */ actualState = ''; //todo: no actual playlistname saving let tempPlayList = []; let tempPll = 0; for (let i = 0; i < pageItem.playList.length; i++) { tempPll += pageItem.playList[i].length; if (tempPll > 900) break; tempPlayList[i] = formatInSelText(pageItem.playList[i]); } optionalString = pageItem.playList != undefined ? tempPlayList.join('?') : '' } /**/ mode = 'playlist'; } else if (optional == 'tracklist') { actualState = '' actualState = getState(pageItem.adapterPlayerInstance + 'player.trackName').val; actualState = (actualState.replace('?','')).split(' -'); actualState = actualState[0].split(" ("); actualState = formatInSelText(actualState[0]); //Limit 900 Zeichen, danach Speicherüberlauf --> Soweit kürzen wie möglich let temp_array = []; //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++) { let temp_cut_array = getAttr(globalTracklist, track_index + '.title'); if (temp_cut_array != undefined) { 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) + '..'; } else { temp_array[track_index] = temp_cut_array.substring(0,23); } } } let tempTrackList = []; for (let i = 0; i < temp_array.length; i++) { tempTrackList[i] = formatInSelText(temp_array[i]); } optionalString = pageItem.playList != undefined ? tempTrackList.join('?') : '' mode = 'tracklist'; } else if (optional == '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', { type: 'string' }) createState(NSPanel_Path + 'Media.Player.' + lastIndex + '.Speaker', { type: 'string' }) } actualState = '' if (getState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode').val != null) { actualState = formatInSelText(getState(NSPanel_Path + 'Media.Player.' + lastIndex + '.EQ.activeMode').val); } let tempEQList = []; for (let i = 0; i < pageItem.equalizerList.length; i++) { tempEQList[i] = formatInSelText(pageItem.equalizerList[i]); } optionalString = pageItem.equalizerList != undefined ? tempEQList.join('?') : ''; //optionalString = pageItem.equalizerList.join('?'); mode = 'equalizer'; } else if (optional == 'repeat') { actualState = getState(pageItem.adapterPlayerInstance + 'player.repeat').val; optionalString = pageItem.repeatList.join('?'); mode = 'repeat'; } out_msgs.push({ payload: 'entityUpdateDetail2' + '~' //entityUpdateDetail + id + '?' + optional + '~~' //{entity_id} + rgb_dec565(HMIOn) + '~' //{icon_color}~ + mode + '~' + actualState + '~' + optionalString }); } else if (o.common.role == 'buttonSensor') { let actualValue: string = ''; if (existsObject(pageItem.id + '.VALUE')) { actualValue = formatInSelText(pageItem.modeList[getState(pageItem.id + '.VALUE').val]); RegisterDetailEntityWatcher(id + '.VALUE', pageItem, type); } let tempModeList = []; for (let i = 0; i < pageItem.modeList.length; i++) { tempModeList[i] = formatInSelText(pageItem.modeList[i]); } let valueList = pageItem.modeList != undefined ? tempModeList.join('?') : ''; //let valueList = pageItem.modeList.join('?'); out_msgs.push({ payload: 'entityUpdateDetail2' + '~' //entityUpdateDetail2 + id + '~~' //{entity_id} + rgb_dec565(White) + '~' //{icon_color}~ + 'insel' + '~' + actualValue + '~' + valueList }); } } } return out_msgs; } catch (err) { console.log('function GenerateDetailPage: ' + err.message); } }