Weiter zum Inhalt

Hardware

5.6k Themen 87.8k Beiträge

Hardware für ioBroker oder Einbindung von Hardware in ioBroker

NEWS

  • SONOFF NSPanel mit Lovelace UI (TypeScript Version)

    lovelace ui nspanel sonoff
    8k
    12
    17 Stimmen
    8k Beiträge
    7m 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!
  • Smartes EV Ladegerät 3,6kW - ioBroker - PV Überschussladen

    23
    0 Stimmen
    23 Beiträge
    2k Aufrufe
    M
    @axled Danke für die Bereitstellung der Erklärung der Datenpunkte VG Mike
  • Growatt MID via Modbus PV an Nibe S320

    nibe growatt s320 mid17ktl3-x dtsu666
    1
    0 Stimmen
    1 Beiträge
    18 Aufrufe
    Niemand hat geantwortet
  • lokales Auslesen von Daikin Altherma

    Verschoben
    28
    2
    0 Stimmen
    28 Beiträge
    781 Aufrufe
    mcm1957M
    @homoran Dieser Beitrag betrifft eigentlich KEINEN Adapter. Sollte das nicht eher und Einbindung von Geräten angesiedelt sein? Der Tester Bereich betrifft doch TEST VON ADAPTERN. Und das trifft m.E. hier nicht zu...
  • Growatt SPH - Fragen zu OpenInverterGateway

    1
    0 Stimmen
    1 Beiträge
    29 Aufrufe
    Niemand hat geantwortet
  • Wer hat die neue Reolink CX810?

    30
    0 Stimmen
    30 Beiträge
    3k Aufrufe
    wendy2702W
    Ok. Dann liegt es wohl am restlicht. Heute Abend mal schauen wie hell die dann leuchtet.
  • Wasserzähler Hydrus 2.0 von Diehl

    164
    0 Stimmen
    164 Beiträge
    44k Aufrufe
    conectasC
    @Thomas-Braun sagte: Dürfte vermutliche (Rest)-Lebensdauer der Batterie beschreiben. Denke ich auch, um so schöner wäre es eben den Wert auch in IOB zu haben.
  • It does not MATTER

    1
    0 Stimmen
    1 Beiträge
    58 Aufrufe
    Niemand hat geantwortet
  • Blink Camera System

    blink xt camera
    407
    0 Stimmen
    407 Beiträge
    130k Aufrufe
    PischleuderP
    Guten Morgen, ich habe mich einmal an eine Weiterentwicklung gewagt - ggf. ist das etwas für Euch ? KLICK
  • Smarter MID zertifizierter Zähler

    24
    0 Stimmen
    24 Beiträge
    727 Aufrufe
    HomoranH
    @David-G. sagte: Darfst gerne einen anderen vorschlagen (der nicht viel größer ist). Wüsste ich auch gern 😀 @David-G. sagte: War quasi der nächstbeste wo ich mir sicher war, dass alles passt. Bis auf den Preis, sonst hätte ich hier [image: 1776358054190-113.jpg] jetzt mindestens 3 SDM72 weniger und dafür 4/8 sdm54 Die Daten vom sdm54 klingen super
  • ZBT-2 mit IoBroker

    19
    0 Stimmen
    19 Beiträge
    538 Aufrufe
    M
    Vielen Dank für deine Antwort! Ich hab noch einiges aufzuholen was Zigbee betrifft. Gibt es vielleicht irgendwo eine gute Quelle, wo man sich gut reinlesen kann? Ich will mich wirklich nicht beschweren, was ihr da auf die Beine gestellt habt ist echt super. Nur leider ist die Doku von dem Zigbee Adapter recht knapp. Mir fehlen so viele Grundlagen. Wie z.B.: Warum gibt es bei iobroker zwei Adapter Zigbee2MQTT und nur Zigbee. Dann kommt da noch der Sonoff drauf der eigentlich Tasmota ist?! Gibt es da irgendwo was zum rein finden? Warum ist mein Gerät ein EZSP basierter Koordinator? Was ist der beste Adapter für Zigbee? Du musst mir die ganzen Fragen jetzt nicht beantworten. Es geht mehr darum eine Quelle für die Infos zu finden.
  • [gelöst] Jeelink-Adapter 1.2.8 stürzt ab

    3
    0 Stimmen
    3 Beiträge
    44 Aufrufe
    I
    Oh Wunder, hat funktioniert! Vielen Dank für Deine Hilfe!
  • defekter Shelly hat mir mein WLAN + ZIGBEE maßiv gestört

    3
    2 Stimmen
    3 Beiträge
    100 Aufrufe
    mcm1957M
    Danke f.d. Info Einziges (persönliches Problem) selbst mit Hörgerät werd ich ein Fiepen nicht mehr wahrnehmen. Aber ev. hilft es ja die Katze zu beobachten :-)
  • iobroker auf Synology M2 möglich?

    3
    0 Stimmen
    3 Beiträge
    138 Aufrufe
    capitaenzC
    @mika-0 Ich habe zwei 920+ im Einsatz. Eine für den VMM mit 20 GB Ram. Darauf läuft der ioBroker, Raspberrymatic (Open CCU), pihole und Deconz. Allerdings ohne M.2, weil der ioBroker bereits auf SSDs im Raid läuft. Soweit ich weiß, kann man jetzt die M.2 auch als Volume benutzen, allerdings ist die Kühlung schlecht und die M.2 können nicht im laufenden Betrieb getauscht werden.
  • Airthings Wave Plus per MQTT einbinden

    1
    0 Stimmen
    1 Beiträge
    29 Aufrufe
    Niemand hat geantwortet
  • Rolladenantrieb / Gurtwickler

    36
    -1 Stimmen
    36 Beiträge
    7k Aufrufe
    malorossM
    @dragon danke für die Rückmeldung; gerade wo Umbau nicht möglich ist, wären die Gurtwickler schon eine Option. Ich schau mir das mal näher an.
  • Siemens Logo!8 Netzwerkausgang an S7 Adapter

    2
    4
    0 Stimmen
    2 Beiträge
    60 Aufrufe
    P
    Die Objekt ID sieht verdächtig aus. Die sollte doch mit s7. anfangen.
  • ESP32 Tasmota Ton Frequenz Hz messen

    2
    0 Stimmen
    2 Beiträge
    60 Aufrufe
    MartinPM
    Ich glaube, das ist schon recht viel Arbeit für den armen kleinen ESP32 FFT Samples aufnehmen (Wahrscheinlich nur Bruchteile von Sekunden möglich) Diese Samples Audio per FFT in ein Spektrum umwandeln (Dauert womöglich deutlich länger, als (1) ) Spektrum auswerten und darstellen (Alarme auslösen?) Zyklus bei (1) neu beginnen. Dann überwacht man zwar nicht lückenlos, aber schaut zyklisch nach dem Rechten https://projecthub.arduino.cc/abhilashpatel121/easyfft-fast-fourier-transform-fft-for-arduino-03724d https://forum.arduino.cc/t/fft-analysis-with-microphone-max9814-using-arduinofft-library/1317647
  • Modul MQTT to Analog out gesucht, selbst gebaut

    29
    0 Stimmen
    29 Beiträge
    668 Aufrufe
    ubeckerU
    @MartinP sagte: Leider ist man da nicht weniger Abhängig von der Programmierarbeit anderer ist so, war auch mein größtes Problem mit der Arduino IDE, die passenden Librarys zu finden.
  • Kauf neuer Rauchmelder

    rauchmelder vibrationsensor
    24
    0 Stimmen
    24 Beiträge
    3k Aufrufe
    ubeckerU
    @IOMax sagte: Gibt es da etwas empfehlenswertes am Markt ich nutze diese https://de.elv.com/p/hmip-set-rauchwarnmelder-3x-swsd-2-P254404/?itemId=254404 lassen sich über IOBroker auslesen steuern, tests machen, und als Alarmmeldung benutzen. sollen 10 Jahre halten. Dazu kann ich noch nichts sagen, meine sind erst 3 Jahre in Betrieb.

317

Online

32.8k

Benutzer

82.8k

Themen

1.3m

Beiträge