Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Off Topic
  4. Volumio adapter?

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.5k

Volumio adapter?

Geplant Angeheftet Gesperrt Verschoben Off Topic
75 Beiträge 10 Kommentatoren 9.2k Aufrufe 7 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • F Farmer-cb

    @muellerra ja, hätte interesse

    M Offline
    M Offline
    muellerra
    schrieb am zuletzt editiert von muellerra
    #50

    Hi, @farmer-cb , entschuldige die späte Rückmeldung, da ist irgendwas mit meinen Benachrichtigungseinstellunge schief gelaufen...

    Anbei einmal die Skripte. Gleich vorneweg: Sollten die IP-Adresse ungleich 192.168.178.XXX sein, oder der Ordner ein anderer als bei mir ( javascript.0.Allgemeine_Variablen.Player.Volumio_Player_*) sein -> bitte per suchen und ersetzen anpassen.
    Der ping Adapter muss ebenfalls installiert sein -> in Zeile 601 (if(getState('ping.1.rrBroker.' + Volumios[ID_Volumio]).val){) bitte ping.1.rrBroker. entsprechend der installierten ping Instanz und dem entsprechenden iobroker-Hostnamen ersetzen. Das Gerät im ping Adapter muss genauso benannt sein, wie es in Zeile 8:

    var Volumios = ["rStream","workStream","kitchenStream","flurStream"] 
    

    definiert ist. (Bei mir ping.1.rrBroker.workStream). Wer im ping Adapter die erweiterten Infos verwendet muss ein .alive anhängen:

    if(getState('ping.<instance>.<iobrokerHostName>.' + Volumios[ID_Volumio] + '.alive').val){
    

    Hier ist das Hauptskript:

    /// Read out volumio via rest api
    var request = require('request');
    var querystring = require('querystring');
    var pollingInterval = 500//in ms
    
     
    var Folder = 'javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' // 
    var Volumios = ["rStream","workStream","kitchenStream","flurStream"]  //muss in beiden Skripten identisch sein
    var Volumios_IPs = ["82","58","48","72"] //192.168.178 wird dann im Skript hart gesetzt -> ggf. abändern! Reihenfolge der IPs muss mit den drüber definierten Namen übereinstimmen!
    
    
    
    
    var getStates_States_with_RawValues = ['samplerate','bitdepth','title','bitrate']
    var getStates_States_wo_RawValues = ['status','artist','album','albumart','uri','trackType','duration','seek','service','channels','consume','volume','dbVolume','mute','disableVolumeControl','stream','volatile', 'updatedb','trackType','random','position','repeatSingle','repeat']
    var getStates_States = getStates_States_wo_RawValues.concat(getStates_States_with_RawValues)
    
      
    //States erstellen
    // ToDo -> states nur erstellen wenn sie nicht exisitieren
     for (ID_Volumio in Volumios){  
        createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroom',false ,{"role": "indicator", "name": "indicates player in multiroom mode", "type": "boolean", "read": true, "write": true })           
        createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomPlaying',false ,{"role": "indicator", "name": "indicates player in multiroom mode", "type": "boolean", "read": true, "write": true })           
        createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomSender', false,{"role": "indicator", "name": "indicates player in Sender multiroom mode", "type": "boolean", "read": true, "write": true })           
        createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver', false,{"role": "indicator", "name": "indicates playerstate in Receiver multiroom mode", "type": "boolean", "read": true, "write": true })           
        createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromName', "",{"role": "text", "name": "indicates multiroom mode Mother", "type": "string", "read": true, "write": true })           
        createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromID', 99,{"role": "value", "name": "indicates multiroom mode Mother", "type": "number", "read": true, "write": true })           
    
        for (Stati in getStates_States){ 
            var field = getStates_States[Stati]   
            if(field == "updatedb"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "updatedb", "type": "boolean", "read": true, "write": true })           
            }
            if(field == "trackType"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "Type of current track (flac/mp3/acc/..)", "type": "string", "read": true, "write": true })           
            }
            if(field == "random"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "Repeat playlist activated", "type": "boolean", "read": true, "write": true })           
            }
            if(field == "repeatSingle"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.state", "name": "Repeat current track activated", "type": "boolean", "read": true, "write": true })           
            }
            if(field == "position"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.track", "name": "Position in playlist of current track-start at 0", "type": "number", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Corrected', {"role": "media.track", "name": "Position in playlist of current track-start at 1", "type": "number", "read": true, "write": true })           
            }
            if(field == "repeat"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.mode.repeat", "name": "Repeat playlist activated", "type": "boolean", "read": true, "write": true })           
            }    
            if(field == "status"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.state", "name": "Playback status", "type": "string", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'LastValue', {"role": "media.state", "name": "Playback status Last Value", "type": "string", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'IncomingCall', {"role": "media.state", "name": "Playback status Call is incoming", "type": "string", "read": true, "write": true })           
            }
            if(field == "title"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.title", "name": "Title of current track", "type": "string", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw', {"role": "media.title", "name": "Title of current track", "type": "string", "read": true, "write": true })           
            }
            if(field == "artist"){ 
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.artist", "name": "Artist of current track", "type": "string", "read": true, "write": true })           
            }                
            if(field == "album"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.album", "name": "Album of current track", "type": "string", "read": true, "write": true })           
            }
            if(field == "albumart"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.cover", "name": "Cover url of current track", "type": "string", "read": true, "write": true })           
            }  
            if(field == "uri"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.url", "name": "rl of current track", "type": "string", "read": true, "write": true })           
            } 
            if(field == "trackType"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "Type of current track (flac/mp3/acc/..)", "type": "string", "read": true, "write": true })           
            } 
            if(field == "seek"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.seek","unit":"ms", "name": "Seek position of current track", "type": "number", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_percent', {"role": "media.seek","unit":"%", "name": "Seek position of current track", "type": "number", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_s', {"role": "media.seek","unit":"s", "name": "Seek position of current track", "type": "number", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss', {"role": "text", "name": "Seek position of current track", "type": "string", "read": true, "write": true })           
            } 
            if(field == "duration"){ 
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.duration","unit":"s", "name": "Duration of current track", "type": "number", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_ms', {"role": "media.duration","unit":"ms", "name": "Duration of current track", "type": "number", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss', {"role": "text", "name": "Duration of current track", "type": "string", "read": true, "write": true })           
    
            }
            if(field == "samplerate"){  
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field,          {"role": "string", "name": "samplerate of current track", "type": "string", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw',  {"role": "media.samplerate", "name": "raw samplerate of current track ", "type": "number", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw2', {"role": "media.samplerate", "name": "raw samplerate of current track ", "type": "string", "read": true, "write": true })           
            }
            if(field == "bitrate"){  
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field,          {"role": "string", "name": "bitrate of current track", "type": "string", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw',  {"role": "media.bitrate", "name": "raw bitrate of current track ","unit":'kbps', "type": "number", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw2', {"role": "media.bitrate", "name": "raw bitrate of current track ", "type": "string", "read": true, "write": true })           
            }
            if(field == "bitdepth"){  
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "bitdepth  of current track", "type": "string", "read": true, "write": true })           
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw', {"role": "media.bitdepth", "name": "raw bitdepth  of current track", "unit": "bit", "type": "number", "read": true, "write": true })           
            }
            if(field == "channels"){  
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "value", "name": "channels of current track", "type": "number", "read": true, "write": true })           
            }
            if(field == "consume"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "consume", "type": "boolean", "read": true, "write": true })           
            }
            if(field == "volume"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "level.volume", "name": "volume in percent", "unit": "%","type": "number", "read": true, "write": true })           
            }
            if(field == "dbVolume"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "level.volume", "name": "volume in dB", "unit": "dB","type": "number", "read": true, "write": true })           
            }
            if(field == "mute"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.mute", "name": "muted status", "type": "boolean", "read": true, "write": true })           
            }
            if(field == "disableVolumeControl"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "Shuffle  playmode activated", "type": "boolean", "read": true, "write": true })           
            }
            if(field == "stream"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "stream", "type": "string", "read": true, "write": true })           
            }
            if(field == "volatile"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "volatile", "type": "boolean", "read": true, "write": true })           
            }
            if(field == "service"){
                createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "service where playback is from", "type": "string", "read": true, "write": true })           
            }
        }
    }
     
    //------------ get Informations per intervall -------------------------
    
        var timer
        var intervall
        clearTimeout(timer)
        clearInterval(intervall)
                timer = setTimeout(function () {
                    timer = null;
                    intervall= null;
                    clearTimeout(timer);
                clearInterval(intervall);
    
                    intervall = setInterval(getVolumioStates, pollingInterval, Volumios_IPs )
                }, 1000 * 3); //10 sekunden dieder motion sensor noch braucht zum zurücksetzen sind aufzuaddieren
                
    //------------ get Informations per intervall -------------------------
    
    
     //------------------ create listener for raw values ------------------- 
     var getStates_States_with_RawValuesWithAddListeners = getStates_States_with_RawValues.concat(['status','channels'])
     for (ID_Volumio in Volumios_IPs){ 
      for (Stati in getStates_States_with_RawValuesWithAddListeners){
    
    on({id: Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + getStates_States_with_RawValuesWithAddListeners[Stati], change: 'any'}, function (obj) {
                var value = obj.state.val;
                var oldValue = obj.oldState.val
                var Verursacher = obj.id;
                var StateName = getIDofState(obj.id)
                var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
                //untescheidung nach kHz mHz!
                if (StateName == 'title'){
                    
                    splitted = value.split(' ')
                    firstIsNumber = typeof(parseFloat(splitted[0]))
                    if(typeof(parseFloat(splitted[0])) == "number"){
                        firstIsNumber = true
                    }else{firstIsNumber=false}
                    if(splitted[1] == "-"){
                        secondStrich = true
                    }else{secondStrich=false}
                if(firstIsNumber === true && secondStrich === true){
                delete splitted[1]
                delete splitted[0]
                result = splitted.join(' ')
                }else{result = value}
                    setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw', result)
                }else if (StateName == 'status'){
                 
                var StatusOldValue = getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName).val
                setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'LastValue',oldValue)
                       
    
    
                       
                }else if (StateName == 'channels'){   
                        setState(Folder + String(parseInt(ID_Volumio_Verursacher)) + '.Infos.Audio.Source_Channels', parseFloat(value))                   
                }else if (StateName == 'bitrate'){
                                    log(ID_Volumio_Verursacher + ": Receiving: " + getState(Folder+ID_Volumio_Verursacher+'.playbackInfo.multiroomReceiver').val)
    
                    if(String(value).toLowerCase().includes('kbps')){
                        result = parseFloat(value)
                        setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', result + ' kbps')
    
                    }else{result = 0
                        setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', 'notAvailable')
    
                    }
                }else if (StateName == 'bitdepth'){
                    
                    var BitDepthTemp = parseFloat(value)
    
                    
                    result = BitDepthTemp
                    var SampleRateTemp = getState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate').val
                    var ServiceTemp = getState(Folder + ID_Volumio_Verursacher + '.playbackInfo.service').val
                    
                    if((BitDepthTemp > 16 || SampleRateTemp > 48000) && ServiceTemp != 'multiroom' ){
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',true)
                        
                    }else{
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',false)
                        
                    }
                    
                    setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepth', parseFloat(value))
                    if(value == 'notAvailable'){                                  
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepthDisplay', 'notAvailable')
                    }else{
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepthDisplay', String(value))
                    }
     
     
    
                }else if (StateName == 'samplerate'){
                   
                    var SampleRateTemp = parseFloat(value)
    
                    var BitDepthTemp = getState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepth').val
                    var ServiceTemp = getState(Folder + ID_Volumio_Verursacher + '.playbackInfo.service').val
                    log("BitDepthTemp 2:" + BitDepthTemp)
    
                    if((BitDepthTemp > 16 || SampleRateTemp > 48000) && ServiceTemp != 'multiroom'){
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',true)
                    }else{setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',false)}
    
                    if(String(value).toLowerCase().includes('khz')){
                        result = parseFloat(value)*1000
                        setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', result/1000 + ' kHz')
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRateDisplay', result/1000 + ' kHz')
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate', result)
    
                    }
                    else if(String(value).toLowerCase().includes('mhz')){
                        result = parseFloat(value)*1000000 
                        setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', result/1000000 + ' MHz')
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRateDisplay', result/1000000 + ' MHz')
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate', result)
    
                    }else if(String(value).toLowerCase().includes('kbps')){
                        result = parseFloat(value) 
                        setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', result + ' kbps')
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRateDisplay', result + ' kbps')
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate', 0)
    
    
                    }else if(value == null||value == 'null' ||value == 'undefined' || value == undefined||value == 'notAvailable'){ 
                        result = 0
                        setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', 'notAvailable')
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRateDisplay', 'notAvailable')
                        setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate', 0)
                    }else{result = parseFloat(value)} 
    
    
    
                }else{
                    result = parseFloat(value)
    
                }
    
    
        if (StateName != 'service' && StateName != 'status' && StateName != 'channels'){
                setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw', result)
               
        }
        
    
        
        });
    
    
        }
      }
     //------------------ create listener for raw values ------------------- 
    
       
     // ------------------ states for control ------------------------
     
     var Buttons_Control = ['next','previous','play','pause','stop','mute','unmute','mute_toggle','PlayPause','PlayPause_controlFolder','volume_up','volume_down','removeAsReceiver','removeAllReceiver']
    var VolumioAPIString1 = "http://"
    var VolumioAPIStringCommand = "/api/v1/commands/?cmd="
    
     for (ID_Volumio in Volumios_IPs){ 
    
         var FolderPlayer = Folder + String(parseInt(ID_Volumio))
        var FolderControl = FolderPlayer + '.control'
    
        for (iter in Buttons_Control){
           // console.log(iter)
            if (Buttons_Control[iter] == "VolumeControl_ID"){
    
                createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"value", type: "string",name: Buttons_Control[iter]    })
                setState(FolderControl+'.'+Buttons_Control[iter],false)
        }else  if (Buttons_Control[iter] == "Volume"){
                createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"value", type: "number",name: Buttons_Control[iter]    })
                setState(FolderControl+'.'+Buttons_Control[iter],false)
        }else  if (Buttons_Control[iter] == "removeAsReceiver"){
                createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"button", type: "boolean",name: 'Remove pi from multiroom if pi is a Receiver'    })
                setState(FolderControl+'.'+Buttons_Control[iter],false)
        }else  if (Buttons_Control[iter] == "removeAllReceiver"){
                createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"button", type: "boolean",name: 'Remove all Receiver Pis from receiving'    })
                setState(FolderControl+'.'+Buttons_Control[iter],false)
        }else  if (Buttons_Control[iter] == "PlayPause"){
                createState(FolderPlayer+'.'+Buttons_Control[iter],false, {role:"button", type: "boolean",name: Buttons_Control[iter] + ' Toggle'    })
                setState(FolderPlayer+'.'+Buttons_Control[iter],false)
        }
            else{
            createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"button", type: "boolean",name: Buttons_Control[iter]    })
            setState(FolderControl+'.'+Buttons_Control[iter],false)
            }
        }
    
    
        on({id: FolderControl+'.'+Buttons_Control[0], change: 'ne'}, function (obj) {    // next
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
            if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ // sicherehits auf länge
                ID_Volumio_Verursacher = ID_Multiroom_Temp
            }
            if(value === true){   
                //do something
                var command = "next"
                var URL = VolumioAPIString1 +   '192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[1], change: 'ne'}, function (obj) {    // previous
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
            if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ 
                ID_Volumio_Verursacher = ID_Multiroom_Temp
            }
            if(value === true){   
                //do something
                var command = "prev"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                httpRequest_wo_return(URL)
    
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[2], change: 'ne'}, function (obj) {    // play
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
            if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){
                ID_Volumio_Verursacher = ID_Multiroom_Temp
            }
            if(value === true){   
                //do something
                var command = "play"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[3], change: 'ne'}, function (obj) {    // pause
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
            if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ 
                ID_Volumio_Verursacher = ID_Multiroom_Temp
            }
            if(value === true){   
                //do something
                var command = "pause"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[4], change: 'ne'}, function (obj) {    // stop
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            if(value === true){   
                //do something
                var command = "stop"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[5], change: 'ne'}, function (obj) {    // mute
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            if(value === true){   
                //do something
                var command = "volume&volume=mute"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[6], change: 'ne'}, function (obj) {    // unmute
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            if(value === true){   
                //do something
                var command = "volume&volume=unmute"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[7], change: 'ne'}, function (obj) {    // mute_toggle
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            if(value === true){   
                //do something
                var MuteStateTemp = getState(Folder + String(ID_Volumio_Verursacher) + '.playbackInfo.mute').val 
                if (MuteStateTemp === false || MuteStateTemp == "false"){
                    //muten
                    var command = "volume&volume=mute"
                }else if (MuteStateTemp === true || MuteStateTemp == "true"){
                    //unmuten
                    var command = "volume&volume=unmute"
                }
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderPlayer+'.'+Buttons_Control[8], change: 'any'}, function (obj) {    // PlayPause //ACHTUNG HIER ANDERER ORDNER IM LISTENER
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio_noSubfolder(obj.id,Volumios) // ACHTUNG HIER ANDERE FUNKTION, DA ICH IN ANDEREM ORDNER UNTERWEGS BIN
            var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
            if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ // sicherehits auf länge
                ID_Volumio_Verursacher = ID_Multiroom_Temp
            }        if(value === true){   
                //do something
                var command = "toggle"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                log(URL)
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[9], change: 'ne'}, function (obj) {    // PlayPause_controlFolder
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
            if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ // sicherehits auf länge
                ID_Volumio_Verursacher = ID_Multiroom_Temp
            }
            if(value === true){   
                //do something
                setState(Folder + String(ID_Volumio_Verursacher) + '.PlayPause',true)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[10], change: 'ne'}, function (obj) {    // volume_up
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            if(value === true){   
                //do something
                var command = "volume&volume=plus"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                log(URL)
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
        on({id: FolderControl+'.'+Buttons_Control[11], change: 'ne'}, function (obj) {    // volume_down
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            if(value === true){   
                //do something
                var command = "volume&volume=minus"
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                log(URL)
                httpRequest_wo_return(URL)
                setState(Verursacher,false)
            }
        });
    
        on({id: FolderControl+'.'+Buttons_Control[12], change: 'ne'}, function (obj) {    // removeAsReceiver
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            var IsPiReceiving = getState(Folder + ID_Volumio_Verursacher + '.playbackInfo.multiroomReceiver').val
            if(value === true){   
                //do something
                if(IsPiReceiving){
                    var command = "stop"
                    var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                    log(URL)
                    httpRequest_wo_return(URL)
                }
                setState(Verursacher,false)
            }
        });
    
        on({id: FolderControl+'.'+Buttons_Control[13], change: 'ne'}, function (obj) {    // removeAllReceiver
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
            var ReceivingVolumios = getVolumiosReceiving([],true)        
            if(value === true){   
                //do something
                for(PiToKill in ReceivingVolumios){
                    var command = "stop"
                    var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ReceivingVolumios[PiToKill]] + VolumioAPIStringCommand + command
                    log(URL)
                    httpRequest_wo_return(URL)
                }            
                setState(Verursacher,false)
            }
        });
    
        on({id: Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + getStates_States[11] , change: 'ne'}, function (obj) {    // volume (in folder playbackinfo)
            var value = obj.state.val;
            var oldValue = obj.oldState.val;
            if(value != oldValue){
                var NewVolume = value
                var Verursacher = obj.id;
                var StateName = getIDofState(obj.id)
                var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
                var command = "volume&volume=" + parseInt(NewVolume)
                var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                log(URL)
                httpRequest_wo_return(URL)
            }
        });
    
     }
    
     // ------------------ states for control ------------------------
    
    
    //set Resetz hiRes in multiroom verbund
     for (ID_Volumio in Volumios_IPs){ 
        on({id: Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver', change: 'any'}, function (obj) {
            var value = obj.state.val;
            var oldValue = obj.oldState.val
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
    
            var IsChildTemp = value
            var ServiceTemp = getState(Folder + ID_Volumio_Verursacher + '.playbackInfo.service').val
    
            var BitDepthTemp = getState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepth').val
            var SampleRateTemp = getState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate').val
            log("BitDepthTemp 3:" + BitDepthTemp)
            log("IsChildTemp 3:" + IsChildTemp)
    
            //if((BitDepthTemp > 16 || SampleRateTemp > 44100) && IsChildTemp === false && ServiceTemp != 'multiroom'){//&& getState(Folder+ID_Volumio_Verursacher+'.playbackInfo.multiroomReceiver').val === false){
            if((BitDepthTemp > 16 || SampleRateTemp > 48000) && IsChildTemp === false && ServiceTemp != 'multiroom'){//&& getState(Folder+ID_Volumio_Verursacher+'.playbackInfo.multiroomReceiver').val === false){
                setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',true)
            }else{
                setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',false)
            }
    
    
        });
    }
    
    function extract(JSONvariable,fieldname) {
        return getAttr((function () { try {return JSON.parse(JSONvariable);} catch(e) {return {};}})(), fieldname)
    } 
    
    function restapiRequest(ip,command,ID_Volumio) { //sendet ssh befehl an moodeaudio muss ich eigentlich auf zertifikat umstellen
        var url = 'http://' + ip + '/api/v1/' + command
    
        if(getState('ping.1.rrBroker.' + Volumios[ID_Volumio]).val){
            try {
                require("request")(url, async function (error, response, result) {
                if(error != null){
                    if(String(error).includes('read ECONNRESET') || String(error).includes('connect EHOSTUNREACH 192.168.178.') || String(error).includes('connect ECONNREFUSED 192.168.178.')){
                        log("ERROR Volumio: " + error)
                        return;
                    }   
                }
                  //  log(getStates_States)
                 // log(ID_Volumio + 'is receiver ' + getState(Folder + ID_Volumio + '.playbackInfo.multiroomReceiver').val)
              
    
                if(command == "getState"){   
                        for (Stati in getStates_States){
                            var field = getStates_States[Stati]
                           // log(field)
                            var value = extract(result,field)                     
                            if (field == 'channels'){
                    
                            }
                            
                            if (field == 'bitrate'){
                              //  log("Bitrate: " + value)
                            }
                            if (field == 'position'){
                    
                                setState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Corrected', parseInt(value)+1)
                            }
                            if (field == 'seek'){
                    
                                var TrackDurationTemp = parseFloat(getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'duration').val )
                                    var elapsed_sec = parseFloat(value)/1000
                                    var elapsedPercent = Math.round(100*(elapsed_sec/TrackDurationTemp)* 100)  * 0.01
                                    
                                    var elapsedMM = parseInt(elapsed_sec/60)
                                    var elapsedSS = parseInt(elapsed_sec) - 60*elapsedMM   
                                    var elapsedMM_string = String(elapsedMM)
                                    var elapsedSS_string = String(elapsedSS)
                                    if(elapsedMM_string.length == 1){elapsedMM_string = '0'+elapsedMM_string}                        
                                    if(elapsedSS_string.length == 1){elapsedSS_string = '0'+elapsedSS_string}                        
                                    var elapsedMMSS = elapsedMM_string + ':' + elapsedSS_string
    
    
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_s', elapsed_sec)
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_percent', elapsedPercent)
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss', elapsedMMSS)
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_percent',elapsedPercent)
                                            
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss',elapsedMMSS)
                            
                            }
                            if (field == 'duration'){
                                    var duration_sec = parseFloat(value)
                                    var duration_ms = duration_sec*1000
    
                                    var durationMM = parseInt(duration_sec/60)
                                    var durationSS = parseInt(duration_sec) - 60*durationMM   
                                    var durationMM_string = String(durationMM)
                                    var durationSS_string = String(durationSS)
                                    if(durationMM_string.length == 1){durationMM_string = '0'+durationMM_string}                        
                                    if(durationSS_string.length == 1){durationSS_string = '0'+durationSS_string}                        
                                    var durationMMSS = durationMM_string + ':' + durationSS_string
                    
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss', durationMMSS)
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_ms',duration_ms)
                                //nur setzen wenn es eine änderung gab
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss',durationMMSS)
                                
                            
                                
                            }
                            if (field == 'albumart'){
                                try{
                                if(value.includes('http') === true){
                                    var CoverURL = value
                                }else{
                                    var CoverURL = 'http://' + ip + value
                                }
                                setState(Folder + String(ID_Volumio) + '.Infos.Audio.CoverArt',CoverURL)
                                }catch(e){}
                            }
                            if (field == 'service'){ //Service muss immer gesetzt werden! umd multiroom status zu erhalten
    
        // ------------------ Multiroom Handling v2 ---------------------------------------
                            //erst mutter dann kinder herausfinden, kann im zweifel 2 sekunden dauern
                            //funktioniert nur wenn ein multiroom verbund vorhanden ist, ansonsten kommt kp was raus
                            var CurrentTrackOnCurrentPi = getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'title').val
                            var CurrentAlbumOnCurrentPi = getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'album').val
                            var CurrentServiceOnCurrentPi = getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'service').val
                            var CurrentStatusOnCurrentPi = getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'status').val
    
                            if(String(value).toLowerCase().includes('multiroom') == false){
                                // Fall 1: Sender
                                //vergleichen ob ein anderer PI das gleiche abspielt und in multiroom betrieb ist, dann ist pi == mother
    
                                var CurrentSender = ''
                                var CurrentSenderID = parseInt(99)
                                var CurrentReceiver = ''
                                var CurrentReceiverID = parseInt(99)
    
                                for (ID_VolumioSearch in Volumios){
                                    if(ID_VolumioSearch != ID_Volumio){
                                        var CurrentTrackOnOtherPi = getState(Folder +  String(parseInt(ID_VolumioSearch))  + '.playbackInfo.' + 'title').val
                                        var CurrentAlbumOnOtherPi = getState(Folder +  String(parseInt(ID_VolumioSearch))  + '.playbackInfo.' + 'album').val
                                        var CurrentServiceOnOtherPi = getState(Folder +  String(parseInt(ID_VolumioSearch))  + '.playbackInfo.' + 'service').val
                                        var CurrentStatusOnOtherPi = getState(Folder +  String(parseInt(ID_VolumioSearch))  + '.playbackInfo.' + 'status').val
                        
    
                                        if (CurrentStatusOnCurrentPi == CurrentStatusOnOtherPi && CurrentTrackOnCurrentPi == CurrentTrackOnOtherPi && CurrentServiceOnOtherPi == 'multiroom'){ // == -> ID_Volumio = mother; ?? -> receiver
                                            CurrentSender = Volumios[ID_Volumio]
                                            CurrentSenderID = parseInt(ID_Volumio)
                                            CurrentReceiver = Volumios[ID_VolumioSearch]
                                            CurrentReceiverID = parseInt(ID_VolumioSearch)
                                        
                                            //  log('CurrentServiceRefreshed: ' + Volumios[ID_Volumio])
    
                                            //nochmals gegenprüfen ob son von möglichen müttern auch auf anderen wiedergegeben wird! 
                                            //nur schreiben wenn sich was ändert!!!! und auch zurücksetzen
                                            setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroom',true)
                                            setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'multiroom',true)
                                            setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'multiroomSender',true)
                                            setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomReceiver',true)
                                            setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomReceivingFromID',CurrentSenderID)
                                            setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomReceivingFromName',CurrentSender)
    
    
                                            
                                            //und in abfrage abfangen, dass diese infos nicht gesetzt werden wenn er receiver ist
    
    
    
                                            if(getState(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'status').val == 'play'){
                                                setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomPlaying', true)
                                            }else{
                                                setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomPlaying', false)
                                            }
                                            if(getState(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'status').val == 'play'){
                                                setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'multiroomPlaying', true)
                                            }else{
                                                setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'multiroomPlaying', false)
                                            }
                                        }else{
                        
                                        }
    
    
                                    }
    
                                }
                                if(CurrentSender == '' || CurrentSenderID == parseInt(99)){
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomSender', false)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomPlaying', false)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
    
    
                                }
    
                                if(CurrentReceiver == ''){}
                                if(CurrentReceiverID == parseInt(99)){}
    
    
                            }else if(String(value).toLowerCase().includes('multiroom')){
    
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomSender',false)
    
    
                           
                            }else{
                            }
    
                            var ID_ReceivingTemp = parseInt(getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
                        if(ID_ReceivingTemp != 99 ){
            var ID_ReceivingTempTitle = getState(Folder +  String(ID_ReceivingTemp)  + '.playbackInfo.' + 'title').val 
                        var ID_ReceivingTempStatus = getState(Folder +  String(ID_ReceivingTemp)  + '.playbackInfo.' + 'status').val
                    
                        }else{
        var ID_ReceivingTempTitle = 'TempValue'
        var ID_ReceivingTempStatus = 'TempValue'
                    }
                            //wenn gleich multiroom aber pla state/titel ungleich motherid oder wenn state ungleich multiroom und PI ist kein Sender
                            if(ID_ReceivingTemp != 99){
                                if(CurrentServiceOnCurrentPi == 'multiroom' && (CurrentTrackOnCurrentPi != ID_ReceivingTempTitle   ||CurrentStatusOnCurrentPi != ID_ReceivingTempStatus)){
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroom', false)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomSender', false)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomPlaying', false)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromID',99)
                                    setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromName','')
    
                            }
                            }
    
    
                            if (CurrentServiceOnCurrentPi != 'multiroom' && ID_Volumio != CurrentSenderID && ID_Volumio != CurrentReceiverID){ 
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroom',false)
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroom',false)
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromID',99)
                                setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromName','')
    
                            }
        // ------------------ Multiroom Handling v2 ---------------------------------------
    
    
    
                                }
                            // set default volume, e.g. after reboot
                            if ((value == "" || value == undefined || value == "undefined") && (value!=0||value!="0")){
                                value = "notAvailable" //handling dass 0 nicht als null interpretiert wird....
                                if(field == 'volume'){
                                    
                                    switch(parseInt(ID_Volumio)) {
                                        case 0: // rStream
                                            value = 20 
                                            break;
                                        case 1: // workStream
                                            value = 28 
                                            break;
                                        case 2: // kitchenStream
                                            value = 32 
                                            break;
                                        case 3: // flurStream
                                            value = 35 
                                            break;
                                        default:
                                            value = 20 // 
                                    }
    
                                    
                                    
                                } 
                            }
                            
                            // Handling wenn wert "notAvailable" und state ist typ number -> value = 0 statt "notAvailable"
    
    
                        
                            var TypeOfState = getObject(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field).common.type
                            //logs hierfür in if weiter unten! sonst logt er bei jedem refresh
                            if(TypeOfState == 'number' && value == 'notAvailable'){
                            //    log('ERROR')
                                value = 0
                            }
                            if(TypeOfState == 'boolean' && value == 'notAvailable'){
                            //    log('ERROR')
                                value = false
                            }
                            if(TypeOfState == 'string' && (value === false || value === true)){
                            //    log('ERROR')
                                value = String(value)
                            }
                            
    
                            //nur setzen wenn es eine änderung gab
                            if(getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field).val != value){
    
                                setState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field,value)
                                if(field == 'stream'){
    
                                }
                            }
    
                        }
                    
                } 
                if(command == "getQueue"){
                    log(result)
                }
                if(command == "getzones"){
                            zones = extract(result,'zones')
                        for (i in zones){
                            log(zones[i])
                            log(i) 
                        }
                        log(result)
                }
                if(command == "collectionstats"){
                        log(result)
                }
                if(command == "pushNotificationUrls"){
                        log(result)
                }
                if(command == "ping"){ 
                        log(result)
                }
                if(command == "getSystemVersion"){
                        log(result) 
                }
                if(command == "getSystemInfo"){
                        log(result) 
                }
        
    
        
    
                }).on("error", function (e) {
                // returnValue = "ERROR"
                //console.error(e);
                });
                return;
                
            } catch (e) {
                // returnValue = "ERROR";
                //console.error(e); 
                return;
            }
        }
    
    }           
    
    
    function setStateOnlyIfDifferent(ObjectID,NewValue){
        var CurrentValue = getState(ObjectID).val
      
        if(CurrentValue != NewValue){
            setState(ObjectID,NewValue)
        } 
    }
    
    function getIDVolumioForInfos(objID){
        var PlayerName = objID.split(".")[objID.split('.').length-4].split('_')
            return PlayerName[PlayerName.length-1]
    }
    function getIDofState(objID){
            return objID.split(".")[objID.split('.').length-1]
    }
    function getIDVolumio(objID){
        var PlayerName = objID.split(".")[objID.split('.').length-3].split('_')
            return PlayerName[PlayerName.length-1]
    }
    
    function getIDVolumio_noSubfolder(objID){
        var PlayerName = objID.split(".")[objID.split('.').length-2].split('_')
            return PlayerName[PlayerName.length-1]
    }
    
    function getVolumioStates(Volumios_IPs){
        for (ID_Volumio in Volumios_IPs){ 
            restapiRequest('192.168.178.' + Volumios_IPs[ID_Volumio],"getState",ID_Volumio)
        }
    
    }
    
    function httpRequest_wo_return(URL){
        try {
            require("request")(URL).on("error", function (e) {console.error(e);});
        } catch (e) { console.error(e); }
    }
    
    

    Hier ein zweites Skript, welches nur States erzeugt welche ich für meine vis benötige und Icons für iQontrol setzt.

    
    var var_saver ={}
    
    var names = ['Volumio_Player_0','Volumio_Player_1','Volumio_Player_2','Volumio_Player_3'] // Länge von names muss identisch mit Volumios sein, zahlen von 0 aus hochzählend
    var Volumios = ["rStream","workStream","kitchenStream","flurStream"] //muss in beiden Skripten identisch sein
    
    for (var sd in names) {
       var Audio_Infos_ID  = "javascript.0.Allgemeine_Variablen.Player."+names[sd]+".Infos.Audio."
       var_saver[sd]= {
            "Audio_Infos_ID": Audio_Infos_ID,
            "CoverURL": Audio_Infos_ID+"CoverArt",
            "ID_Source_SampleRate": Audio_Infos_ID+"Source_SampleRate",
            "ID_Source_bitdeepth": Audio_Infos_ID+"Source_bitdeepth",
            "ID_Source_bitdeepthDisplay": Audio_Infos_ID+"Source_bitdeepthDisplay",
            "ID_Source_Channels": Audio_Infos_ID+"Source_Channels",
            "ID_HiRes_Audio": Audio_Infos_ID+"HiRes_Audio",
            "ID_Source_SampleRateDisplay": Audio_Infos_ID+"Source_SampleRateDisplay",
            }   
     
        createState(var_saver[sd]["CoverURL"],{role:"state",name:"CoverArt from Moodeaudio and mpd adapter"})
        createState(var_saver[sd]["ID_Source_SampleRateDisplay"], 0, {role: "state","type": "string","unit": "kHz","read": true,"write": true,name: 'Abtastfrequenz der Quelldatei'})
        createState(var_saver[sd]["ID_Source_SampleRate"], 0, {role: "state","type": "number","unit": "Hz","read": true,"write": true,name: 'Abtastfrequenz der Quelldatei'})
        createState(var_saver[sd]["ID_Source_bitdeepth"], 0, {role: "state","type": "number","unit": "bit","read": true,"write": true,name: 'Bittiefe der Quelldatei'})
        createState(var_saver[sd]["ID_Source_bitdeepthDisplay"], 0, {role: "state","type": "string","unit": "","read": true,"write": true,name: 'Bittiefe der Quelldatei'})
        createState(var_saver[sd]["ID_Source_Channels"], 0, {role: "state","type": "number","read": true,"write": true,name: 'Audiokanaele der Quelldatei'})
        createState(var_saver[sd]["ID_HiRes_Audio"], {role: "state","type": "boolean","read": true,"write": true,name: 'HiRes Anzeige'})
    
        //listener to change high res iQontrol icon
        on({id: var_saver[sd]["ID_HiRes_Audio"], change: 'ne'}, function (obj) {    // volume_up
            var value = obj.state.val;
            var Verursacher = obj.id;
            var StateName = getIDofState(obj.id)
            var ID_Volumio_Verursacher = getIDVolumioForInfos(obj.id)        
    
            // set iQontrol icon
            if(value === true){   
                //do something            
                //setiQontrolIcon("HiRes" + Volumios[ID_Volumio_Verursacher],'Icon_HiResAudio-48',"si")
                //funktion poste ich bei Interesse
            }
            if(value === false){   
                //do something
                //setiQontrolIcon("HiRes" + Volumios[ID_Volumio_Verursacher],'blank',"blank")
                //funktion poste ich bei Interesse
    
            }
        });
    
    
    }
    
    function getIDVolumioForInfos(objID){
        var PlayerName = objID.split(".")[objID.split('.').length-4].split('_')
            return PlayerName[PlayerName.length-1]
    }
    function getIDofState(objID){
            return objID.split(".")[objID.split('.').length-1]
    }
    

    und hier noch weitere, vllt nützliche, Funktionen (bei mir global definiert)

    
    function getVolumiosReceiving(VolumiosReceiving,ReturnID){ //VolumiosReceiving  muss ein array sein, kann auch leer sein!
        //ermitteln welche volumios receiver sind un didese zu ignored deviced hinzufügen
        var Counter = Array.apply(null, Array(15)).map(function (x, i) { return i; })
        for(ID in Counter){ 
            if(existsObject('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID)){
              //  log(ID)
                var Receiving = getState('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID + '.playbackInfo.multiroomReceiver').val
                if(Receiving){
                    if(ReturnID){
                    VolumiosReceiving.push(ID)
    
                    }else{
                    VolumiosReceiving.push('Volumio_Player_' + ID)
                    }
                }
            }else{
                break;
            }
        }
    return VolumiosReceiving
    }
    
    function getVolumiosSending(VolumiosSending,ReturnID){ //VolumiosSending  muss ein array sein, kann auch leer sein!
        //ermitteln welche volumios receiver sind un didese zu ignored deviced hinzufügen
        var Counter = Array.apply(null, Array(15)).map(function (x, i) { return i; })
        for(ID in Counter){ 
            if(existsObject('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID)){
              //  log(ID)
                var Sending = getState('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID + '.playbackInfo.multiroomSender').val
                if(Sending){
                    if(ReturnID){
                    VolumiosSending.push(ID)
    
                    }else{
                    VolumiosSending.push('Volumio_Player_' + ID)
                    }
                }
            }else{
                break;
            }
        }
    return VolumiosSending
    }
    
    
    function getVolumiosPlaying(VolumiosPlaying,ReturnID){ //VolumiosPlaying  muss ein array sein, kann auch leer sein!
        //ermitteln welche volumios receiver sind un didese zu ignored deviced hinzufügen
        var Counter = Array.apply(null, Array(15)).map(function (x, i) { return i; })
        for(ID in Counter){ 
            if(existsObject('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID)){
              //  log(ID)            
                var StatusVolumio = getState('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID + '.playbackInfo.status').val
                if(StatusVolumio == 'play' || StatusVolumio == "play"){
                    var Playing = true
                }else{
                    var Playing = false
                }
                if(Playing){
                    if(ReturnID){
                    VolumiosPlaying.push(ID)
    
                    }else{
                    VolumiosPlaying.push('Volumio_Player_' + ID)
                    }
                }
            }else{
                break;
            }
        }
    return VolumiosPlaying
    }
    
    
    function getVolumiosStatus(VolumiosStatus){ //VolumiosStatus  muss ein array sein, kann auch leer sein!
        //ermitteln welche volumios receiver sind un didese zu ignored deviced hinzufügen
        var Counter = Array.apply(null, Array(15)).map(function (x, i) { return i; })
        for(ID in Counter){ 
            if(existsObject('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID)){
              //  log(ID)            
                var StatusVolumio = getState('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID + '.playbackInfo.status').val
                    VolumiosStatus.push(StatusVolumio)
    
                    
    
            }else{
                break;
            }
        }
    return VolumiosStatus
    }
    
    

    Ich hab selber leider nicht nicht die Zeit gefunden das Skript vollständig auszukommentieren. Das Skript ist sicher nicht perfekt, sei es Ressourcentechnisch oder auch von der Umsetzung. Aber ich hoffe es hilft dir/euch trotzdem weiter.

    Für Fragen/Support steh ich gerne zur Verfügung :blush:
    Anbei noch Screenshots:
    Bildschirmfoto 2024-01-29 um 18.33.04.png
    Bildschirmfoto 2024-01-29 um 18.33.38.png

    da_WoodyD 1 Antwort Letzte Antwort
    0
    • M muellerra

      Hi, @farmer-cb , entschuldige die späte Rückmeldung, da ist irgendwas mit meinen Benachrichtigungseinstellunge schief gelaufen...

      Anbei einmal die Skripte. Gleich vorneweg: Sollten die IP-Adresse ungleich 192.168.178.XXX sein, oder der Ordner ein anderer als bei mir ( javascript.0.Allgemeine_Variablen.Player.Volumio_Player_*) sein -> bitte per suchen und ersetzen anpassen.
      Der ping Adapter muss ebenfalls installiert sein -> in Zeile 601 (if(getState('ping.1.rrBroker.' + Volumios[ID_Volumio]).val){) bitte ping.1.rrBroker. entsprechend der installierten ping Instanz und dem entsprechenden iobroker-Hostnamen ersetzen. Das Gerät im ping Adapter muss genauso benannt sein, wie es in Zeile 8:

      var Volumios = ["rStream","workStream","kitchenStream","flurStream"] 
      

      definiert ist. (Bei mir ping.1.rrBroker.workStream). Wer im ping Adapter die erweiterten Infos verwendet muss ein .alive anhängen:

      if(getState('ping.<instance>.<iobrokerHostName>.' + Volumios[ID_Volumio] + '.alive').val){
      

      Hier ist das Hauptskript:

      /// Read out volumio via rest api
      var request = require('request');
      var querystring = require('querystring');
      var pollingInterval = 500//in ms
      
       
      var Folder = 'javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' // 
      var Volumios = ["rStream","workStream","kitchenStream","flurStream"]  //muss in beiden Skripten identisch sein
      var Volumios_IPs = ["82","58","48","72"] //192.168.178 wird dann im Skript hart gesetzt -> ggf. abändern! Reihenfolge der IPs muss mit den drüber definierten Namen übereinstimmen!
      
      
      
      
      var getStates_States_with_RawValues = ['samplerate','bitdepth','title','bitrate']
      var getStates_States_wo_RawValues = ['status','artist','album','albumart','uri','trackType','duration','seek','service','channels','consume','volume','dbVolume','mute','disableVolumeControl','stream','volatile', 'updatedb','trackType','random','position','repeatSingle','repeat']
      var getStates_States = getStates_States_wo_RawValues.concat(getStates_States_with_RawValues)
      
        
      //States erstellen
      // ToDo -> states nur erstellen wenn sie nicht exisitieren
       for (ID_Volumio in Volumios){  
          createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroom',false ,{"role": "indicator", "name": "indicates player in multiroom mode", "type": "boolean", "read": true, "write": true })           
          createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomPlaying',false ,{"role": "indicator", "name": "indicates player in multiroom mode", "type": "boolean", "read": true, "write": true })           
          createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomSender', false,{"role": "indicator", "name": "indicates player in Sender multiroom mode", "type": "boolean", "read": true, "write": true })           
          createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver', false,{"role": "indicator", "name": "indicates playerstate in Receiver multiroom mode", "type": "boolean", "read": true, "write": true })           
          createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromName', "",{"role": "text", "name": "indicates multiroom mode Mother", "type": "string", "read": true, "write": true })           
          createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromID', 99,{"role": "value", "name": "indicates multiroom mode Mother", "type": "number", "read": true, "write": true })           
      
          for (Stati in getStates_States){ 
              var field = getStates_States[Stati]   
              if(field == "updatedb"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "updatedb", "type": "boolean", "read": true, "write": true })           
              }
              if(field == "trackType"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "Type of current track (flac/mp3/acc/..)", "type": "string", "read": true, "write": true })           
              }
              if(field == "random"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "Repeat playlist activated", "type": "boolean", "read": true, "write": true })           
              }
              if(field == "repeatSingle"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.state", "name": "Repeat current track activated", "type": "boolean", "read": true, "write": true })           
              }
              if(field == "position"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.track", "name": "Position in playlist of current track-start at 0", "type": "number", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Corrected', {"role": "media.track", "name": "Position in playlist of current track-start at 1", "type": "number", "read": true, "write": true })           
              }
              if(field == "repeat"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.mode.repeat", "name": "Repeat playlist activated", "type": "boolean", "read": true, "write": true })           
              }    
              if(field == "status"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.state", "name": "Playback status", "type": "string", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'LastValue', {"role": "media.state", "name": "Playback status Last Value", "type": "string", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'IncomingCall', {"role": "media.state", "name": "Playback status Call is incoming", "type": "string", "read": true, "write": true })           
              }
              if(field == "title"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.title", "name": "Title of current track", "type": "string", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw', {"role": "media.title", "name": "Title of current track", "type": "string", "read": true, "write": true })           
              }
              if(field == "artist"){ 
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.artist", "name": "Artist of current track", "type": "string", "read": true, "write": true })           
              }                
              if(field == "album"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.album", "name": "Album of current track", "type": "string", "read": true, "write": true })           
              }
              if(field == "albumart"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.cover", "name": "Cover url of current track", "type": "string", "read": true, "write": true })           
              }  
              if(field == "uri"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.url", "name": "rl of current track", "type": "string", "read": true, "write": true })           
              } 
              if(field == "trackType"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "Type of current track (flac/mp3/acc/..)", "type": "string", "read": true, "write": true })           
              } 
              if(field == "seek"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.seek","unit":"ms", "name": "Seek position of current track", "type": "number", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_percent', {"role": "media.seek","unit":"%", "name": "Seek position of current track", "type": "number", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_s', {"role": "media.seek","unit":"s", "name": "Seek position of current track", "type": "number", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss', {"role": "text", "name": "Seek position of current track", "type": "string", "read": true, "write": true })           
              } 
              if(field == "duration"){ 
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.duration","unit":"s", "name": "Duration of current track", "type": "number", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_ms', {"role": "media.duration","unit":"ms", "name": "Duration of current track", "type": "number", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss', {"role": "text", "name": "Duration of current track", "type": "string", "read": true, "write": true })           
      
              }
              if(field == "samplerate"){  
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field,          {"role": "string", "name": "samplerate of current track", "type": "string", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw',  {"role": "media.samplerate", "name": "raw samplerate of current track ", "type": "number", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw2', {"role": "media.samplerate", "name": "raw samplerate of current track ", "type": "string", "read": true, "write": true })           
              }
              if(field == "bitrate"){  
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field,          {"role": "string", "name": "bitrate of current track", "type": "string", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw',  {"role": "media.bitrate", "name": "raw bitrate of current track ","unit":'kbps', "type": "number", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw2', {"role": "media.bitrate", "name": "raw bitrate of current track ", "type": "string", "read": true, "write": true })           
              }
              if(field == "bitdepth"){  
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "bitdepth  of current track", "type": "string", "read": true, "write": true })           
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Raw', {"role": "media.bitdepth", "name": "raw bitdepth  of current track", "unit": "bit", "type": "number", "read": true, "write": true })           
              }
              if(field == "channels"){  
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "value", "name": "channels of current track", "type": "number", "read": true, "write": true })           
              }
              if(field == "consume"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "consume", "type": "boolean", "read": true, "write": true })           
              }
              if(field == "volume"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "level.volume", "name": "volume in percent", "unit": "%","type": "number", "read": true, "write": true })           
              }
              if(field == "dbVolume"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "level.volume", "name": "volume in dB", "unit": "dB","type": "number", "read": true, "write": true })           
              }
              if(field == "mute"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "media.mute", "name": "muted status", "type": "boolean", "read": true, "write": true })           
              }
              if(field == "disableVolumeControl"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "Shuffle  playmode activated", "type": "boolean", "read": true, "write": true })           
              }
              if(field == "stream"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "stream", "type": "string", "read": true, "write": true })           
              }
              if(field == "volatile"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "indicator", "name": "volatile", "type": "boolean", "read": true, "write": true })           
              }
              if(field == "service"){
                  createState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field, {"role": "text", "name": "service where playback is from", "type": "string", "read": true, "write": true })           
              }
          }
      }
       
      //------------ get Informations per intervall -------------------------
      
          var timer
          var intervall
          clearTimeout(timer)
          clearInterval(intervall)
                  timer = setTimeout(function () {
                      timer = null;
                      intervall= null;
                      clearTimeout(timer);
                  clearInterval(intervall);
      
                      intervall = setInterval(getVolumioStates, pollingInterval, Volumios_IPs )
                  }, 1000 * 3); //10 sekunden dieder motion sensor noch braucht zum zurücksetzen sind aufzuaddieren
                  
      //------------ get Informations per intervall -------------------------
      
      
       //------------------ create listener for raw values ------------------- 
       var getStates_States_with_RawValuesWithAddListeners = getStates_States_with_RawValues.concat(['status','channels'])
       for (ID_Volumio in Volumios_IPs){ 
        for (Stati in getStates_States_with_RawValuesWithAddListeners){
      
      on({id: Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + getStates_States_with_RawValuesWithAddListeners[Stati], change: 'any'}, function (obj) {
                  var value = obj.state.val;
                  var oldValue = obj.oldState.val
                  var Verursacher = obj.id;
                  var StateName = getIDofState(obj.id)
                  var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
                  //untescheidung nach kHz mHz!
                  if (StateName == 'title'){
                      
                      splitted = value.split(' ')
                      firstIsNumber = typeof(parseFloat(splitted[0]))
                      if(typeof(parseFloat(splitted[0])) == "number"){
                          firstIsNumber = true
                      }else{firstIsNumber=false}
                      if(splitted[1] == "-"){
                          secondStrich = true
                      }else{secondStrich=false}
                  if(firstIsNumber === true && secondStrich === true){
                  delete splitted[1]
                  delete splitted[0]
                  result = splitted.join(' ')
                  }else{result = value}
                      setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw', result)
                  }else if (StateName == 'status'){
                   
                  var StatusOldValue = getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName).val
                  setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'LastValue',oldValue)
                         
      
      
                         
                  }else if (StateName == 'channels'){   
                          setState(Folder + String(parseInt(ID_Volumio_Verursacher)) + '.Infos.Audio.Source_Channels', parseFloat(value))                   
                  }else if (StateName == 'bitrate'){
                                      log(ID_Volumio_Verursacher + ": Receiving: " + getState(Folder+ID_Volumio_Verursacher+'.playbackInfo.multiroomReceiver').val)
      
                      if(String(value).toLowerCase().includes('kbps')){
                          result = parseFloat(value)
                          setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', result + ' kbps')
      
                      }else{result = 0
                          setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', 'notAvailable')
      
                      }
                  }else if (StateName == 'bitdepth'){
                      
                      var BitDepthTemp = parseFloat(value)
      
                      
                      result = BitDepthTemp
                      var SampleRateTemp = getState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate').val
                      var ServiceTemp = getState(Folder + ID_Volumio_Verursacher + '.playbackInfo.service').val
                      
                      if((BitDepthTemp > 16 || SampleRateTemp > 48000) && ServiceTemp != 'multiroom' ){
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',true)
                          
                      }else{
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',false)
                          
                      }
                      
                      setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepth', parseFloat(value))
                      if(value == 'notAvailable'){                                  
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepthDisplay', 'notAvailable')
                      }else{
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepthDisplay', String(value))
                      }
       
       
      
                  }else if (StateName == 'samplerate'){
                     
                      var SampleRateTemp = parseFloat(value)
      
                      var BitDepthTemp = getState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepth').val
                      var ServiceTemp = getState(Folder + ID_Volumio_Verursacher + '.playbackInfo.service').val
                      log("BitDepthTemp 2:" + BitDepthTemp)
      
                      if((BitDepthTemp > 16 || SampleRateTemp > 48000) && ServiceTemp != 'multiroom'){
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',true)
                      }else{setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',false)}
      
                      if(String(value).toLowerCase().includes('khz')){
                          result = parseFloat(value)*1000
                          setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', result/1000 + ' kHz')
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRateDisplay', result/1000 + ' kHz')
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate', result)
      
                      }
                      else if(String(value).toLowerCase().includes('mhz')){
                          result = parseFloat(value)*1000000 
                          setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', result/1000000 + ' MHz')
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRateDisplay', result/1000000 + ' MHz')
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate', result)
      
                      }else if(String(value).toLowerCase().includes('kbps')){
                          result = parseFloat(value) 
                          setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', result + ' kbps')
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRateDisplay', result + ' kbps')
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate', 0)
      
      
                      }else if(value == null||value == 'null' ||value == 'undefined' || value == undefined||value == 'notAvailable'){ 
                          result = 0
                          setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw2', 'notAvailable')
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRateDisplay', 'notAvailable')
                          setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate', 0)
                      }else{result = parseFloat(value)} 
      
      
      
                  }else{
                      result = parseFloat(value)
      
                  }
      
      
          if (StateName != 'service' && StateName != 'status' && StateName != 'channels'){
                  setState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + StateName + 'Raw', result)
                 
          }
          
      
          
          });
      
      
          }
        }
       //------------------ create listener for raw values ------------------- 
      
         
       // ------------------ states for control ------------------------
       
       var Buttons_Control = ['next','previous','play','pause','stop','mute','unmute','mute_toggle','PlayPause','PlayPause_controlFolder','volume_up','volume_down','removeAsReceiver','removeAllReceiver']
      var VolumioAPIString1 = "http://"
      var VolumioAPIStringCommand = "/api/v1/commands/?cmd="
      
       for (ID_Volumio in Volumios_IPs){ 
      
           var FolderPlayer = Folder + String(parseInt(ID_Volumio))
          var FolderControl = FolderPlayer + '.control'
      
          for (iter in Buttons_Control){
             // console.log(iter)
              if (Buttons_Control[iter] == "VolumeControl_ID"){
      
                  createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"value", type: "string",name: Buttons_Control[iter]    })
                  setState(FolderControl+'.'+Buttons_Control[iter],false)
          }else  if (Buttons_Control[iter] == "Volume"){
                  createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"value", type: "number",name: Buttons_Control[iter]    })
                  setState(FolderControl+'.'+Buttons_Control[iter],false)
          }else  if (Buttons_Control[iter] == "removeAsReceiver"){
                  createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"button", type: "boolean",name: 'Remove pi from multiroom if pi is a Receiver'    })
                  setState(FolderControl+'.'+Buttons_Control[iter],false)
          }else  if (Buttons_Control[iter] == "removeAllReceiver"){
                  createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"button", type: "boolean",name: 'Remove all Receiver Pis from receiving'    })
                  setState(FolderControl+'.'+Buttons_Control[iter],false)
          }else  if (Buttons_Control[iter] == "PlayPause"){
                  createState(FolderPlayer+'.'+Buttons_Control[iter],false, {role:"button", type: "boolean",name: Buttons_Control[iter] + ' Toggle'    })
                  setState(FolderPlayer+'.'+Buttons_Control[iter],false)
          }
              else{
              createState(FolderControl+'.'+Buttons_Control[iter],false, {role:"button", type: "boolean",name: Buttons_Control[iter]    })
              setState(FolderControl+'.'+Buttons_Control[iter],false)
              }
          }
      
      
          on({id: FolderControl+'.'+Buttons_Control[0], change: 'ne'}, function (obj) {    // next
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
              if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ // sicherehits auf länge
                  ID_Volumio_Verursacher = ID_Multiroom_Temp
              }
              if(value === true){   
                  //do something
                  var command = "next"
                  var URL = VolumioAPIString1 +   '192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[1], change: 'ne'}, function (obj) {    // previous
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
              if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ 
                  ID_Volumio_Verursacher = ID_Multiroom_Temp
              }
              if(value === true){   
                  //do something
                  var command = "prev"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  httpRequest_wo_return(URL)
      
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[2], change: 'ne'}, function (obj) {    // play
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
              if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){
                  ID_Volumio_Verursacher = ID_Multiroom_Temp
              }
              if(value === true){   
                  //do something
                  var command = "play"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[3], change: 'ne'}, function (obj) {    // pause
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
              if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ 
                  ID_Volumio_Verursacher = ID_Multiroom_Temp
              }
              if(value === true){   
                  //do something
                  var command = "pause"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[4], change: 'ne'}, function (obj) {    // stop
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              if(value === true){   
                  //do something
                  var command = "stop"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[5], change: 'ne'}, function (obj) {    // mute
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              if(value === true){   
                  //do something
                  var command = "volume&volume=mute"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[6], change: 'ne'}, function (obj) {    // unmute
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              if(value === true){   
                  //do something
                  var command = "volume&volume=unmute"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[7], change: 'ne'}, function (obj) {    // mute_toggle
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              if(value === true){   
                  //do something
                  var MuteStateTemp = getState(Folder + String(ID_Volumio_Verursacher) + '.playbackInfo.mute').val 
                  if (MuteStateTemp === false || MuteStateTemp == "false"){
                      //muten
                      var command = "volume&volume=mute"
                  }else if (MuteStateTemp === true || MuteStateTemp == "true"){
                      //unmuten
                      var command = "volume&volume=unmute"
                  }
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderPlayer+'.'+Buttons_Control[8], change: 'any'}, function (obj) {    // PlayPause //ACHTUNG HIER ANDERER ORDNER IM LISTENER
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio_noSubfolder(obj.id,Volumios) // ACHTUNG HIER ANDERE FUNKTION, DA ICH IN ANDEREM ORDNER UNTERWEGS BIN
              var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
              if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ // sicherehits auf länge
                  ID_Volumio_Verursacher = ID_Multiroom_Temp
              }        if(value === true){   
                  //do something
                  var command = "toggle"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  log(URL)
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[9], change: 'ne'}, function (obj) {    // PlayPause_controlFolder
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              var ID_Multiroom_Temp = parseInt(getState(Folder +  String(parseInt(ID_Volumio_Verursacher))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
              if(ID_Multiroom_Temp != 99 && ID_Multiroom_Temp <= parseInt(Volumios.length)){ // sicherehits auf länge
                  ID_Volumio_Verursacher = ID_Multiroom_Temp
              }
              if(value === true){   
                  //do something
                  setState(Folder + String(ID_Volumio_Verursacher) + '.PlayPause',true)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[10], change: 'ne'}, function (obj) {    // volume_up
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              if(value === true){   
                  //do something
                  var command = "volume&volume=plus"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  log(URL)
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
          on({id: FolderControl+'.'+Buttons_Control[11], change: 'ne'}, function (obj) {    // volume_down
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              if(value === true){   
                  //do something
                  var command = "volume&volume=minus"
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  log(URL)
                  httpRequest_wo_return(URL)
                  setState(Verursacher,false)
              }
          });
      
          on({id: FolderControl+'.'+Buttons_Control[12], change: 'ne'}, function (obj) {    // removeAsReceiver
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              var IsPiReceiving = getState(Folder + ID_Volumio_Verursacher + '.playbackInfo.multiroomReceiver').val
              if(value === true){   
                  //do something
                  if(IsPiReceiving){
                      var command = "stop"
                      var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                      log(URL)
                      httpRequest_wo_return(URL)
                  }
                  setState(Verursacher,false)
              }
          });
      
          on({id: FolderControl+'.'+Buttons_Control[13], change: 'ne'}, function (obj) {    // removeAllReceiver
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
              var ReceivingVolumios = getVolumiosReceiving([],true)        
              if(value === true){   
                  //do something
                  for(PiToKill in ReceivingVolumios){
                      var command = "stop"
                      var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ReceivingVolumios[PiToKill]] + VolumioAPIStringCommand + command
                      log(URL)
                      httpRequest_wo_return(URL)
                  }            
                  setState(Verursacher,false)
              }
          });
      
          on({id: Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + getStates_States[11] , change: 'ne'}, function (obj) {    // volume (in folder playbackinfo)
              var value = obj.state.val;
              var oldValue = obj.oldState.val;
              if(value != oldValue){
                  var NewVolume = value
                  var Verursacher = obj.id;
                  var StateName = getIDofState(obj.id)
                  var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
                  var command = "volume&volume=" + parseInt(NewVolume)
                  var URL = VolumioAPIString1 +'192.168.178.' + Volumios_IPs[ID_Volumio_Verursacher] + VolumioAPIStringCommand + command
                  log(URL)
                  httpRequest_wo_return(URL)
              }
          });
      
       }
      
       // ------------------ states for control ------------------------
      
      
      //set Resetz hiRes in multiroom verbund
       for (ID_Volumio in Volumios_IPs){ 
          on({id: Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver', change: 'any'}, function (obj) {
              var value = obj.state.val;
              var oldValue = obj.oldState.val
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumio(obj.id,Volumios)
      
              var IsChildTemp = value
              var ServiceTemp = getState(Folder + ID_Volumio_Verursacher + '.playbackInfo.service').val
      
              var BitDepthTemp = getState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_bitdeepth').val
              var SampleRateTemp = getState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.Source_SampleRate').val
              log("BitDepthTemp 3:" + BitDepthTemp)
              log("IsChildTemp 3:" + IsChildTemp)
      
              //if((BitDepthTemp > 16 || SampleRateTemp > 44100) && IsChildTemp === false && ServiceTemp != 'multiroom'){//&& getState(Folder+ID_Volumio_Verursacher+'.playbackInfo.multiroomReceiver').val === false){
              if((BitDepthTemp > 16 || SampleRateTemp > 48000) && IsChildTemp === false && ServiceTemp != 'multiroom'){//&& getState(Folder+ID_Volumio_Verursacher+'.playbackInfo.multiroomReceiver').val === false){
                  setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',true)
              }else{
                  setState(Folder + ID_Volumio_Verursacher + '.Infos.Audio.HiRes_Audio',false)
              }
      
      
          });
      }
      
      function extract(JSONvariable,fieldname) {
          return getAttr((function () { try {return JSON.parse(JSONvariable);} catch(e) {return {};}})(), fieldname)
      } 
      
      function restapiRequest(ip,command,ID_Volumio) { //sendet ssh befehl an moodeaudio muss ich eigentlich auf zertifikat umstellen
          var url = 'http://' + ip + '/api/v1/' + command
      
          if(getState('ping.1.rrBroker.' + Volumios[ID_Volumio]).val){
              try {
                  require("request")(url, async function (error, response, result) {
                  if(error != null){
                      if(String(error).includes('read ECONNRESET') || String(error).includes('connect EHOSTUNREACH 192.168.178.') || String(error).includes('connect ECONNREFUSED 192.168.178.')){
                          log("ERROR Volumio: " + error)
                          return;
                      }   
                  }
                    //  log(getStates_States)
                   // log(ID_Volumio + 'is receiver ' + getState(Folder + ID_Volumio + '.playbackInfo.multiroomReceiver').val)
                
      
                  if(command == "getState"){   
                          for (Stati in getStates_States){
                              var field = getStates_States[Stati]
                             // log(field)
                              var value = extract(result,field)                     
                              if (field == 'channels'){
                      
                              }
                              
                              if (field == 'bitrate'){
                                //  log("Bitrate: " + value)
                              }
                              if (field == 'position'){
                      
                                  setState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + 'Corrected', parseInt(value)+1)
                              }
                              if (field == 'seek'){
                      
                                  var TrackDurationTemp = parseFloat(getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'duration').val )
                                      var elapsed_sec = parseFloat(value)/1000
                                      var elapsedPercent = Math.round(100*(elapsed_sec/TrackDurationTemp)* 100)  * 0.01
                                      
                                      var elapsedMM = parseInt(elapsed_sec/60)
                                      var elapsedSS = parseInt(elapsed_sec) - 60*elapsedMM   
                                      var elapsedMM_string = String(elapsedMM)
                                      var elapsedSS_string = String(elapsedSS)
                                      if(elapsedMM_string.length == 1){elapsedMM_string = '0'+elapsedMM_string}                        
                                      if(elapsedSS_string.length == 1){elapsedSS_string = '0'+elapsedSS_string}                        
                                      var elapsedMMSS = elapsedMM_string + ':' + elapsedSS_string
      
      
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_s', elapsed_sec)
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_percent', elapsedPercent)
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss', elapsedMMSS)
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_percent',elapsedPercent)
                                              
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss',elapsedMMSS)
                              
                              }
                              if (field == 'duration'){
                                      var duration_sec = parseFloat(value)
                                      var duration_ms = duration_sec*1000
      
                                      var durationMM = parseInt(duration_sec/60)
                                      var durationSS = parseInt(duration_sec) - 60*durationMM   
                                      var durationMM_string = String(durationMM)
                                      var durationSS_string = String(durationSS)
                                      if(durationMM_string.length == 1){durationMM_string = '0'+durationMM_string}                        
                                      if(durationSS_string.length == 1){durationSS_string = '0'+durationSS_string}                        
                                      var durationMMSS = durationMM_string + ':' + durationSS_string
                      
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss', durationMMSS)
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_ms',duration_ms)
                                  //nur setzen wenn es eine änderung gab
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field + '_mmss',durationMMSS)
                                  
                              
                                  
                              }
                              if (field == 'albumart'){
                                  try{
                                  if(value.includes('http') === true){
                                      var CoverURL = value
                                  }else{
                                      var CoverURL = 'http://' + ip + value
                                  }
                                  setState(Folder + String(ID_Volumio) + '.Infos.Audio.CoverArt',CoverURL)
                                  }catch(e){}
                              }
                              if (field == 'service'){ //Service muss immer gesetzt werden! umd multiroom status zu erhalten
      
          // ------------------ Multiroom Handling v2 ---------------------------------------
                              //erst mutter dann kinder herausfinden, kann im zweifel 2 sekunden dauern
                              //funktioniert nur wenn ein multiroom verbund vorhanden ist, ansonsten kommt kp was raus
                              var CurrentTrackOnCurrentPi = getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'title').val
                              var CurrentAlbumOnCurrentPi = getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'album').val
                              var CurrentServiceOnCurrentPi = getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'service').val
                              var CurrentStatusOnCurrentPi = getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'status').val
      
                              if(String(value).toLowerCase().includes('multiroom') == false){
                                  // Fall 1: Sender
                                  //vergleichen ob ein anderer PI das gleiche abspielt und in multiroom betrieb ist, dann ist pi == mother
      
                                  var CurrentSender = ''
                                  var CurrentSenderID = parseInt(99)
                                  var CurrentReceiver = ''
                                  var CurrentReceiverID = parseInt(99)
      
                                  for (ID_VolumioSearch in Volumios){
                                      if(ID_VolumioSearch != ID_Volumio){
                                          var CurrentTrackOnOtherPi = getState(Folder +  String(parseInt(ID_VolumioSearch))  + '.playbackInfo.' + 'title').val
                                          var CurrentAlbumOnOtherPi = getState(Folder +  String(parseInt(ID_VolumioSearch))  + '.playbackInfo.' + 'album').val
                                          var CurrentServiceOnOtherPi = getState(Folder +  String(parseInt(ID_VolumioSearch))  + '.playbackInfo.' + 'service').val
                                          var CurrentStatusOnOtherPi = getState(Folder +  String(parseInt(ID_VolumioSearch))  + '.playbackInfo.' + 'status').val
                          
      
                                          if (CurrentStatusOnCurrentPi == CurrentStatusOnOtherPi && CurrentTrackOnCurrentPi == CurrentTrackOnOtherPi && CurrentServiceOnOtherPi == 'multiroom'){ // == -> ID_Volumio = mother; ?? -> receiver
                                              CurrentSender = Volumios[ID_Volumio]
                                              CurrentSenderID = parseInt(ID_Volumio)
                                              CurrentReceiver = Volumios[ID_VolumioSearch]
                                              CurrentReceiverID = parseInt(ID_VolumioSearch)
                                          
                                              //  log('CurrentServiceRefreshed: ' + Volumios[ID_Volumio])
      
                                              //nochmals gegenprüfen ob son von möglichen müttern auch auf anderen wiedergegeben wird! 
                                              //nur schreiben wenn sich was ändert!!!! und auch zurücksetzen
                                              setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroom',true)
                                              setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'multiroom',true)
                                              setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'multiroomSender',true)
                                              setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomReceiver',true)
                                              setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomReceivingFromID',CurrentSenderID)
                                              setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomReceivingFromName',CurrentSender)
      
      
                                              
                                              //und in abfrage abfangen, dass diese infos nicht gesetzt werden wenn er receiver ist
      
      
      
                                              if(getState(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'status').val == 'play'){
                                                  setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomPlaying', true)
                                              }else{
                                                  setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentReceiverID))  + '.playbackInfo.' + 'multiroomPlaying', false)
                                              }
                                              if(getState(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'status').val == 'play'){
                                                  setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'multiroomPlaying', true)
                                              }else{
                                                  setStateOnlyIfDifferent(Folder +  String(parseInt(CurrentSenderID))  + '.playbackInfo.' + 'multiroomPlaying', false)
                                              }
                                          }else{
                          
                                          }
      
      
                                      }
      
                                  }
                                  if(CurrentSender == '' || CurrentSenderID == parseInt(99)){
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomSender', false)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomPlaying', false)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
      
      
                                  }
      
                                  if(CurrentReceiver == ''){}
                                  if(CurrentReceiverID == parseInt(99)){}
      
      
                              }else if(String(value).toLowerCase().includes('multiroom')){
      
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomSender',false)
      
      
                             
                              }else{
                              }
      
                              var ID_ReceivingTemp = parseInt(getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromID').val)
                          if(ID_ReceivingTemp != 99 ){
              var ID_ReceivingTempTitle = getState(Folder +  String(ID_ReceivingTemp)  + '.playbackInfo.' + 'title').val 
                          var ID_ReceivingTempStatus = getState(Folder +  String(ID_ReceivingTemp)  + '.playbackInfo.' + 'status').val
                      
                          }else{
          var ID_ReceivingTempTitle = 'TempValue'
          var ID_ReceivingTempStatus = 'TempValue'
                      }
                              //wenn gleich multiroom aber pla state/titel ungleich motherid oder wenn state ungleich multiroom und PI ist kein Sender
                              if(ID_ReceivingTemp != 99){
                                  if(CurrentServiceOnCurrentPi == 'multiroom' && (CurrentTrackOnCurrentPi != ID_ReceivingTempTitle   ||CurrentStatusOnCurrentPi != ID_ReceivingTempStatus)){
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroom', false)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomSender', false)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomPlaying', false)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromID',99)
                                      setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromName','')
      
                              }
                              }
      
      
                              if (CurrentServiceOnCurrentPi != 'multiroom' && ID_Volumio != CurrentSenderID && ID_Volumio != CurrentReceiverID){ 
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroom',false)
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroom',false)
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceiver',false)
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromID',99)
                                  setStateOnlyIfDifferent(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + 'multiroomReceivingFromName','')
      
                              }
          // ------------------ Multiroom Handling v2 ---------------------------------------
      
      
      
                                  }
                              // set default volume, e.g. after reboot
                              if ((value == "" || value == undefined || value == "undefined") && (value!=0||value!="0")){
                                  value = "notAvailable" //handling dass 0 nicht als null interpretiert wird....
                                  if(field == 'volume'){
                                      
                                      switch(parseInt(ID_Volumio)) {
                                          case 0: // rStream
                                              value = 20 
                                              break;
                                          case 1: // workStream
                                              value = 28 
                                              break;
                                          case 2: // kitchenStream
                                              value = 32 
                                              break;
                                          case 3: // flurStream
                                              value = 35 
                                              break;
                                          default:
                                              value = 20 // 
                                      }
      
                                      
                                      
                                  } 
                              }
                              
                              // Handling wenn wert "notAvailable" und state ist typ number -> value = 0 statt "notAvailable"
      
      
                          
                              var TypeOfState = getObject(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field).common.type
                              //logs hierfür in if weiter unten! sonst logt er bei jedem refresh
                              if(TypeOfState == 'number' && value == 'notAvailable'){
                              //    log('ERROR')
                                  value = 0
                              }
                              if(TypeOfState == 'boolean' && value == 'notAvailable'){
                              //    log('ERROR')
                                  value = false
                              }
                              if(TypeOfState == 'string' && (value === false || value === true)){
                              //    log('ERROR')
                                  value = String(value)
                              }
                              
      
                              //nur setzen wenn es eine änderung gab
                              if(getState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field).val != value){
      
                                  setState(Folder +  String(parseInt(ID_Volumio))  + '.playbackInfo.' + field,value)
                                  if(field == 'stream'){
      
                                  }
                              }
      
                          }
                      
                  } 
                  if(command == "getQueue"){
                      log(result)
                  }
                  if(command == "getzones"){
                              zones = extract(result,'zones')
                          for (i in zones){
                              log(zones[i])
                              log(i) 
                          }
                          log(result)
                  }
                  if(command == "collectionstats"){
                          log(result)
                  }
                  if(command == "pushNotificationUrls"){
                          log(result)
                  }
                  if(command == "ping"){ 
                          log(result)
                  }
                  if(command == "getSystemVersion"){
                          log(result) 
                  }
                  if(command == "getSystemInfo"){
                          log(result) 
                  }
          
      
          
      
                  }).on("error", function (e) {
                  // returnValue = "ERROR"
                  //console.error(e);
                  });
                  return;
                  
              } catch (e) {
                  // returnValue = "ERROR";
                  //console.error(e); 
                  return;
              }
          }
      
      }           
      
      
      function setStateOnlyIfDifferent(ObjectID,NewValue){
          var CurrentValue = getState(ObjectID).val
        
          if(CurrentValue != NewValue){
              setState(ObjectID,NewValue)
          } 
      }
      
      function getIDVolumioForInfos(objID){
          var PlayerName = objID.split(".")[objID.split('.').length-4].split('_')
              return PlayerName[PlayerName.length-1]
      }
      function getIDofState(objID){
              return objID.split(".")[objID.split('.').length-1]
      }
      function getIDVolumio(objID){
          var PlayerName = objID.split(".")[objID.split('.').length-3].split('_')
              return PlayerName[PlayerName.length-1]
      }
      
      function getIDVolumio_noSubfolder(objID){
          var PlayerName = objID.split(".")[objID.split('.').length-2].split('_')
              return PlayerName[PlayerName.length-1]
      }
      
      function getVolumioStates(Volumios_IPs){
          for (ID_Volumio in Volumios_IPs){ 
              restapiRequest('192.168.178.' + Volumios_IPs[ID_Volumio],"getState",ID_Volumio)
          }
      
      }
      
      function httpRequest_wo_return(URL){
          try {
              require("request")(URL).on("error", function (e) {console.error(e);});
          } catch (e) { console.error(e); }
      }
      
      

      Hier ein zweites Skript, welches nur States erzeugt welche ich für meine vis benötige und Icons für iQontrol setzt.

      
      var var_saver ={}
      
      var names = ['Volumio_Player_0','Volumio_Player_1','Volumio_Player_2','Volumio_Player_3'] // Länge von names muss identisch mit Volumios sein, zahlen von 0 aus hochzählend
      var Volumios = ["rStream","workStream","kitchenStream","flurStream"] //muss in beiden Skripten identisch sein
      
      for (var sd in names) {
         var Audio_Infos_ID  = "javascript.0.Allgemeine_Variablen.Player."+names[sd]+".Infos.Audio."
         var_saver[sd]= {
              "Audio_Infos_ID": Audio_Infos_ID,
              "CoverURL": Audio_Infos_ID+"CoverArt",
              "ID_Source_SampleRate": Audio_Infos_ID+"Source_SampleRate",
              "ID_Source_bitdeepth": Audio_Infos_ID+"Source_bitdeepth",
              "ID_Source_bitdeepthDisplay": Audio_Infos_ID+"Source_bitdeepthDisplay",
              "ID_Source_Channels": Audio_Infos_ID+"Source_Channels",
              "ID_HiRes_Audio": Audio_Infos_ID+"HiRes_Audio",
              "ID_Source_SampleRateDisplay": Audio_Infos_ID+"Source_SampleRateDisplay",
              }   
       
          createState(var_saver[sd]["CoverURL"],{role:"state",name:"CoverArt from Moodeaudio and mpd adapter"})
          createState(var_saver[sd]["ID_Source_SampleRateDisplay"], 0, {role: "state","type": "string","unit": "kHz","read": true,"write": true,name: 'Abtastfrequenz der Quelldatei'})
          createState(var_saver[sd]["ID_Source_SampleRate"], 0, {role: "state","type": "number","unit": "Hz","read": true,"write": true,name: 'Abtastfrequenz der Quelldatei'})
          createState(var_saver[sd]["ID_Source_bitdeepth"], 0, {role: "state","type": "number","unit": "bit","read": true,"write": true,name: 'Bittiefe der Quelldatei'})
          createState(var_saver[sd]["ID_Source_bitdeepthDisplay"], 0, {role: "state","type": "string","unit": "","read": true,"write": true,name: 'Bittiefe der Quelldatei'})
          createState(var_saver[sd]["ID_Source_Channels"], 0, {role: "state","type": "number","read": true,"write": true,name: 'Audiokanaele der Quelldatei'})
          createState(var_saver[sd]["ID_HiRes_Audio"], {role: "state","type": "boolean","read": true,"write": true,name: 'HiRes Anzeige'})
      
          //listener to change high res iQontrol icon
          on({id: var_saver[sd]["ID_HiRes_Audio"], change: 'ne'}, function (obj) {    // volume_up
              var value = obj.state.val;
              var Verursacher = obj.id;
              var StateName = getIDofState(obj.id)
              var ID_Volumio_Verursacher = getIDVolumioForInfos(obj.id)        
      
              // set iQontrol icon
              if(value === true){   
                  //do something            
                  //setiQontrolIcon("HiRes" + Volumios[ID_Volumio_Verursacher],'Icon_HiResAudio-48',"si")
                  //funktion poste ich bei Interesse
              }
              if(value === false){   
                  //do something
                  //setiQontrolIcon("HiRes" + Volumios[ID_Volumio_Verursacher],'blank',"blank")
                  //funktion poste ich bei Interesse
      
              }
          });
      
      
      }
      
      function getIDVolumioForInfos(objID){
          var PlayerName = objID.split(".")[objID.split('.').length-4].split('_')
              return PlayerName[PlayerName.length-1]
      }
      function getIDofState(objID){
              return objID.split(".")[objID.split('.').length-1]
      }
      

      und hier noch weitere, vllt nützliche, Funktionen (bei mir global definiert)

      
      function getVolumiosReceiving(VolumiosReceiving,ReturnID){ //VolumiosReceiving  muss ein array sein, kann auch leer sein!
          //ermitteln welche volumios receiver sind un didese zu ignored deviced hinzufügen
          var Counter = Array.apply(null, Array(15)).map(function (x, i) { return i; })
          for(ID in Counter){ 
              if(existsObject('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID)){
                //  log(ID)
                  var Receiving = getState('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID + '.playbackInfo.multiroomReceiver').val
                  if(Receiving){
                      if(ReturnID){
                      VolumiosReceiving.push(ID)
      
                      }else{
                      VolumiosReceiving.push('Volumio_Player_' + ID)
                      }
                  }
              }else{
                  break;
              }
          }
      return VolumiosReceiving
      }
      
      function getVolumiosSending(VolumiosSending,ReturnID){ //VolumiosSending  muss ein array sein, kann auch leer sein!
          //ermitteln welche volumios receiver sind un didese zu ignored deviced hinzufügen
          var Counter = Array.apply(null, Array(15)).map(function (x, i) { return i; })
          for(ID in Counter){ 
              if(existsObject('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID)){
                //  log(ID)
                  var Sending = getState('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID + '.playbackInfo.multiroomSender').val
                  if(Sending){
                      if(ReturnID){
                      VolumiosSending.push(ID)
      
                      }else{
                      VolumiosSending.push('Volumio_Player_' + ID)
                      }
                  }
              }else{
                  break;
              }
          }
      return VolumiosSending
      }
      
      
      function getVolumiosPlaying(VolumiosPlaying,ReturnID){ //VolumiosPlaying  muss ein array sein, kann auch leer sein!
          //ermitteln welche volumios receiver sind un didese zu ignored deviced hinzufügen
          var Counter = Array.apply(null, Array(15)).map(function (x, i) { return i; })
          for(ID in Counter){ 
              if(existsObject('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID)){
                //  log(ID)            
                  var StatusVolumio = getState('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID + '.playbackInfo.status').val
                  if(StatusVolumio == 'play' || StatusVolumio == "play"){
                      var Playing = true
                  }else{
                      var Playing = false
                  }
                  if(Playing){
                      if(ReturnID){
                      VolumiosPlaying.push(ID)
      
                      }else{
                      VolumiosPlaying.push('Volumio_Player_' + ID)
                      }
                  }
              }else{
                  break;
              }
          }
      return VolumiosPlaying
      }
      
      
      function getVolumiosStatus(VolumiosStatus){ //VolumiosStatus  muss ein array sein, kann auch leer sein!
          //ermitteln welche volumios receiver sind un didese zu ignored deviced hinzufügen
          var Counter = Array.apply(null, Array(15)).map(function (x, i) { return i; })
          for(ID in Counter){ 
              if(existsObject('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID)){
                //  log(ID)            
                  var StatusVolumio = getState('javascript.0.Allgemeine_Variablen.Player.Volumio_Player_' + ID + '.playbackInfo.status').val
                      VolumiosStatus.push(StatusVolumio)
      
                      
      
              }else{
                  break;
              }
          }
      return VolumiosStatus
      }
      
      

      Ich hab selber leider nicht nicht die Zeit gefunden das Skript vollständig auszukommentieren. Das Skript ist sicher nicht perfekt, sei es Ressourcentechnisch oder auch von der Umsetzung. Aber ich hoffe es hilft dir/euch trotzdem weiter.

      Für Fragen/Support steh ich gerne zur Verfügung :blush:
      Anbei noch Screenshots:
      Bildschirmfoto 2024-01-29 um 18.33.04.png
      Bildschirmfoto 2024-01-29 um 18.33.38.png

      da_WoodyD Online
      da_WoodyD Online
      da_Woody
      schrieb am zuletzt editiert von
      #51

      @muellerra hey, wieder was zum spielen! :)
      werd mal wieder reinlinsen...

      gruß vom Woody
      HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

      1 Antwort Letzte Antwort
      1
      • da_WoodyD Online
        da_WoodyD Online
        da_Woody
        schrieb am zuletzt editiert von
        #52

        @muellerra hmm, instanz wieder mal gestartet. mal komplett deinstalliert, jetzt neu 0.1.3.
        aber nach wie vor:
        1d767870-3603-4085-9645-e8a1bf7b1d1f-grafik.png
        somit wird mal nix aktualisiert bei einem senderwechsel bei internetradio.
        da werden auch die scripts nichts ändern.

        gruß vom Woody
        HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

        M 1 Antwort Letzte Antwort
        0
        • da_WoodyD da_Woody

          @muellerra hmm, instanz wieder mal gestartet. mal komplett deinstalliert, jetzt neu 0.1.3.
          aber nach wie vor:
          1d767870-3603-4085-9645-e8a1bf7b1d1f-grafik.png
          somit wird mal nix aktualisiert bei einem senderwechsel bei internetradio.
          da werden auch die scripts nichts ändern.

          M Offline
          M Offline
          muellerra
          schrieb am zuletzt editiert von
          #53

          @da_woody Hi, ich glaube ich hab das vergessen zu erwähnen. Mit dem Skript wird der Adapter nicht mehr benötigt. Ich hab mir das mal als alternative zu dem volumio adapter geschrieben.

          da_WoodyD 2 Antworten Letzte Antwort
          0
          • M muellerra

            @da_woody Hi, ich glaube ich hab das vergessen zu erwähnen. Mit dem Skript wird der Adapter nicht mehr benötigt. Ich hab mir das mal als alternative zu dem volumio adapter geschrieben.

            da_WoodyD Online
            da_WoodyD Online
            da_Woody
            schrieb am zuletzt editiert von
            #54

            @muellerra AHA! :) na dann mal schauen wenn ich zeit finde...
            kommt ja auch noch dazu:
            be8cc895-e3b2-4c5d-8620-e50559473e40-grafik.png

            gruß vom Woody
            HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

            1 Antwort Letzte Antwort
            0
            • M muellerra

              @da_woody Hi, ich glaube ich hab das vergessen zu erwähnen. Mit dem Skript wird der Adapter nicht mehr benötigt. Ich hab mir das mal als alternative zu dem volumio adapter geschrieben.

              da_WoodyD Online
              da_WoodyD Online
              da_Woody
              schrieb am zuletzt editiert von da_Woody
              #55

              @muellerra so, hab jetzt rumgebastelt. in meiner sturheit latürnich einen eigenen ordner gemacht. :D in iQontrol auch schon geändert.
              ad7c7478-63c5-406c-bdc0-bb11bf0931a3-grafik.png
              soweit alles geändert, fehler in zeile 9 gefunden, war } statt]... kann mir ja halbwegs helfen.
              allerdings bekomm ich in 362 einen geklatscht, den ich nicht packe. kannst da mal reinlinsen? hab ja nur einen raspi dran, sollte aber mit den änderungen passen.
              Volumio.txt
              danke.gif

              gruß vom Woody
              HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

              M 1 Antwort Letzte Antwort
              1
              • da_WoodyD da_Woody

                @muellerra so, hab jetzt rumgebastelt. in meiner sturheit latürnich einen eigenen ordner gemacht. :D in iQontrol auch schon geändert.
                ad7c7478-63c5-406c-bdc0-bb11bf0931a3-grafik.png
                soweit alles geändert, fehler in zeile 9 gefunden, war } statt]... kann mir ja halbwegs helfen.
                allerdings bekomm ich in 362 einen geklatscht, den ich nicht packe. kannst da mal reinlinsen? hab ja nur einen raspi dran, sollte aber mit den änderungen passen.
                Volumio.txt
                danke.gif

                M Offline
                M Offline
                muellerra
                schrieb am zuletzt editiert von muellerra
                #56

                @da_woody Hi, schau mal in Zeile 362 ans Ende, da hab ich vergessen ein / zu entfernen...:face_palm::face_palm::face_palm:
                Bildschirmfoto 2024-01-30 um 17.01.05.png
                Habs auch gleich im ursprünglichen post angepasst

                da_WoodyD 1 Antwort Letzte Antwort
                0
                • M muellerra

                  @da_woody Hi, schau mal in Zeile 362 ans Ende, da hab ich vergessen ein / zu entfernen...:face_palm::face_palm::face_palm:
                  Bildschirmfoto 2024-01-30 um 17.01.05.png
                  Habs auch gleich im ursprünglichen post angepasst

                  da_WoodyD Online
                  da_WoodyD Online
                  da_Woody
                  schrieb am zuletzt editiert von
                  #57

                  @muellerra :grin: dachte ich mir, allerdings bin ich nicht so weit drinnen beim proggen.
                  Der Rest passt bei meinen Änderungen?
                  Werden durch den Fehler die DPs nicht komplett angelegt?

                  gruß vom Woody
                  HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                  M 1 Antwort Letzte Antwort
                  0
                  • da_WoodyD da_Woody

                    @muellerra :grin: dachte ich mir, allerdings bin ich nicht so weit drinnen beim proggen.
                    Der Rest passt bei meinen Änderungen?
                    Werden durch den Fehler die DPs nicht komplett angelegt?

                    M Offline
                    M Offline
                    muellerra
                    schrieb am zuletzt editiert von
                    #58

                    @da_woody ich habs mal kurz gedifft, deine Änderungen sollten ja nur die IP-Adressen und der Ordner sein. Das passt.

                    @da_woody sagte in Volumio adapter?:

                    Werden durch den Fehler die DPs nicht komplett angelegt?

                    lass das Skript am besten 2 mal (erfolgreich) durchlaufen. Dann sind aufjedenfall die DP alle erstellt und die event listener alle scharf.

                    Ich habs mal kurz mit einem Volumio durchgetestet, sollte alles auch mit einem Volumio funktionieren. Lediglich "Multiroom Features" könnte es sein dass "Müll" in die DP geschrieben wird. aber bei nur einem Volumio sollte das egal sein, im Zweifel einfach die setState auskommentieren.

                    da_WoodyD 2 Antworten Letzte Antwort
                    1
                    • M muellerra

                      @da_woody ich habs mal kurz gedifft, deine Änderungen sollten ja nur die IP-Adressen und der Ordner sein. Das passt.

                      @da_woody sagte in Volumio adapter?:

                      Werden durch den Fehler die DPs nicht komplett angelegt?

                      lass das Skript am besten 2 mal (erfolgreich) durchlaufen. Dann sind aufjedenfall die DP alle erstellt und die event listener alle scharf.

                      Ich habs mal kurz mit einem Volumio durchgetestet, sollte alles auch mit einem Volumio funktionieren. Lediglich "Multiroom Features" könnte es sein dass "Müll" in die DP geschrieben wird. aber bei nur einem Volumio sollte das egal sein, im Zweifel einfach die setState auskommentieren.

                      da_WoodyD Online
                      da_WoodyD Online
                      da_Woody
                      schrieb am zuletzt editiert von
                      #59

                      @muellerra den Namen hab ich auch auf Studio geändert. Tögal.
                      Mach ich nachher, bin grad auf ein gutes AbendBier im Stammlokal. :)
                      Multitasking, ioB, 3D-Drucken, im Kopf noch Planung für Kanten Abdeckungen für die Wandvertafelung zuschneiden und fräsen...

                      gruß vom Woody
                      HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                      1 Antwort Letzte Antwort
                      1
                      • M muellerra

                        @da_woody ich habs mal kurz gedifft, deine Änderungen sollten ja nur die IP-Adressen und der Ordner sein. Das passt.

                        @da_woody sagte in Volumio adapter?:

                        Werden durch den Fehler die DPs nicht komplett angelegt?

                        lass das Skript am besten 2 mal (erfolgreich) durchlaufen. Dann sind aufjedenfall die DP alle erstellt und die event listener alle scharf.

                        Ich habs mal kurz mit einem Volumio durchgetestet, sollte alles auch mit einem Volumio funktionieren. Lediglich "Multiroom Features" könnte es sein dass "Müll" in die DP geschrieben wird. aber bei nur einem Volumio sollte das egal sein, im Zweifel einfach die setState auskommentieren.

                        da_WoodyD Online
                        da_WoodyD Online
                        da_Woody
                        schrieb am zuletzt editiert von
                        #60

                        @muellerra autsch...

                        19:19:22.367	info	javascript.0 (521) Start javascript script.js.common.Volumio.Volumio
                        19:19:22.392	info	javascript.0 (521) script.js.common.Volumio.Volumio: registered 22 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                        19:19:25.887	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                        19:19:25.887	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                        19:19:26.387	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                        19:19:26.387	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                        19:19:26.887	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                        19:19:26.887	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                        19:19:27.387	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                        19:19:27.387	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                        19:19:27.889	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                        19:19:27.889	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                        19:19:28.391	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                        19:19:28.391	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                        19:19:28.890	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                        19:19:28.890	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                        19:19:29.011	info	javascript.0 (521) Stop script script.js.common.Volumio.Volumio
                        

                        ok, da dürfte was nicht passen... rrBroker gibts bei mir ja nicht.

                        if(getState('ping.1.rrBroker.' + Volumios[ID_Volumio]).val){
                        

                        warum allerdings 942 motzt...

                        gruß vom Woody
                        HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                        M 1 Antwort Letzte Antwort
                        0
                        • da_WoodyD da_Woody

                          @muellerra autsch...

                          19:19:22.367	info	javascript.0 (521) Start javascript script.js.common.Volumio.Volumio
                          19:19:22.392	info	javascript.0 (521) script.js.common.Volumio.Volumio: registered 22 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                          19:19:25.887	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                          19:19:25.887	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                          19:19:26.387	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                          19:19:26.387	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                          19:19:26.887	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                          19:19:26.887	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                          19:19:27.387	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                          19:19:27.387	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                          19:19:27.889	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                          19:19:27.889	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                          19:19:28.391	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                          19:19:28.391	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                          19:19:28.890	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:601:8)
                          19:19:28.890	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:942:9)
                          19:19:29.011	info	javascript.0 (521) Stop script script.js.common.Volumio.Volumio
                          

                          ok, da dürfte was nicht passen... rrBroker gibts bei mir ja nicht.

                          if(getState('ping.1.rrBroker.' + Volumios[ID_Volumio]).val){
                          

                          warum allerdings 942 motzt...

                          M Offline
                          M Offline
                          muellerra
                          schrieb am zuletzt editiert von
                          #61

                          @da_woody hab den Hinweis auf den ping Adapter im Post ergänzt. Danke für den Hinweis!!! Zeile 942 motzt, weil der Fehler in der Funktion restapiRequest ist und die in Zeile 942 aufgerufen wird.
                          Installier mal dem ping Adapter und pass die Zeile an (s. Ursprungspost).
                          Falls noch was auffällt einfach bescheid sagen, mir fällt es manchmal schwer selbst immer alle Abhängigkeiten in meinen unzähligen Skripten sofort zu finden :laughing:

                          da_WoodyD 1 Antwort Letzte Antwort
                          0
                          • M muellerra

                            @da_woody hab den Hinweis auf den ping Adapter im Post ergänzt. Danke für den Hinweis!!! Zeile 942 motzt, weil der Fehler in der Funktion restapiRequest ist und die in Zeile 942 aufgerufen wird.
                            Installier mal dem ping Adapter und pass die Zeile an (s. Ursprungspost).
                            Falls noch was auffällt einfach bescheid sagen, mir fällt es manchmal schwer selbst immer alle Abhängigkeiten in meinen unzähligen Skripten sofort zu finden :laughing:

                            da_WoodyD Online
                            da_WoodyD Online
                            da_Woody
                            schrieb am zuletzt editiert von
                            #62

                            @muellerra okido
                            zeile 7-9

                            var Folder = 'javascript.0.Volumio.Player.Volumio_Player_' // 
                            var Volumios = ["Studio"] //["rStream","workStream","kitchenStream","flurStream"]  //muss in beiden Skripten identisch sein
                            var Volumios_IPs = ["210"] //["82","58","48","72"] //192.168.178 wird dann im Skript hart gesetzt -> ggf. abändern!
                            

                            zeile 601

                               if(getState('ping.0.Studio.' + Volumios[ID_Volumio]).val){
                            

                            zeile 942

                                    restapiRequest('192.168.0.' + Volumios_IPs[ID_Volumio],"getState",ID_Volumio)
                            

                            ping ist schon lange an board, wegen anwesenheit, hinzugefügt Studio
                            0cdad294-7a80-425c-aa3f-80a5b9cb1ac6-grafik.png
                            61088d72-35eb-48a3-b8d7-6c378354c1bf-grafik.png
                            fehler tropsdem noch da... rest-api einstellungen?
                            ich hau mal die hufe hoch, kopf erledigt für heute... droelf.gif

                            gruß vom Woody
                            HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                            M 1 Antwort Letzte Antwort
                            0
                            • da_WoodyD da_Woody

                              @muellerra okido
                              zeile 7-9

                              var Folder = 'javascript.0.Volumio.Player.Volumio_Player_' // 
                              var Volumios = ["Studio"] //["rStream","workStream","kitchenStream","flurStream"]  //muss in beiden Skripten identisch sein
                              var Volumios_IPs = ["210"] //["82","58","48","72"] //192.168.178 wird dann im Skript hart gesetzt -> ggf. abändern!
                              

                              zeile 601

                                 if(getState('ping.0.Studio.' + Volumios[ID_Volumio]).val){
                              

                              zeile 942

                                      restapiRequest('192.168.0.' + Volumios_IPs[ID_Volumio],"getState",ID_Volumio)
                              

                              ping ist schon lange an board, wegen anwesenheit, hinzugefügt Studio
                              0cdad294-7a80-425c-aa3f-80a5b9cb1ac6-grafik.png
                              61088d72-35eb-48a3-b8d7-6c378354c1bf-grafik.png
                              fehler tropsdem noch da... rest-api einstellungen?
                              ich hau mal die hufe hoch, kopf erledigt für heute... droelf.gif

                              M Offline
                              M Offline
                              muellerra
                              schrieb am zuletzt editiert von muellerra
                              #63

                              @da_woody

                              if(getState('ping.0.Studio.' + Volumios[ID_Volumio]).val){
                              

                              ändern zu:

                              if(getState('ping.0.ioBroker.' + Volumios[ID_Volumio]+ '.alive').val){
                              

                              er muss auf alle Fälle auf den boolschen State zugreifen, welcher anzeigt ob das Gerät erreichbar ist oder nicht.
                              Zudem den Volumio Namen, bei dir Studio nicht rein schreiben, der wird ja über die schleife aus dem Volumios Array ausgelesen. Bei dir entspricht dann
                              Volumios[ID_Volumio] gleich "Studio"
                              Anscheinend hab ich damals bei mir keine erweiterte info im ping adapter eingestellt:
                              Bildschirmfoto 2024-01-30 um 21.13.55.png ,
                              daher ohne .alive

                              da_WoodyD 1 Antwort Letzte Antwort
                              0
                              • M muellerra

                                @da_woody

                                if(getState('ping.0.Studio.' + Volumios[ID_Volumio]).val){
                                

                                ändern zu:

                                if(getState('ping.0.ioBroker.' + Volumios[ID_Volumio]+ '.alive').val){
                                

                                er muss auf alle Fälle auf den boolschen State zugreifen, welcher anzeigt ob das Gerät erreichbar ist oder nicht.
                                Zudem den Volumio Namen, bei dir Studio nicht rein schreiben, der wird ja über die schleife aus dem Volumios Array ausgelesen. Bei dir entspricht dann
                                Volumios[ID_Volumio] gleich "Studio"
                                Anscheinend hab ich damals bei mir keine erweiterte info im ping adapter eingestellt:
                                Bildschirmfoto 2024-01-30 um 21.13.55.png ,
                                daher ohne .alive

                                da_WoodyD Online
                                da_WoodyD Online
                                da_Woody
                                schrieb am zuletzt editiert von
                                #64

                                @muellerra moin. dachte, ich hätte eine eingebung gehabt, dachte ich aber nur... wutb.gif
                                hatte im 2. script

                                var Volumios = ["Studio"] //["rStream","workStream","kitchenStream","flurStream"]  //muss in beiden Skripten identisch sein
                                

                                nicht angepasst.
                                dann komplett neu angefangen, da der fehler nach wie vor da war. kurioser weise hat sich durch deine änderung das warning um eine zeile verschoben.

                                09:53:07.452	info	javascript.0 (521) Start javascript script.js.common.Volumio.Volumio
                                09:53:07.473	info	javascript.0 (521) script.js.common.Volumio.Volumio: registered 22 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                                09:53:10.972	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                09:53:10.972	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                09:53:11.471	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                09:53:11.471	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                09:53:11.976	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                09:53:11.976	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                09:53:12.472	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                09:53:12.472	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                09:53:12.972	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                09:53:12.972	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                09:53:13.472	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                09:53:13.472	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                09:53:13.973	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                09:53:13.973	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                09:53:14.473	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                09:53:14.473	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                09:53:14.800	info	javascript.0 (521) Stop script script.js.common.Volumio.Volumio
                                

                                602 nach deinen angaben ausgebessert

                                if(getState('ping.0.ioBroker.' + Volumios[ID_Volumio]).val + '.alive'){
                                

                                der DP ist da und auf true
                                aa2584d3-ec64-4034-83b2-4018208bff73-image.png
                                943 sehe ich auch keinen fehler

                                restapiRequest('192.168.0.' + Volumios_IPs[ID_Volumio],"getState",ID_Volumio)
                                

                                zusätzlich hab ich im states_icons script die zeile 4 geändert, damit ich in den objekten nur mehr player0 bekomme

                                var names = ['Volumio_Player_0'] //,'Volumio_Player_1','Volumio_Player_2','Volumio_Player_3']
                                

                                das klappt auch.
                                ich weis echt nicht mehr weiter... nochmal das neue hauptscript...
                                Volumio.txt
                                alle 3 scripte 3x durchsucht ob ich was übersehn habe. (notepad++ mit suchen und ersetzen)

                                gruß vom Woody
                                HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                                M 1 Antwort Letzte Antwort
                                0
                                • da_WoodyD da_Woody

                                  @muellerra moin. dachte, ich hätte eine eingebung gehabt, dachte ich aber nur... wutb.gif
                                  hatte im 2. script

                                  var Volumios = ["Studio"] //["rStream","workStream","kitchenStream","flurStream"]  //muss in beiden Skripten identisch sein
                                  

                                  nicht angepasst.
                                  dann komplett neu angefangen, da der fehler nach wie vor da war. kurioser weise hat sich durch deine änderung das warning um eine zeile verschoben.

                                  09:53:07.452	info	javascript.0 (521) Start javascript script.js.common.Volumio.Volumio
                                  09:53:07.473	info	javascript.0 (521) script.js.common.Volumio.Volumio: registered 22 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                                  09:53:10.972	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                  09:53:10.972	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                  09:53:11.471	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                  09:53:11.471	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                  09:53:11.976	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                  09:53:11.976	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                  09:53:12.472	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                  09:53:12.472	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                  09:53:12.972	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                  09:53:12.972	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                  09:53:13.472	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                  09:53:13.472	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                  09:53:13.973	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                  09:53:13.973	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                  09:53:14.473	warn	javascript.0 (521) at restapiRequest (script.js.common.Volumio.Volumio:602:8)
                                  09:53:14.473	warn	javascript.0 (521) at Object.getVolumioStates (script.js.common.Volumio.Volumio:943:9)
                                  09:53:14.800	info	javascript.0 (521) Stop script script.js.common.Volumio.Volumio
                                  

                                  602 nach deinen angaben ausgebessert

                                  if(getState('ping.0.ioBroker.' + Volumios[ID_Volumio]).val + '.alive'){
                                  

                                  der DP ist da und auf true
                                  aa2584d3-ec64-4034-83b2-4018208bff73-image.png
                                  943 sehe ich auch keinen fehler

                                  restapiRequest('192.168.0.' + Volumios_IPs[ID_Volumio],"getState",ID_Volumio)
                                  

                                  zusätzlich hab ich im states_icons script die zeile 4 geändert, damit ich in den objekten nur mehr player0 bekomme

                                  var names = ['Volumio_Player_0'] //,'Volumio_Player_1','Volumio_Player_2','Volumio_Player_3']
                                  

                                  das klappt auch.
                                  ich weis echt nicht mehr weiter... nochmal das neue hauptscript...
                                  Volumio.txt
                                  alle 3 scripte 3x durchsucht ob ich was übersehn habe. (notepad++ mit suchen und ersetzen)

                                  M Offline
                                  M Offline
                                  muellerra
                                  schrieb am zuletzt editiert von muellerra
                                  #65

                                  @da_woody

                                  if(getState('ping.<instance>.<iobrokerHostName>.' + Volumios[ID_Volumio] + '.alive').val){
                                  

                                  Das .val ist an falscher stelle. Da wäre ein Syntax highlighting im Forum ganz nett

                                  da_WoodyD 1 Antwort Letzte Antwort
                                  0
                                  • M muellerra

                                    @da_woody

                                    if(getState('ping.<instance>.<iobrokerHostName>.' + Volumios[ID_Volumio] + '.alive').val){
                                    

                                    Das .val ist an falscher stelle. Da wäre ein Syntax highlighting im Forum ganz nett

                                    da_WoodyD Online
                                    da_WoodyD Online
                                    da_Woody
                                    schrieb am zuletzt editiert von
                                    #66

                                    @muellerra dankedeus.gif
                                    wollte schon am rad drehn. hab ich gestern abend echt nicht mehr mitbekommen. näxter fault dann, hab iobroker getippt statt ioBroker. logischer weise selber fehler. fool.gif
                                    okido, die 3 scripte laufen jetzt. jetzt kann ich mich um iQontrol kümmern... banane2.gif

                                    gruß vom Woody
                                    HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                                    M 1 Antwort Letzte Antwort
                                    1
                                    • da_WoodyD da_Woody

                                      @muellerra dankedeus.gif
                                      wollte schon am rad drehn. hab ich gestern abend echt nicht mehr mitbekommen. näxter fault dann, hab iobroker getippt statt ioBroker. logischer weise selber fehler. fool.gif
                                      okido, die 3 scripte laufen jetzt. jetzt kann ich mich um iQontrol kümmern... banane2.gif

                                      M Offline
                                      M Offline
                                      muellerra
                                      schrieb am zuletzt editiert von
                                      #67

                                      @da_woody das freut mich :blush:
                                      Viel Spaß mit dem Skript :blush:

                                      da_WoodyD 1 Antwort Letzte Antwort
                                      0
                                      • M muellerra

                                        @da_woody das freut mich :blush:
                                        Viel Spaß mit dem Skript :blush:

                                        da_WoodyD Online
                                        da_WoodyD Online
                                        da_Woody
                                        schrieb am zuletzt editiert von
                                        #68

                                        @muellerra jup!
                                        auch schon bißchen in iQontrol gefummelt.
                                        7c441a89-4915-4620-b674-b964a08afe0d-grafik.png

                                        gruß vom Woody
                                        HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                                        1 Antwort Letzte Antwort
                                        1
                                        • M Offline
                                          M Offline
                                          muellerra
                                          schrieb am zuletzt editiert von muellerra
                                          #69

                                          Mir kam grad noch in den Sinn, das der im Skript angelegte javascript.0.Allgemeine_Variablen.Player.Volumio_Player_<VolumioID>.playbackInfo.statusIncomingCall Datenpunkt durchaus sinnvoll in Verwendung ist. Ich verwende ihn als Merker für den Play/Pause Status. So werden dann z.b. bei einem aus- oder eingehendem Anruf (über Fritz!Box) alle spielenden Volumios pausiert und nach dem auflegen wieder fortgesetzt. Volumios die nicht spielen werden nicht angesteuert. Bei Playern im Multiroomverbund, wird nur der sendende Volumio getriggert.
                                          Die im Ursprungspost geposteten globalen Funktionen werden vorausgesetzt:

                                          @muellerra sagte in Volumio adapter?:

                                          und hier noch weitere, vllt nützliche, Funktionen (bei mir global definiert)

                                          function getVolumiosReceiving(VolumiosReceiving,ReturnID){
                                          usw...
                                          
                                          var ID_Ringing = "tr-064.0.callmonitor.ringing"
                                          var ID_PhoneStatus = "tr-064.0.callmonitor.toPauseState" // connected, end(wenn nichts ist), ring
                                          var FolderVolumio = 'javascript.0.Allgemeine_Variablen.Player.Volumio_Player_'
                                          on({id: ID_PhoneStatus, change: 'ne'}, function (obj) {
                                              var value = obj.state.val;
                                              var timestamp = obj.state.ts;
                                              var oldValue = obj.oldState.val
                                              var Verursacher = obj.id;
                                              var VolumiosStatus = getVolumiosStatus([])
                                              var ReceivingVolumiosIDs = getVolumiosReceiving([],true)
                                          
                                              if(value != 'end' && value != 'connect'){ // connect da sonst nichts ausgeführt wird, wenn der angenommene anruf beendet wird
                                                  //Aktionen die passieren, wenn jemand anruft oder jemand im gespräch ist
                                                  
                                                  //Volumios auf Pause         
                                                  var PlayingVolumiosIDs = getVolumiosPlaying([],true)
                                                  log(ReceivingVolumiosIDs)
                                                  for(var iop in VolumiosStatus){
                                                      setState(FolderVolumio + iop + '.playbackInfo.statusIncomingCall',VolumiosStatus[iop])
                                                      //nur pis die nicht empfangen auf pause setzen, der rest erledigt sich von alleine
                                                      if(ReceivingVolumiosIDs.indexOf(String(iop)) != -1 ){ // pi empfängt
                                                      }else{ // pi empfängt nicht
                                                          setState(FolderVolumio + iop + '.control.pause',true)
                                          
                                                      }
                                                  }
                                              }
                                              if(value == 'end' && oldValue != 'end'){
                                                  // aktionen, wenn aufgelegt wird oder das telefon nicht mehr klingelt
                                          
                                                  //Volumios auf Play, wenn sie vorher pausiert wurden
                                                  for(var xbf in VolumiosStatus){
                                                      var VolumioStatusHistoric = getState(FolderVolumio + xbf + '.playbackInfo.statusIncomingCall').val
                                                      if(VolumioStatusHistoric == 'play' || VolumioStatusHistoric == "play"){ // hier aber aich nur die die nicht receiven!
                                                          //nur pis die nicht empfangen auf play setzen, bzw toggeln
                                                          if(ReceivingVolumiosIDs.indexOf(String(xbf)) != -1 ){ // pi empfängt
                                                          }else{ // pi empfängt nicht
                                                              setState(FolderVolumio + xbf + '.PlayPause',true) //toogle, da play multiroom killt wenn multiroom aktiv ist...
                                          
                                                          }
                                                      }
                                                  }
                                              }
                                          });  
                                          
                                          da_WoodyD 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          566

                                          Online

                                          32.5k

                                          Benutzer

                                          81.6k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe