Weiter zum Inhalt

NEWS

  • Node.js 16.x neue Empfehlung für ioBroker

    Verschoben Installation
    2
    17 Stimmen
    2 Beiträge
    6k Aufrufe
    DutchmanD
    siehe : https://forum.iobroker.net/topic/64032/update-nodejs-best-practise-supported-14-16-und-18
  • SONOFF NSPanel mit Lovelace UI (TypeScript Version)

    Hardware lovelace ui nspanel sonoff
    8k
    12
    17 Stimmen
    8k Beiträge
    8m Aufrufe
    SmartStuffCoyoteS
    @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!
  • Test Adapter Awtrix-Light (Awtrix 3)

    Verschoben Tester
    2k
    17 Stimmen
    2k Beiträge
    1m Aufrufe
    H
    Gibt es ein Möglichkeit einen Pixel der Progress-Bar in einer anderen Farbe darzustellen? Hintergrund: So könnte ich beim Akku des eAutos nicht nur die aktuelle Beladung darstellen, sondern mit dem andersfarbigen Pixel auch den aktuellen Zielwert der Beladung (z.B. 80%)
  • JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen

    Verschoben Tester
    118
    8
    17 Stimmen
    118 Beiträge
    23k Aufrufe
    sigi234S
    @haus-automatisierung sagte in JavaScript 8.3.0 - Log-Trigger, File-Events und Warnungen: @sigi234 Ist schon auf GitHub erfasst, liegt an einem Core-Paket und ich warte gerade auf einen Fix Funktioniert wieder mit v8.6.0 Danke
  • ioBroker goes Matter ... Matter Adapter in Stable

    Announcements
    1
    17 Stimmen
    1 Beiträge
    2k Aufrufe
    Niemand hat geantwortet
  • Neues Video "KI im Smart Home" - ioBroker plus n8n

    Announcements
    1
    1
    17 Stimmen
    1 Beiträge
    4k Aufrufe
    Niemand hat geantwortet
  • Ich möchte mich mal bedanken

    ioBroker Allgemein vis
    9
    1
    16 Stimmen
    9 Beiträge
    3k Aufrufe
    ?
    @skokarl ja, das stimmt :-) meine Xiaomi's und die ganzen anderen Devices verwalte ich in ner langen Excelliste.. sonst verliert man den Überblick.. fast 370 Geräte.. da muss man schon wissen, wo welches connected ist, sonst sucht man sich n Wolf...
  • Test Adapter shuttercontrol v2.0.x

    Verschoben Tester rollladen rollladensteuerung shuttercontrol
    7k
    2
    16 Stimmen
    7k Beiträge
    11m Aufrufe
    G
    Ich habe mal noch eine Frage. Ich denke fast, dass wir das schon mal hatten, ich weiß aber nicht mehr wie es ausgegangen ist... Wenn eine Jalousie im Sonnenschutz ist, dann fährt sie runter. Wird jetzt das Fenster geöffnet, dann fährt die Jalousie hoch. Das Fenster bleibt offen bis die Sonne weg ist und die Jalousie damit eigentlich nicht mehr im Sonnenschutz ist. Wird dann das Fenster geschlossen, dann fährt die Jalousie trotzdem erst noch mal runter obwohl ja kein Sonnenschutz mehr ist -> das sollte eigentlich nicht so sein. Musste man das irgendwo einstellen?
  • Ein frohes Fest

    Off Topic weihnachten
    5
    16 Stimmen
    5 Beiträge
    628 Aufrufe
    dQeLseD
    Auch von mir schöne Weihnachten. Auf das wir Zeit finden weiter an unserem lieben Hobby zu werkeln :)
  • [Vorlage] MDCSS v2: ical Kalendar anzeigen

    Visualisierung vis material ui material css
    56
    3
    16 Stimmen
    56 Beiträge
    10k Aufrufe
    H
    @chaot Die Tage wo es keinen Termin zu gibt sollen auch angezeigt werden. Also in meinem Fall der 28, 30, 31, .... [image: 1703668970768-7997e083-d160-4a92-87e6-b6bf2b4b49b2-grafik.png] Eigentlich bin ich auf der Suche nach einem monatsweisen Zeilenkalender. [image: 1703669672126-d82a5fed-789a-4e0b-a9d4-c0f19fb65e11-grafik.png] Da habe ich mit dem MDCSS bislang die beste Lösung gefunden.
  • 16 Stimmen
    721 Beiträge
    209k Aufrufe
    JHxJ
    Hallo miteinander, ich habe vor ein paar Wochen schon mal angesetzt, das Script (DasWetter.js von Scrounger) auf den neuen ioB-Adapter DasWetter V4.0 anzupassen. Leider bin ich aus Zeitmangel nicht ganz fertig geworden. Es fehlten im neuen Adapter auch noch die Symbole. Zwischenzeitlich sind die Symbole impementiert worden und ich habe die *.js nun final darauf angepasst. VG JH DasWetter.js
  • 16 Stimmen
    220 Beiträge
    62k Aufrufe
    K
    @homoran Die Meßstellenbetreiber und die Digitalisierung .... Gibt es "schon" einen Zugang zum Portal? Sind dort die Meßwerte des iMSys abrufbar? Bei mir gibt es im Portal nur die Bezugsdaten und mit TRuDI nur die Einspeisedaten. Also ohne TRuDi nur ein Teil der Daten verfügbar. Und dazwischen gab es mal eine Woche Ausfall. Da fehlen Meßwerte und ich hatte auch keinen TRuDI Zugriff auf den Zähler.
  • Digital Detox

    Off Topic
    6
    16 Stimmen
    6 Beiträge
    2k Aufrufe
    apollon77A
    @mic Wäre cool wenn du deine Adater als eine Aktion ggf in die Cimmunity überführen könntest - siehe https://github.com/iobroker-community-adapters/info#add-git-repo-to-organization Im worst case mach nur die Github verschieberei und vergib die npm rechte ... und informiere mich gern ... dann übernehme ich den rest. SOnst können wir nur eine Fork der Projekte in die community machen, was aber immer bissl blöd ist falls Du mal wieder anfngst. Da muss man es dann wieder zurückbauen Danke
  • [Vorstellung] Shelly Style Widgets

    Visualisierung how-to own project template vis
    104
    26
    16 Stimmen
    104 Beiträge
    22k Aufrufe
    H
    Hallo zusammen, funktionieren die Widgets bei euch noch? Ich bekomme die bei mir nicht importiert, muss aber gestehen, dass ich es direkt in der Vis-2-beta probiere... Mir geht's speziell um den Shutter. Hat sich erledigt - in Vis 1 funktioniert der Import. Muss also an Vis-2 liegen.
  • Upgrade von Debian 10 'Buster' auf 11 'Bullseye'

    Off Topic
    309
    16 Stimmen
    309 Beiträge
    98k Aufrufe
    M
    @thomas-braun Ich habe immer brav alle Adapter mitgezogen und den Pi selber vegessen. :man-facepalming:
  • c't 20-2021

    ioBroker Allgemein
    27
    16 Stimmen
    27 Beiträge
    5k Aufrufe
    michl75M
    @lobito said in c't 20-2021: @michl75 said in c't 20-2021: Es gibt andere Anbieter, da kann man einen einzelnen Artikel kaufen und dann lesen... Ich bin gerade vollkommen fertig, dachte was schreibt der Typ denn. Bei c't gibt es doch die Artikel immer einzeln. Aber vor dem Post mal auf abmelden gedrückt (habe Abo) und Tatsache, Heise hat den Verkauf von einzelnen Artikeln eingestellt. Aber ich glaube wenn die Ausgabe nicht mehr aktuell ist (also in 2 Wochen) geht das wieder. ja das hat mich auch irritiert .....
  • 16 Stimmen
    2k Beiträge
    1m Aufrufe
    W
    @2hot4you sagte in Test Adapter Energiefluss v3.6.x GitHub/Latest: kann man irgendwo einstellen, dass der Hintergrund transparent ist ? Variante 1 https://forum.iobroker.net/post/1240986 Variante 2 https://forum.iobroker.net/post/1241095
  • Alexa 2 Nutzer der 3.19/20/21.x bitte auf 3.23.x Updaten!

    Announcements
    1
    16 Stimmen
    1 Beiträge
    2k Aufrufe
    Niemand hat geantwortet
  • Alexa2 Adapter 3.21.0 (Beta)

    ioBroker Allgemein
    170
    16 Stimmen
    170 Beiträge
    34k Aufrufe
    apollon77A
    Stable ist jetzt Alexa2 3.23.x ---> https://forum.iobroker.net/topic/60392/alexa2-version-3-23-1
  • JavaScript 7.11.0 - Neue Datei-Bausteine (lesen / schreiben)

    Verschoben Tester
    45
    6
    16 Stimmen
    45 Beiträge
    9k Aufrufe
    MartinPM
    Kann es nicht mehr nachvollziehen, jetzt klappt es ... javascript.0 2026-01-25 10:35:44.389 info script.js.Spielwiese.Test: readFile(adapter=0_userdata.0, fileName=test.txt) javascript.0 2026-01-25 10:35:44.389 info script.js.Spielwiese.Test: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 2026-01-25 10:35:44.655 error script.js.Spielwiese.Test: Error: Not exists at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.javascript/src/lib/sandbox.ts:4595:30) at processImmediate (node:internal/timers:487:21) javascript.0 2026-01-25 10:35:44.655 info script.js.Spielwiese.Test: writeFile(adapter=0_userdata.0, fileName=test.txt) Womöglich hätte ich im FIles-View von ioBroker nur "aktualisieren" drücken müssen - peinlich .... [image: 1769334916977-a9bef577-49b5-4d6a-ba58-9aa8d0f1fb7e-grafik.png]

641

Online

32.9k

Benutzer

83.2k

Themen

1.3m

Beiträge