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();