function shelly(obj) {
   //Devices-Anzahl erstellen
   if(!existsState('0_userdata.0.shelly-devices.Anzahl')){
       createState('0_userdata.0.shelly-devices.Anzahl', 0, { name: 'Anzahl', desc: 'Anzahl der Devices', type: 'number'});
   };
   //Sortierung erstellen
   if(!existsState('0_userdata.0.shelly-devices.Sortierung')){
       createState('0_userdata.0.shelly-devices.Sortierung', 0, {name: 'Sortierung',type: "number", def: 0, states: {0:"Name",1:"IP",2:"Raum",3:"Update",4:"Gereat",5:"Status",6:"Uptime"}});
   };
   var counter = 0;
   var status_counter = 0;
   var offline_devices = 0;
   let list_of_devices = [];
   var cacheSelector = $('[id=shelly.0.*.name]');
   counter = counter+1;
   cacheSelector.each(function(id, i) {
       var id = id.replace('.name','');
       geraetename = getState(id + ".name").val;
       devicename = id
       devicenameName = devicename.replace('shelly.0.','');
 
       //Gerätetatus
       var connected = getState("shelly.0." + devicenameName + ".online").val;
       if(connected == true) {var status = 1}
       else{var status = 0}
       
       //IP-Adresse
       var ip = getState("shelly.0." + devicenameName + ".hostname").val;
       //Raum
       if(geraetename.indexOf("_AZ_") > 0 ){ raum = "Ankleide";}
       if(geraetename.indexOf("_BZ_") > 0 ){ raum = "Badezimmer";}
       if(geraetename.indexOf("_BR_") > 0 ){ raum = "Buero";}
       if(geraetename.indexOf("_FL_") > 0 ){ raum = "Flur";}
       if(geraetename.indexOf("_GA_") > 0 ){ raum = "Garten";}
       if(geraetename.indexOf("_KE_") > 0 ){ raum = "Keller";}
       if(geraetename.indexOf("_KZ_") > 0 ){ raum = "Kinderzimmer";}
       if(geraetename.indexOf("_KU_") > 0 ){ raum = "Kueche";}
       if(geraetename.indexOf("_SZ_") > 0 ){ raum = "Schlafzimmer";}
       if(geraetename.indexOf("_WZ_") > 0 ){ raum = "Wohnzimmer";}
       if(geraetename.indexOf("Test") > 0 ){ raum = "Test";}
       //Typ
       var geraet = getState("shelly.0." + devicenameName + ".id").val;
       if(geraet == 'shelly1') {geraet = 'Shelly 1';}
       if(geraet == 'shelly1pm') {geraet = 'Shelly 1 PM';}
       if(geraet == 'shellyswitch25') {geraet = 'Shelly 2.5';}
       if(geraet == 'shellyplug-s') {geraet = 'Shelly Plug S';}
       if(geraet == 'shellyplug') {geraet = 'Shelly Plug';}
       if(geraet == 'shellyrgbw2') {geraet = 'Shelly RGBW 2';}
       if(geraet == 'shellyplus1') {geraet = 'Shelly Plus 1';}
       
       //Infos abfragen
       if(status == 1 ) {
           var status = "1"
           //Uptime
   		var uptime = getState("shelly.0." + devicenameName + ".uptime").val;
           var tage = Math.floor(uptime / (24*3600));
           var stunden = Math.floor((uptime % (24*3600))/3600);
           var minuten = Math.floor((uptime % (3600))/60);
           //var sekunden = Math.floor(uptime % 60);      
           if (stunden < 10) {stunden = "0"+stunden};
           if (minuten < 10) {minuten = "0"+minuten};				
           if (tage == 1) {uptime = tage.toString()+" Tag, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";};
           if (tage != 1) {uptime = tage.toString()+" Tage, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";}
       
           //var gereat = gereat.charAt(0).toUpperCase() + gereat.slice(1);
           //Power
           if(geraet != "Shelly RGBW 2") {
               var power = getState("shelly.0." + devicenameName + ".Relay0.Switch").val;    
           }
           else{
               var power = getState("shelly.0." + devicenameName + ".lights.Switch").val;    
           }
           //Verbauch
           if(geraetename.startsWith("SD_")){
               var verbrauch = getState("shelly.0." + devicenameName + ".Relay0.Power").val; 
               //verbrauch = Number(verbrauch);
           }
           else{var verbrauch = 0;}
           //Update
           var update = getState("shelly.0." + devicenameName + ".firmware").val; 
           if(update == true)   {update = "veraltet"}
           else{update = "aktuell"}
           if(!(update)) {update = ""}
   		
   		//Version
   		var version = getState("shelly.0." + devicenameName + ".version").val;
   		//Shelly Plus 1
   		if(geraet == 'Shelly Plus 1') {
   			//Version in String konverteiren
   			version = String(version);
   			//Suchen vom Slash in der Version
   			indexslash = version.indexOf('/');
   			//Funktion zum Suchen des - in der Versionsnummer
   			function getPosition(string, subString, index) {return string.split(subString, index).join(subString).length;}
   			//Minus in der Versionsnummer suchen
   			position = getPosition(version, '-', 2);
   			//Version auslesen
   			version = version.substring(indexslash +1, position);
   		}
   		//normale Shellys
   		else{
   			//Version in String konverteiren
   			version = String(version);
   			//Suche vom v in Version
   			indexv = version.indexOf('v');
   			
   			//Funktion zum Suchen des 2. Punktes in der Versionsnummer
   			function getPosition(string, subString, index) {return string.split(subString, index).join(subString).length;}
   			//2. Punkt in der Versionsnummer suchen
   			position_punkt = getPosition(version, '.', 2);
   			
   			//Version auslesen
   			if(position_punkt < 25){version = version.substring(indexv +1, position_punkt +2);}
   			else{
   				position_bindestrich = getPosition(version, '-', 2);
   				version = version.substring(indexv +1, position_bindestrich);
   			}
   		}
         
           
       }
       if(status == false){
           var status = "0"
           var uptime = ""
           var version = ""
           //var ip = ""
           //var geraet = ""
           var power = false
           var update = ""
           var verbrauch = 0
           offline_devices = offline_devices+1;
       }
       
       //Alle Werte eines Gerätes in JSON schreiben
       list_of_devices.push({"DeviceName": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Geraet": geraet, "Power": power, "Update": update, "Raum": raum, "Verbrauch": verbrauch});
   }); 
   
   //JSON sortieren
   var sortierung = getState("0_userdata.0.shelly-devices.Sortierung").val;
   //Nach Namen sortieren
   if(sortierung == 0){
       list_of_devices.sort((a, b) => {
   		return a.DeviceName.localeCompare(b.DeviceName);
       });
   };
   
   //Nach IP sortieren
   if(sortierung == 1){
       list_of_devices.sort((a, b) => {
   		return a.IP.localeCompare(b.IP);
       });
   };
   //Nach Raum sortieren
   if(sortierung == 2){
       list_of_devices.sort((a, b) => {
   		//return a.Raum.localeCompare(b.Raum);
           return a.Raum.localeCompare(b.Raum) || a.DeviceName.localeCompare(b.DeviceName);
       });
   };
   //Nach Gerätetyp sortieren
   if(sortierung == 3){
       list_of_devices.sort((a, b) => {
   		return a.Geraet.localeCompare(b.Geraet) || a.DeviceName.localeCompare(b.DeviceName);
       });
   };
   //Nach Firmware sortieren
   if(sortierung == 4){
       list_of_devices.sort((a, b) => {
   		return a.Version.localeCompare(b.Version) || a.DeviceName.localeCompare(b.DeviceName);
       });
   };
   //Nach Status sortieren
   if(sortierung == 5){
       list_of_devices.sort((a, b) => {
   		return a.Status.localeCompare(b.Status) || a.DeviceName.localeCompare(b.DeviceName);
       });
   };
   //Nach Uptime sortieren
   if(sortierung == 6){
       list_of_devices.sort((a, b) => {
   		return a.Uptime.localeCompare(b.Uptime) || a.DeviceName.localeCompare(b.DeviceName);
       });
   };
   
   //console.log(list_of_devices)
     
   //Inhalt aus JSON in DPs schreiben
   counter = 0;
   list_of_devices.forEach(device => {
       //Device Counter
       counter = counter+1;
       
       // Device-Name
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Device-Name";
       createState(dp, 'empty', { name: 'Device-Name', desc: '', type: 'string', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.DeviceName, 800);
       
       // Uptime
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Uptime"; 
       createState(dp, 'empty', { name: 'Uptime', desc: '', type: 'string', role: '',read: true, write: true });
       setStateDelayed(dp, device.Uptime, 800);
       
       // Status
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Status";
       createState(dp, 'empty', { name: 'Status', desc: '', type: 'string', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.Status, 800);
       
       // Version
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Version";
       createState(dp, 'empty', { name: 'Version', desc: '', type: 'string', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.Version, 800);
       
       // IP
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".IP";
       createState(dp, 'empty', { name: 'IP', desc: '', type: 'string', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.IP, 800);
       
       // Gereatetyp
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Geraet";
       createState(dp, 'empty', { name: 'Geraet', desc: '', type: 'string', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.Geraet, 800);
       
       // Power
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Power";
       createState(dp, 'empty', { name: 'Power', desc: '', type: 'boolean', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.Power, 800);
       
       // Verbrauch
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Verbrauch";
       createState(dp, 'empty', { name: 'Verbrauch', desc: '', type: 'number', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.Verbrauch, 800);
       
       // Update
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Update";
       createState(dp, 'empty', { name: 'Update', desc: '', type: 'string', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.Update, 800);
       
       // Raum
       dp="0_userdata.0.shelly-devices.Device_"+counter.toString()+".Raum";
       createState(dp, 'empty', { name: 'Raum', desc: '', type: 'string', role: '',read: true, write: true }); 
       setStateDelayed(dp, device.Raum, 800);
       // Raum
   });
   
   // 1 von der Anzahl der Offlien-Geräte abziehen (wenn Shelly offline), da der Shelly von der Druckerbeleuchtung nicht immer an ist
   var shellyrgbw2 = getState("shelly.0.SHRGBW2#A89CF7#1.online").val;
   if(shellyrgbw2 == false) {offline_devices = offline_devices -1};
   
   // 1 von der Anzahl der Offlien-Geräte abziehen (wenn Shelly offline), wenn der Pool abgebaut ist (Letzte Änderung Leistung > 12h)
   var whirlpool_power_last_change = getState("alias.0.Garten.SD_GA_Whirlpool.POWER").lc;
   var date1 = new Date(whirlpool_power_last_change);
   var date2 = new Date();
   var diff = date2.getTime() - date1.getTime();
   var stunden = Math.floor(diff / (1000 * 60 * 60));
   if(stunden > 0){offline_devices = offline_devices -1;}
   //Gesamt Anzahl der online Geräte berechnen
   dp="0_userdata.0.shelly-devices.Anzahl";
   createState(dp, 'empty', { name: 'Anzahl', desc: '', type: 'number', role: '',read: true, write: true }); 
   setStateDelayed(dp, counter, 800);
   
   
   //Letzte aktualisierung
   var datum = new Date();
   var heute = datum.getDate()+ "." + (datum.getMonth()+ 1)+"." + datum.getFullYear()+" " +datum.getHours() +":" + datum.getMinutes() +":" + datum.getSeconds() + " Uhr" ;
   createState('0_userdata.0.shelly-devices.Letztes_Update', 0, { name: 'Letztes_Update', desc: '', type: 'string', role: '',read: true, write: true }); 
   setStateDelayed('0_userdata.0.shelly-devices.Letztes_Update', heute, 800);
   //Alle Geräte online
   if(status_counter == counter) {
   	dp="0_userdata.0.shelly-devices.Alle_Devices_verbunden";
   	createState(dp, 'empty', { name: 'Alle_Devices_verbunden', desc: '', type: 'string', role: '',read: true, write: true }); 
   	setStateDelayed(dp, "1", 800);
   }
   else{
   	dp="0_userdata.0.shelly-devices.Alle_Devices_verbunden";
   	createState(dp, 'empty', { name: 'Alle_Devices_verbunden', desc: '', type: 'string', role: '',read: true, write: true }); 
   	setStateDelayed(dp, "0", 800);
   }
   
   //Anzahl offline Geräte
   dp="0_userdata.0.shelly-devices.Anzahl_offline_Devices";
   createState(dp, 'empty', { name: 'Anzahl_offline_Devices', desc: '', type: 'number', role: '',read: true, write: true }); 
   setStateDelayed(dp, offline_devices, 800);
}
//Trigger definieren
schedule("* * * * *", shelly);
on({ id: "0_userdata.0.shelly-devices.Sortierung" }, shelly);
$('shelly.0.*.online').on(shelly); 
shelly();