NEWS
SONOFF NSPanel mit Lovelace UI (TypeScript Version)
-
Ich glaube, das Problem ist nicht das MP3. Sondern die Playlist. Es werden ja nicht die Daten der Datei abgefragt, sondern die der Playlist. Der Artist fehlt da bei mir einfach. Egal, ob ich eine gespeicherte Playlist oder ein Album oder nur einen einzelnen Song starte.
[ { "index": 0, "id": 31792, "url": "file:///music/Alben/Metric%20-%20Romanticize%20The%20Dive/01%20Metric%20-%20Victim%20Of%20Luck.mp3", "title": "Victim Of Luck", "ArtworkUrl": "http://localhost:9900/music/94f7888d/cover.jpg", "Type": "mp3", "Bitrate": "320kb/s CBR", "Duration": 203.306, "Album": "Romanticize The Dive" } ] -
Ich glaube, das Problem ist nicht das MP3. Sondern die Playlist. Es werden ja nicht die Daten der Datei abgefragt, sondern die der Playlist. Der Artist fehlt da bei mir einfach. Egal, ob ich eine gespeicherte Playlist oder ein Album oder nur einen einzelnen Song starte.
[ { "index": 0, "id": 31792, "url": "file:///music/Alben/Metric%20-%20Romanticize%20The%20Dive/01%20Metric%20-%20Victim%20Of%20Luck.mp3", "title": "Victim Of Luck", "ArtworkUrl": "http://localhost:9900/music/94f7888d/cover.jpg", "Type": "mp3", "Bitrate": "320kb/s CBR", "Duration": 203.306, "Album": "Romanticize The Dive" } ] -
Ich glaubs euch ja. :) Die Frage ist, warum schickt entweder der LMS die Daten nicht an den Adapter oder der Adapter die Daten nicht ins JSON. Wenn es häufiger vorkommt, dann wäre ein Fallback vielleicht nicht schlecht. (Der author ist ja eh schon da, warum nochmal beschaffen?)
showOnlyPlayerHeadline liefert den "Heading" String, vom Parameternamen (und meinem Wunsch her) hätte ich das ausgewählte Wiedergabegerät erwartet. Dann sehe ich sofort, welches der Geräte ich eigentlich steuere. Sorry wegen der Unklarheit.
-
Ich glaubs euch ja. :) Die Frage ist, warum schickt entweder der LMS die Daten nicht an den Adapter oder der Adapter die Daten nicht ins JSON. Wenn es häufiger vorkommt, dann wäre ein Fallback vielleicht nicht schlecht. (Der author ist ja eh schon da, warum nochmal beschaffen?)
showOnlyPlayerHeadline liefert den "Heading" String, vom Parameternamen (und meinem Wunsch her) hätte ich das ausgewählte Wiedergabegerät erwartet. Dann sehe ich sofort, welches der Geräte ich eigentlich steuere. Sorry wegen der Unklarheit.
-
Ja, genau den. Die Card lässt mich den ja sogar wählen, aber ich sehe den dann nirgendwo. Ich würd aber gern wissen, ob ich Bad oder Esszimmer steuere. :)
-
Ja, genau den. Die Card lässt mich den ja sogar wählen, aber ich sehe den dann nirgendwo. Ich würd aber gern wissen, ob ich Bad oder Esszimmer steuere. :)
Ja, genau den. Die Card lässt mich den ja sogar wählen, aber ich sehe den dann nirgendwo. Ich würd aber gern wissen, ob ich Bad oder Esszimmer steuere. :)
Okay, den können wir natürlich auch nehmen... Ist bei mir etwas schwieriger... Ich steuere damit exakt einen Player... Daher sehe ich auch keine anderen...
Ich ändere das ab...
-
Ja, genau den. Die Card lässt mich den ja sogar wählen, aber ich sehe den dann nirgendwo. Ich würd aber gern wissen, ob ich Bad oder Esszimmer steuere. :)
Noch mal den unteren Teil aus dem DEV Script ersetzen:
https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/DEV/NSPanelTs.ts
Danach sollte der Player und der Artist angezeigt werden...
-
javascript.0 01:03:40.994 warn error at function GenerateMediaPage: Cannot read properties of null (reading 'length') javascript.0 01:03:41.959 warn at GenerateMediaPage (script.js.common.NSPanel:9087:26) javascript.0 01:03:41.959 warn at GeneratePage (script.js.common.NSPanel:6065:29) javascript.0 01:03:41.959 warn at Object.<anonymous> (script.js.common.NSPanel:8421:21) javascript.0 01:03:41.959 warn at step (script.js.common.NSPanel:33:23) javascript.0 01:03:41.959 warn at Object.next (script.js.common.NSPanel:14:53) javascript.0 01:03:41.959 warn at script.js.common.NSPanel:8:71 javascript.0 01:03:41.959 warn at __awaiter (script.js.common.NSPanel:4:12)Die Seite wird jetzt nicht mehr angezeigt.
Ich kann aber grad nicht sagen, wo genau das auftaucht - im squeezeboxrpc-Block sind sowohl author.length als auch title.length immer vorhanden.
Nachtrag: mit showOnlyPlayerHeadline: false tritt es nicht auf. Ich kriegs auf die Schnelle im Code aber nicht eingegrenzt. @armilar
Nachtrag 2:
{ id: 'alias.0.NSPanel.1.Media.PlayerSqueezeboxRPC', adapterPlayerInstance: 'squeezeboxrpc.0.', speakerList: [ 'Heartbeat_4', 'Squeezebox' ], mediaDevice: 'Heartbeat_4', playList: [], colorMediaIcon: { red: 0, green: 255, blue: 0 }, colorMediaArtist: { red: 255, green: 255, blue: 0 }, colorMediaTitle: { red: 255, green: 255, blue: 0 }, alwaysOnDisplay: true, autoCreateALias: true, showOnlyPlayerHeadline: true }Ich habe
name = getState(page.items[0].adapterPlayerInstance + "Players.SqueezePlay.Playername").val;mal so geändert, dann klappts:
name = getState(page.items[0].adapterPlayerInstance + "Players." + page.items[0].mediaDevice + ".Playername").val; -
Ich bin da nicht drin daher:
ergibt das bei dir eine gültige id?
adapterPlayerInstance + "Players.SqueezePlay.Playername"aber nicht wichtig - hier
if (name.length == 0)muß einif (typeOf name !== 'string' || name.length == 0)rein.
https://github.com/joBr99/nspanel-lovelace-ui/blob/b8649caa2714e0594d14c334550e2ba8e33f8cfb/ioBroker/DEV/NSPanelTs.ts#L7884EDIT: du benutzt doch
squeezeboxrpc -
@ticaki siehe oben, das hab ich noch gefunden und nachgetragen. Das ".SqueezePlay." im Datenpunkt-Pfad ist falsch. Das existiert schlicht nicht.
Hab aber immer noch mein "undefined". heul
author = lmstracklist[currentIndex].Artist + '|' + lmstracklist[currentIndex].Album; if (author == undefined || author == "undefined") { author = getState(id + '.ARTIST').val; }Das kann aber auch nicht klappen, author wird ja zugewiesen und kann nnicht undefined sein.
author = lmstracklist[currentIndex].Artist; if (author == undefined || author == "undefined") { author = getState(id + '.ARTIST').val; } author = author + '|' + lmstracklist[currentIndex].Album;klappt bei mir.
-
@ticaki siehe oben, das hab ich noch gefunden und nachgetragen. Das ".SqueezePlay." im Datenpunkt-Pfad ist falsch. Das existiert schlicht nicht.
Hab aber immer noch mein "undefined". heul
author = lmstracklist[currentIndex].Artist + '|' + lmstracklist[currentIndex].Album; if (author == undefined || author == "undefined") { author = getState(id + '.ARTIST').val; }Das kann aber auch nicht klappen, author wird ja zugewiesen und kann nnicht undefined sein.
author = lmstracklist[currentIndex].Artist; if (author == undefined || author == "undefined") { author = getState(id + '.ARTIST').val; } author = author + '|' + lmstracklist[currentIndex].Album;klappt bei mir.
Wenn es jetzt funktioniert, dann bitte mal hier die komplette GenerateMediaPage reinwerfen. Dann kann ich mir das zusammensuchen sparen.
-
@ticaki siehe oben, das hab ich noch gefunden und nachgetragen. Das ".SqueezePlay." im Datenpunkt-Pfad ist falsch. Das existiert schlicht nicht.
Hab aber immer noch mein "undefined". heul
author = lmstracklist[currentIndex].Artist + '|' + lmstracklist[currentIndex].Album; if (author == undefined || author == "undefined") { author = getState(id + '.ARTIST').val; }Das kann aber auch nicht klappen, author wird ja zugewiesen und kann nnicht undefined sein.
author = lmstracklist[currentIndex].Artist; if (author == undefined || author == "undefined") { author = getState(id + '.ARTIST').val; } author = author + '|' + lmstracklist[currentIndex].Album;klappt bei mir.
Das hier ist trotzdem nötig - da darf kein undefined auf length geprüft werden...
if (name.length == 0)->if (typeof name !== 'string' || name.length == 0)wobei das ist kürzer (aber auch unsicherer)
if ((name ?? '').length == 0) -
Wenn es jetzt funktioniert, dann bitte mal hier die komplette GenerateMediaPage reinwerfen. Dann kann ich mir das zusammensuchen sparen.
@Armilar Hier, inklusive des Fix von @ticaki
function GenerateMediaPage (page: NSPanel.PageMedia): NSPanel.Payload[] { try { unsubscribeMediaSubscriptions(); if (!page.items[0].id) throw new Error('Missing page id for cardMedia!'); let id = page.items[0].id; let tid = 0; let out_msgs: NSPanel.Payload[] = []; if (!page.items[0].adapterPlayerInstance!) throw new Error('page.items[0].adapterPlayerInstance is undefined!'); let vInstance = page.items[0].adapterPlayerInstance!; let v1Adapter = vInstance.split('.'); let v2Adapter: NSPanel.PlayerType = v1Adapter[0] as NSPanel.PlayerType; let vMediaDevice = page.items[0].mediaDevice != undefined ? page.items[0].mediaDevice : ''; if (isPlayerWithMediaDevice(v2Adapter)) { 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) { out_msgs.push({payload: 'pageType~cardMedia'}); if (page.items[0].alwaysOnDisplay != undefined) { if (page.items[0].alwaysOnDisplay) { pageCounter = 1; if (alwaysOn == false) { alwaysOn = true; SendToPanel({payload: 'timeout~0'}); subscribeMediaSubscriptions(page.items[0].id); if (v2Adapter == 'sonos') { subscribeMediaSubscriptionsSonosAdd(page.items[0].id); } else if (v2Adapter == 'spotify-premium') { setState(vInstance + 'getDevices', true); setState(vInstance + 'getPlaybackInfo', true); setState(vInstance + 'getPlaylists', true); } } } } } else if (page.type == 'cardMedia' && pageCounter == 1) { alwaysOn = true; subscribeMediaSubscriptions(page.items[0].id); if (v2Adapter == 'sonos') { subscribeMediaSubscriptionsSonosAdd(page.items[0].id); } } else if (page.type == 'cardMedia' && pageCounter == -1) { //Do Nothing } else { out_msgs.push({payload: 'pageType~cardMedia'}); } if (existsObject(id)) { let name = ""; if (page.items[0].showOnlyPlayerHeadline && page.items[0].showOnlyPlayerHeadline != undefined) { //name = getState(page.items[0].adapterPlayerInstance + "Players.SqueezePlay.Playername").val; name = getState(page.items[0].adapterPlayerInstance + "Players." + page.items[0].mediaDevice + ".Playername").val; //name = page.heading; } else { name = getState(id + '.ALBUM').val; console.log("##### else name"); } let title = getState(id + '.TITLE').val; if (title && title.indexOf('~') !== -1) { title = title.split('~')[0].trim(); } if (title.length > 24) { title = title.slice(0, 24) + '...'; } if (existsObject(id + '.DURATION') && existsObject(id + '.ELAPSED')) { if (v2Adapter == 'alexa2') { if (Debug) log(getState(id + '.DURATION').val, 'info'); let Seconds = parseInt(getState(id + '.DURATION').val) % 60 < 10 ? '0' : ''; let Duration = Math.floor(getState(id + '.DURATION').val / 60) + ':' + Seconds + (getState(id + '.DURATION').val % 60); let vElapsed = getState(id + '.ELAPSED').val; if (vElapsed.length == 5) { if (parseInt(vElapsed.slice(0, 2)) < 9) { vElapsed = vElapsed.slice(1); } } if (vElapsed == 0) { vElapsed = '0:00'; } let vDuration = Duration; if (vDuration.length == 5) { if (parseInt(vDuration.slice(0, 2)) < 9) { vDuration = vDuration.slice(1); } } if (vDuration != '0:00') { title = title + ' (' + vElapsed + '|' + vDuration + ')'; } else { title = title + ' (' + vElapsed + ')'; } if (title == ' (0:00)') { title = ''; } } else if (v2Adapter == 'sonos' && getState(page.items[0].adapterPlayerInstance + 'root.' + page.items[0].mediaDevice + '.current_type').val == 0) { let vElapsed = getState(id + '.ELAPSED').val; if (vElapsed.length == 5) { if (parseInt(vElapsed.slice(0, 2)) < 9) { vElapsed = vElapsed.slice(1); } } else if (vElapsed.length == 8) { vElapsed = vElapsed.slice(4); } let vDuration = getState(id + '.DURATION').val; if (vDuration.length == 5) { if (parseInt(vDuration.slice(0, 2)) < 9) { vDuration = vDuration.slice(1); } } else if (vDuration.length == 8) { vDuration = vDuration.slice(4); } title = title + ' (' + vElapsed + '|' + vDuration + ')'; } else if (v2Adapter == 'bosesoundtouch') { if (Debug) log(getState(id + '.ELAPSED').val, 'info'); let elapsedSeconds = parseInt(getState(id + '.ELAPSED').val) % 60 < 10 ? '0' : ''; let vElapsed = Math.floor(getState(id + '.ELAPSED').val / 60) + ':' + elapsedSeconds + (getState(id + '.ELAPSED').val % 60); if (Debug) log(getState(id + '.DURATION').val, 'info'); let durationSeconds = parseInt(getState(id + '.DURATION').val) % 60 < 10 ? '0' : ''; let vDuration = Math.floor(getState(id + '.DURATION').val / 60) + ':' + durationSeconds + (getState(id + '.DURATION').val % 60); title = title + ' (' + vElapsed + '|' + vDuration + ')'; } else if (v2Adapter == 'mpd') { let vElapsed: string = getState(id + '.ELAPSED').val; let vDuration: string = getState(id + '.DURATION').val; title = title + ' (' + vElapsed + '|' + vDuration + ')'; if (getState(id + '.STATE').val === 'stop') { title = '(00:00|00:00)'; } } } let author = getState(id + '.ARTIST').val; if (v2Adapter == 'squeezeboxrpc' && author.length > 0) { if (existsObject([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join(''))) { if (existsObject([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join(''))) { let lmstracklist = JSON.parse(getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join('')).val); let currentIndex: number = parseInt(getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.PlaylistCurrentIndex'].join('')).val); author = lmstracklist[currentIndex].Artist; if (author == undefined || author == "undefined") { author = getState(id + '.ARTIST').val; } author = author + '|' + lmstracklist[currentIndex].Album; if (author.length > 37) { author = author.slice(0, 37) + '...'; } let elapsedTime: number = parseInt(getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Time'].join('')).val); let elapsedSeconds = elapsedTime % 60 < 10 ? '0' : ''; let vElapsed = Math.floor(elapsedTime / 60) + ':' + elapsedSeconds + (elapsedTime % 60); let durationSeconds = parseInt(lmstracklist[currentIndex].Duration) % 60 < 10 ? '0' : ''; let vDuration = Math.floor(parseInt(lmstracklist[currentIndex].Duration) / 60) + ':' + durationSeconds + (parseInt(lmstracklist[currentIndex].Duration) % 60); title = lmstracklist[currentIndex].title; if (title.length > 25) { title = title.slice(0, 25) + '...'; } title = title + ' (' + vElapsed + '|' + vDuration + ')'; } } } // Settings >>Aktualisierungsintervall für Statusinformationen<< = 1 ! // If the refresh time is set to 1 second in the spotify-premium.X instance, // the elapsed refresh bug '00:00' is not visible if (v2Adapter == 'spotify-premium') { let vElapsed: string = getState(id + '.ELAPSED').val; if (vElapsed.substring(0, 1) == '0') { vElapsed = vElapsed.slice(1); } let vDuration: string = getState(id + '.DURATION').val; if (vDuration.substring(0, 1) == '0') { vDuration = vDuration.slice(1); } title = title + ' (' + vElapsed + '|' + vDuration + ')'; if (title == ' (0:00|0:00)') { title = ''; } } let shuffle = getState(id + '.SHUFFLE').val; //New Adapter/Player let media_icon = Icons.GetIcon('playlist-music'); //Spotify-Premium if (v2Adapter == 'spotify-premium') { media_icon = Icons.GetIcon('spotify'); if (page.items[0].playerMediaIcon !== undefined) { if (page.items[0].playerMediaIcon == 'logo-spotify') { media_icon = page.items[0].playerMediaIcon; } else { media_icon = Icons.GetIcon(page.items[0].playerMediaIcon); } } name = getState(id + '.CONTEXT_DESCRIPTION').val; let nameLength = name.length; if (name.substring(0, 17) == 'Playlist: This Is') { name = name.slice(18, 34) + '...'; } else 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 = name.slice(7, 23) + '...'; } else if (name.substring(0, 7) == 'Artist:') { name = name.slice(8, 24) + '...'; } if (nameLength == 0) { name = 'Spotify-Premium'; } author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val; if (author.length > 37) { author = author.slice(0, 37) + '...'; } if (getState(id + '.ARTIST').val.length == 0) { author = findLocale('media', 'no_music_to_control'); } } //Sonos if (v2Adapter == 'sonos') { media_icon = Icons.GetIcon('alpha-s-circle'); if (page.items[0].playerMediaIcon !== undefined) { if (page.items[0].playerMediaIcon == 'logo-sonos') { media_icon = page.items[0].playerMediaIcon; } else { media_icon = Icons.GetIcon(page.items[0].playerMediaIcon); } } name = getState(id + '.CONTEXT_DESCRIPTION').val; let nameLenght = name.length; if (nameLenght == 0) { name = page.heading; } else if (nameLenght > 16) { name = name.slice(0, 16) + '...'; } if (getState(id + '.ALBUM').val.length > 0) { author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val; if (author.length > 37) { author = author.slice(0, 37) + '...'; } } else { author = getState(id + '.ARTIST').val; } if (getState(id + '.ARTIST').val.length == 0) { author = findLocale('media', 'no_music_to_control'); } } //Bose Soundtouch if (v2Adapter == 'bosesoundtouch') { media_icon = Icons.GetIcon('alpha-b-circle'); if (page.items[0].playerMediaIcon !== undefined) { if (page.items[0].playerMediaIcon == 'logo-bose') { media_icon = page.items[0].playerMediaIcon; } else { media_icon = Icons.GetIcon(page.items[0].playerMediaIcon); } } name = page.heading; if (getState(id + '.ALBUM').val.length > 0) { author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val; if (author.length > 37) { author = author.slice(0, 37) + '...'; } } else { author = getState(id + '.ARTIST').val; } if (getState(id + '.ARTIST').val.length == 0) { author = findLocale('media', 'no_music_to_control'); } } //Logitech Squeezebox RPC if (v2Adapter == 'squeezeboxrpc') { media_icon = Icons.GetIcon('dlna'); if (page.items[0].playerMediaIcon !== undefined) { if (page.items[0].playerMediaIcon == 'logo-dnla') { media_icon = page.items[0].playerMediaIcon; } else { media_icon = Icons.GetIcon(page.items[0].playerMediaIcon); } } if (name.length == 0) { name = page.heading; } else if (name.length > 16) { name = name.slice(0, 16) + '...'; } } //Alexa2 if (v2Adapter == 'alexa2') { media_icon = Icons.GetIcon('alpha-a-circle'); if (page.items[0].playerMediaIcon !== undefined) { if (page.items[0].playerMediaIcon == 'logo-alexa') { media_icon = page.items[0].playerMediaIcon; } else { media_icon = Icons.GetIcon(page.items[0].playerMediaIcon); } } 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'; } else { name = name.slice(0, 16) + '...'; } 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 = findLocale('media', 'no_music_to_control'); } } //Volumio if (v2Adapter == 'volumio') { media_icon = Icons.GetIcon('clock-time-twelve-outline'); if (page.items[0].playerMediaIcon !== undefined) { if (page.items[0].playerMediaIcon == 'logo-volumio') { media_icon = page.items[0].playerMediaIcon; } else { media_icon = Icons.GetIcon(page.items[0].playerMediaIcon); } } if (name != undefined) { author = author + ' | ' + name; } name = page.heading; } //MPD if (v2Adapter == 'mpd') { media_icon = Icons.GetIcon('alpha-m-circle'); if (page.items[0].playerMediaIcon !== undefined) { if (page.items[0].playerMediaIcon == 'logo-mpd') { media_icon = page.items[0].playerMediaIcon; } else { media_icon = Icons.GetIcon(page.items[0].playerMediaIcon); } } if (getState(id + '.ALBUM').val.length > 0) { author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val; if (author.length > 37) { author = author.slice(0, 37) + '...'; } } else { author = getState(id + '.ARTIST').val; } if (getState(id + '.ARTIST').val.length == 0) { author = findLocale('media', 'no_music_to_control'); } name = page.heading; } let volume = scale(getState(id + '.VOLUME').val, activePage!.items[0]!.minValue ?? 0, activePage!.items[0]!.maxValue ?? 100, 100, 0); 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 == 'false') { shuffle_icon = Icons.GetIcon('shuffle-disabled'); //shuffle } // Todo: Refresh automatisieren und dafür wieder Shuffle nutzen //if (v2Adapter == 'volumio') { shuffle_icon = Icons.GetIcon('shuffle-disabled'); } //Volumio: refresh playlist //For all players 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 für mpd, da State = play, pause,.... if (v2Adapter == 'mpd') { if (getState(id + '.STATE').val === 'play') { onoffbutton = 65535; iconplaypause = Icons.GetIcon('pause'); //pause } else if (getState(id + '.STATE').val === 'pause') { iconplaypause = Icons.GetIcon('play'); //play } else if (getState(id + '.STATE').val === 'stop') { onoffbutton = 1374; 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: string = findLocale('media', 'no_speaker_found'); 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') { currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playername'].join('')).val; } else if (v2Adapter == 'bosesoundtouch') { currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'deviceInfo.name'].join('')).val; } else if (v2Adapter == 'volumio') { currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'info.name'].join('')).val; } else if (v2Adapter == 'mpd') { currentSpeaker = v1Adapter[0] + '.' + v1Adapter[1]; } //------------------------------------------------------------------------------------------------------------- // All Alexa devices (the online / player and commands directory is available) are listed and linked below // If the constant alexaSpeakerList contains at least one entry, the constant is used - otherwise all devices from the Alexa adapter let speakerListArray: string[] = []; if (page.items[0].speakerList && page.items[0].speakerList.length > 0) { for (let i_index in page.items[0].speakerList) { speakerListArray.push(page.items[0].speakerList[i_index]); } } else if (v2Adapter == 'squeezeboxrpc') { // Beim Squeezeboxrpc ist jeder Player ein eigener Knoten im Objektbaum. Somit werden einzelne Aliase benötigt. const squeezeboxPlayerQuery: iobJS.QueryResult = $('channel[state.id=' + page.items[0].adapterPlayerInstance + '.Players.*.Playername]'); squeezeboxPlayerQuery.each((playerId: string, playerIndex: number) => { speakerListArray.push(getState(playerId).val); page.items[0].speakerList = speakerListArray; }); } else if (v2Adapter == 'spotify-premium') { // All possible Devices if page.items[0].speakerList empty if (Debug) log(getState(page.items[0].adapterPlayerInstance + 'devices.availableDeviceListString').val); speakerListArray = getState(page.items[0].adapterPlayerInstance + 'devices.availableDeviceListString').val.split(';'); page.items[0].speakerList = speakerListArray; } else if (v2Adapter == 'mpd') { // All possible Devices if page.items[0].speakerList empty page.items[0].speakerList[0] = v1Adapter[0] + '.' + v1Adapter[1]; } 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('')) ) { speakerListArray.push(getState(i).val); } } } //-------------------------------------------------------------------------------------------------------------- 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 (speakerListArray.length > 0) { speakerListIconCol = rgb_dec565(HMIOn); speakerListString = 'input_sel' + '~' + tid + '?speakerlist' + '~' + Icons.GetIcon('speaker') + '~' + speakerListIconCol + '~' + findLocale('media', '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) { let urlString: string = `${getState(vInstance + 'info.host').val}/api/listplaylists`; axios .get(urlString, {headers: {'User-Agent': 'ioBroker'}}) .then(async function (response) { if (response.status === 200) { if (Debug) { log(JSON.stringify(response.data), 'info'); } page.items[0].playList = JSON.parse(JSON.stringify(response.data)); if (Debug) log('volumio-playlist: ' + page.items[0].playList, 'info'); } else { log('Axios Status - get_volumio-playlist: ' + response.state, 'warn'); } }) .catch(function (error) { log(error, 'warn'); }); } /* Spotify: get all playlists if empty */ } else if (v2Adapter == 'spotify-premium') { page.items[0].playList = getState(page.items[0].adapterPlayerInstance + 'playlists.playlistListString').val.split(';'); } else if (v2Adapter == 'mpd') { let tempPL = getState(page.items[0].adapterPlayerInstance + 'listplaylists').val; tempPL = tempPL.replace('[', ''); tempPL = tempPL.replace(']', ''); tempPL = tempPL.replaceAll('"', ''); page.items[0].playList = tempPL.split(','); } playListIconCol = rgb_dec565(HMIOn); playListString = 'input_sel' + '~' + tid + '?playlist' + '~' + Icons.GetIcon('playlist-play') + '~' + playListIconCol + '~' + //'PlayL ' + page.heading + '~' + findLocale('media', 'playlist') + '~' + 'media1~'; } //InSel Tracklist globalTracklist = ''; let trackListString: string = '~~~~~~'; let trackListIconCol = rgb_dec565(HMIOff); if (v2Adapter == 'volumio') { /* Volumio: get queue */ setTimeout(async function () { let urlString: string = `${getState(vInstance + 'info.host').val}/api/getQueue`; axios .get(urlString, {headers: {'User-Agent': 'ioBroker'}}) .then(async function (response) { if (response.status === 200) { if (Debug) { log(JSON.stringify(response.data), 'info'); } const QUEUELIST = JSON.parse(JSON.stringify(response.data)); page.items[0].globalTracklist = QUEUELIST.queue; if (Debug) { for (let i_index in QUEUELIST.queue) { log('volumio-queue: ' + QUEUELIST.queue[i_index], 'info'); } } } else { log('Axios Status - get_volumio-queue: ' + response.state, 'warn'); } }) .catch(function (error) { log(error, 'warn'); }); }, 2000); globalTracklist = page.items[0].globalTracklist; } else if (v2Adapter == 'squeezeboxrpc' && existsObject([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join(''))) { let lmstracklist = JSON.parse(getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join('')).val); globalTracklist = lmstracklist; } else if (v2Adapter == 'sonos' && existsObject([page.items[0].adapterPlayerInstance, 'root.', page.items[0].mediaDevice, '.playlist_set'].join(''))) { let lmstracklist = getState([page.items[0].adapterPlayerInstance, 'root.', page.items[0].mediaDevice, '.queue'].join('')).val; lmstracklist = lmstracklist.replace(/\s*[\[{(].*?[)}\]]\s*/g, ''); let lmstracklistTemp = lmstracklist.split(', '); let trackList: string = '['; if (getState(page.items[0].adapterPlayerInstance + 'root.' + page.items[0].mediaDevice + '.current_type').val == 0) { for (let i = 0; i < lmstracklistTemp.length; i++) { let trackTemp = lmstracklistTemp[i].split(' - '); trackList = trackList + '{"id":"' + i + '","name":"' + trackTemp[0] + '","title":"' + trackTemp[1] + '"}'; if (i < lmstracklistTemp.length - 1) { trackList = trackList + ','; } } } trackList = trackList + ']'; if (Debug) log(trackList, 'info'); globalTracklist = trackList; } else if (v2Adapter == 'spotify-premium') { try { let tempTrackList = JSON.parse(getState(page.items[0].adapterPlayerInstance + 'player.playlist.trackListArray').val); globalTracklist = tempTrackList; } catch { log('Hello Mr. Developer something went wrong in tracklist!', 'debug'); } } else if (v2Adapter == 'mpd') { try { let tempTrackList = JSON.parse(getState(page.items[0].adapterPlayerInstance + 'playlist_list').val); globalTracklist = tempTrackList; } catch { log('Hello Mr. Developer something went wrong in tracklist!', 'debug'); } } if (globalTracklist != null && globalTracklist.length != 0) { trackListIconCol = rgb_dec565(HMIOn); trackListString = 'input_sel' + '~' + tid + '?tracklist' + '~' + Icons.GetIcon('animation-play-outline') + '~' + trackListIconCol + '~' + findLocale('media', 'tracklist') + '~' + 'media2~'; } // InSel/Slider EQ let equalizerListString: string = '~~~~~~'; let equalizerListIconCol = rgb_dec565(HMIOff); if (page.items[0].equalizerList != undefined) { equalizerListIconCol = rgb_dec565(HMIOn); equalizerListString = 'input_sel' + '~' + tid + '?equalizer' + '~' + Icons.GetIcon('equalizer-outline') + '~' + equalizerListIconCol + '~' + findLocale('media', 'equalizer') + '~' + 'media3~'; } else if (page.items[0].equalizerSlider != undefined && v2Adapter == 'alexa2') { equalizerListIconCol = rgb_dec565(HMIOn); equalizerListString = 'slider' + '~' + tid + '~' + Icons.GetIcon('equalizer-outline') + '~' + equalizerListIconCol + '~' + findLocale('media', 'equalizer') + '~' + 'media3~'; } else if (page.items[0].equalizerList == undefined && v2Adapter == 'sonos') { let equalizerListIconCol = rgb_dec565(HMIOn); //equalizerListString is used for favariteList equalizerListString = 'input_sel' + '~' + tid + '?favorites' + '~' + Icons.GetIcon('playlist-star') + '~' + equalizerListIconCol + '~' + findLocale('media', 'favorites') + '~' + '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 == 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); } } else if (v2Adapter == 'bosesoundtouch') { if (getState(id + '.REPEAT').val == 'REPEAT_ALL') { repeatIcon = Icons.GetIcon('repeat-variant'); repeatIconCol = rgb_dec565(HMIOn); } else if (getState(id + '.REPEAT').val == 'REPEAT_ONE') { repeatIcon = Icons.GetIcon('repeat-once'); repeatIconCol = rgb_dec565(HMIOn); } } else if (v2Adapter == 'squeezeboxrpc') { if (getState(id + '.REPEAT').val == 1) { repeatIcon = Icons.GetIcon('repeat-once'); repeatIconCol = rgb_dec565(HMIOn); } else if (getState(id + '.REPEAT').val == 2) { repeatIcon = Icons.GetIcon('repeat'); repeatIconCol = rgb_dec565(HMIOn); } } else if (v2Adapter == 'volumio') { /* Volumio: only Repeat true/false with API */ if (getState(id + '.REPEAT').val == true) { repeatIcon = Icons.GetIcon('repeat-variant'); repeatIconCol = rgb_dec565(HMIOn); } } else if (v2Adapter == 'mpd') { if (getState(id + '.REPEAT').val == true && getState(id + '.SINGLE').val == 0) { repeatIcon = Icons.GetIcon('repeat'); repeatIconCol = rgb_dec565(HMIOn); } else if (getState(id + '.REPEAT').val == true && getState(id + '.SINGLE').val == 1) { repeatIcon = Icons.GetIcon('repeat-once'); repeatIconCol = rgb_dec565(HMIOn); } } if (v2Adapter == 'spotify-premium' || v2Adapter == 'alexa2' || v2Adapter == 'sonos' || v2Adapter == 'bosesoundtouch' || v2Adapter == 'volumio' || v2Adapter == 'squeezeboxrpc' || v2Adapter == 'mpd') { repeatButtonString = 'button' + '~' + tid + '?repeat' + '~' + repeatIcon + '~' + repeatIconCol + '~' + 'Repeat' + '~' + 'media4'; } //popUp Tools let toolsString: string = '~~~~~~'; let toolsIconCol = rgb_dec565(colMediaIcon); if (v2Adapter == 'sonos' || v2Adapter == 'mpd') { if (page.items[0].crossfade == undefined || page.items[0].crossfade == false) { toolsString = 'input_sel' + '~' + tid + '?seek' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'seek') + '~' + 'media5~'; } else { toolsString = 'input_sel' + '~' + tid + '?crossfade' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'crossfade') + '~' + 'media5~'; } } else if (v2Adapter == 'squeezeboxrpc') { if (page.items[0].crossfade == undefined || page.items[0].crossfade == false) { toolsString = 'input_sel' + '~' + tid + '?seek' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'seek') + '~' + 'media5~'; } } else if (v2Adapter == 'spotify-premium') { if (page.items[0].crossfade == undefined || page.items[0].crossfade == false) { toolsString = 'input_sel' + '~' + tid + '?seek' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'seek') + '~' + 'media5~'; } } else { toolsString = 'button' + '~' + tid + '' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'tools') + '~' + 'media5~'; } out_msgs.push({ payload: 'entityUpd~' + //entityUpd name + '~' + //heading getNavigationString(pageId) + '~' + //navigation tid + '~' + //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 toolsString + speakerListString + playListString + trackListString + equalizerListString + repeatButtonString, }); } if (Debug) { log('GenerateMediaPage payload: ' + JSON.stringify(out_msgs), 'info'); } return out_msgs; } catch (err: any) { log('error at function GenerateMediaPage: ' + err.message, 'warn'); return []; } }Danke euch!
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden

