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. Skripten / Logik
  4. JavaScript
  5. [gelöst] Hilfe bei der Verwendung von JSON

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.3k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    958

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[gelöst] Hilfe bei der Verwendung von JSON

Geplant Angeheftet Gesperrt Verschoben JavaScript
8 Beiträge 3 Kommentatoren 521 Aufrufe 2 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.
  • K Offline
    K Offline
    Kuddel
    schrieb am zuletzt editiert von Kuddel
    #1

    Hallo zusammen,

    ich habe mir für die Übersicht meiner Shellys ein kurzes Skript geschrieben, dass die Infos aus dem Shelly-Adapter in DPs schreibt, die ich dann in meiner VIS anzeigen kann:

    Kleiner Auszug:
    17b6f9f6-6730-43cb-82d4-a2c328e746a5-grafik.png

    Skript:

       // Liest den Adapter Shelly.0 aus und erstelle neue Datenpunkte unter javascript
    
       schedule('*/10 * * * * *', function (obj) {
       	if(!existsState('0_userdata.0.shelly-devices.Anzahl')){
       		createState('0_userdata.0.shelly-devices.Anzahl', 0, { name: 'Anzahl', desc: 'Anzahl der Devices', type: 'number'});
       	};
       	var counter = 0;
       	var status_counter = 0;
       	var offline_devices = 0;
    
       	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 = true}
       		else{var status = false}
       		
       		//IP-Adresse
       		var ip = getState("shelly.0." + devicenameName + ".hostname").val;
    
       		//Infos abfragen
       		if(status == true ) {
       			var status = "1"
    
       			//Typ
       			var geraet = getState("shelly.0." + devicenameName + ".id").val;
       			if(geraet == 'shelly1') {geraet = 'Shelly 1';}
       			if(geraet == 'shellyswitch25') {geraet = 'Shelly 2.5';}
       			if(geraet == 'shellyplug-s') {geraet = 'Shelly Plug S';}
       			if(geraet == 'shellyrgbw2') {geraet = 'Shelly RGBW 2';}
       			if(geraet == 'shellyplus1') {geraet = 'Shelly Plus 1';}
    
       			
       			//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 = getPosition(version, '.', 2);
       					
       					//Version auslesen
       					version = version.substring(indexv +1, position +2);
       				}
    
       			//Uptime
       			var uptime = getState("shelly.0." + devicenameName + ".uptime").val;
       				//Uptime in String konvertieren
       				uptime = String(uptime);
       				//Tage
       				indexday = uptime.indexOf('D');
       				
       				if(indexday != 0) {
       						tage = uptime.substring(0, indexday);
       						if(tage == 1) {tage = tage + ' Tag, ';}
       						if(tage > 1) {tage = tage + ' Tage, ';}
       				}
       				if(indexday < 1) {tage = '0 Tage, ';}
       			
       				//Stunden
       				indexstd = uptime.indexOf(':');
       				stunden = uptime.substring(indexday +1 , indexstd );
       				if(stunden == 1){stunden = stunden + ' Std, ';}
       				else{stunden = stunden + ' Std, ';}
       				//Minuten
       				minuten = uptime.substring(indexstd +1 , indexstd +3 );
       				minuten = minuten + ' Min';
    
       				uptime = tage + stunden + minuten;
    
    
       			//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;    
       			}
    
       			//Update
       			var update = getState("shelly.0." + devicenameName + ".firmware").val; 
       			if(update == true)   {update = "veraltet"}
       			else{update = "aktuell"}
       			if(!(update)) {update = ""}
       		}
       		if(status == false){
       			var status = "0"
       			var uptime = ""
       			var version = ""
       			//var ip = ""
       			var geraet = ""
       			var power = false
       			var update = ""
       			offline_devices = offline_devices+1;
       		}
       		
    
       		//DPs befüllen
    
       		// 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, geraetename, 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, 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, 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, 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, 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, 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, power, 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, update, 800);
    
    
       		counter = counter+1;
       		
    
       		
       	}); 
    
       	// Wegen shelly.0.info muss vom Counter 1 abgezogen werden
       	counter = counter - 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);
       }); 
    
    
    

    Jetzt geht es ein Bisschen tiefer in javascript, wobei ich Hilfe benötige.

    Da die Geräte im Shelly-Adapter nach der Seriennummer sortiert sind, wollte ich jetzt einen kurzen Zwischenschritt über ein JSON Array machen, um die Geräte zu sortieren (nach Name oder IP oder ...).

    Frage 1: Wie füge ich die Daten in ein bestehendes JSON hinzu?
    Mein Versuch funzt leider nicht, da "push" nicht erkannt wird:

    //Alle Werte eines Gerätes in JSON schreiben
    if(typeof json === 'undefined' || json === null){
    	let json = [
                    {"Device-Name": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Gereat": gereat, "Power": power, "Update": update},
                ]
    }
    else{
    	let json.push = [
                    {"Device-Name": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Gereat": gereat, "Power": power, "Update": update},
                ]
    }
    

    Frage 2: Wie kann ich die Daten im JSON sortieren?
    Per VIS möchte ich das Attribut zur Sortierung auswählen. Daher steht im DP "0_userdata.0.shelly-devices.Sortierung" ein Wert 0 bis X, worüber das Attribut ausgewählt werden soll

    Beispiel: 0 = Name, somit sollen die Werte nach dem Attribut "Device-Name" sortiert werden

    Wenn die Werte sortiert sind, werden die einzelnen Attribute aus dem JSON in den jeweiligen DP geschrieben:

    0ca37693-e21b-4294-b7ba-5ae1a47f356a-grafik.png

    Vielen Dank schon einmal

    OliverIOO 1 Antwort Letzte Antwort
    0
    • K Kuddel

      Hallo zusammen,

      ich habe mir für die Übersicht meiner Shellys ein kurzes Skript geschrieben, dass die Infos aus dem Shelly-Adapter in DPs schreibt, die ich dann in meiner VIS anzeigen kann:

      Kleiner Auszug:
      17b6f9f6-6730-43cb-82d4-a2c328e746a5-grafik.png

      Skript:

         // Liest den Adapter Shelly.0 aus und erstelle neue Datenpunkte unter javascript
      
         schedule('*/10 * * * * *', function (obj) {
         	if(!existsState('0_userdata.0.shelly-devices.Anzahl')){
         		createState('0_userdata.0.shelly-devices.Anzahl', 0, { name: 'Anzahl', desc: 'Anzahl der Devices', type: 'number'});
         	};
         	var counter = 0;
         	var status_counter = 0;
         	var offline_devices = 0;
      
         	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 = true}
         		else{var status = false}
         		
         		//IP-Adresse
         		var ip = getState("shelly.0." + devicenameName + ".hostname").val;
      
         		//Infos abfragen
         		if(status == true ) {
         			var status = "1"
      
         			//Typ
         			var geraet = getState("shelly.0." + devicenameName + ".id").val;
         			if(geraet == 'shelly1') {geraet = 'Shelly 1';}
         			if(geraet == 'shellyswitch25') {geraet = 'Shelly 2.5';}
         			if(geraet == 'shellyplug-s') {geraet = 'Shelly Plug S';}
         			if(geraet == 'shellyrgbw2') {geraet = 'Shelly RGBW 2';}
         			if(geraet == 'shellyplus1') {geraet = 'Shelly Plus 1';}
      
         			
         			//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 = getPosition(version, '.', 2);
         					
         					//Version auslesen
         					version = version.substring(indexv +1, position +2);
         				}
      
         			//Uptime
         			var uptime = getState("shelly.0." + devicenameName + ".uptime").val;
         				//Uptime in String konvertieren
         				uptime = String(uptime);
         				//Tage
         				indexday = uptime.indexOf('D');
         				
         				if(indexday != 0) {
         						tage = uptime.substring(0, indexday);
         						if(tage == 1) {tage = tage + ' Tag, ';}
         						if(tage > 1) {tage = tage + ' Tage, ';}
         				}
         				if(indexday < 1) {tage = '0 Tage, ';}
         			
         				//Stunden
         				indexstd = uptime.indexOf(':');
         				stunden = uptime.substring(indexday +1 , indexstd );
         				if(stunden == 1){stunden = stunden + ' Std, ';}
         				else{stunden = stunden + ' Std, ';}
         				//Minuten
         				minuten = uptime.substring(indexstd +1 , indexstd +3 );
         				minuten = minuten + ' Min';
      
         				uptime = tage + stunden + minuten;
      
      
         			//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;    
         			}
      
         			//Update
         			var update = getState("shelly.0." + devicenameName + ".firmware").val; 
         			if(update == true)   {update = "veraltet"}
         			else{update = "aktuell"}
         			if(!(update)) {update = ""}
         		}
         		if(status == false){
         			var status = "0"
         			var uptime = ""
         			var version = ""
         			//var ip = ""
         			var geraet = ""
         			var power = false
         			var update = ""
         			offline_devices = offline_devices+1;
         		}
         		
      
         		//DPs befüllen
      
         		// 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, geraetename, 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, 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, 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, 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, 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, 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, power, 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, update, 800);
      
      
         		counter = counter+1;
         		
      
         		
         	}); 
      
         	// Wegen shelly.0.info muss vom Counter 1 abgezogen werden
         	counter = counter - 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);
         }); 
      
      
      

      Jetzt geht es ein Bisschen tiefer in javascript, wobei ich Hilfe benötige.

      Da die Geräte im Shelly-Adapter nach der Seriennummer sortiert sind, wollte ich jetzt einen kurzen Zwischenschritt über ein JSON Array machen, um die Geräte zu sortieren (nach Name oder IP oder ...).

      Frage 1: Wie füge ich die Daten in ein bestehendes JSON hinzu?
      Mein Versuch funzt leider nicht, da "push" nicht erkannt wird:

      //Alle Werte eines Gerätes in JSON schreiben
      if(typeof json === 'undefined' || json === null){
      	let json = [
                      {"Device-Name": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Gereat": gereat, "Power": power, "Update": update},
                  ]
      }
      else{
      	let json.push = [
                      {"Device-Name": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Gereat": gereat, "Power": power, "Update": update},
                  ]
      }
      

      Frage 2: Wie kann ich die Daten im JSON sortieren?
      Per VIS möchte ich das Attribut zur Sortierung auswählen. Daher steht im DP "0_userdata.0.shelly-devices.Sortierung" ein Wert 0 bis X, worüber das Attribut ausgewählt werden soll

      Beispiel: 0 = Name, somit sollen die Werte nach dem Attribut "Device-Name" sortiert werden

      Wenn die Werte sortiert sind, werden die einzelnen Attribute aus dem JSON in den jeweiligen DP geschrieben:

      0ca37693-e21b-4294-b7ba-5ae1a47f356a-grafik.png

      Vielen Dank schon einmal

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von OliverIO
      #2

      @kuddel

      Zu 1)
      die richtige form wäre

      let json = [];
      json.push({"Device-Name": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Gereat": gereat, "Power": power, "Update": update};
      

      So wie du es aufgeschrieben hast würdest du direkt ein Array mit einem Objekt definieren, aber ohne das Push.
      Push wäre hier ein property des Objekts json was aber nicht gibt, Da ja oben abgefragt wird ob null oder undefined
      Das Komma nach der letzten geschweiften Klammer würde ebenfalls noch zu einem Fehler führen.

      Zu 2)
      https://www.javascripttutorial.net/array/javascript-sort-an-array-of-objects/

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      K 2 Antworten Letzte Antwort
      0
      • OliverIOO OliverIO

        @kuddel

        Zu 1)
        die richtige form wäre

        let json = [];
        json.push({"Device-Name": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Gereat": gereat, "Power": power, "Update": update};
        

        So wie du es aufgeschrieben hast würdest du direkt ein Array mit einem Objekt definieren, aber ohne das Push.
        Push wäre hier ein property des Objekts json was aber nicht gibt, Da ja oben abgefragt wird ob null oder undefined
        Das Komma nach der letzten geschweiften Klammer würde ebenfalls noch zu einem Fehler führen.

        Zu 2)
        https://www.javascripttutorial.net/array/javascript-sort-an-array-of-objects/

        K Offline
        K Offline
        Kuddel
        schrieb am zuletzt editiert von Kuddel
        #3

        @oliverio die Sortierung vernachlässige ich erst einmal noch.

        Aktuell macht die Schleife zur Erstellung / zum Schreiben der DPs Probleme, weil sie die Variable json nicht finden kann

        Skript

        // Liest den Adapter Shelly.0 aus und erstelle neue Datenpunkte unter javascript
        
        //schedule('* * * * * *', function (obj) {
        schedule('*/10 * * * * *', function (obj) {
        //schedule('* * * * *', function (obj) {
        
           //Devices-Anzahl erstenne
           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"}});
           };
        
        
           var counter = 0;
           var status_counter = 0;
           var offline_devices = 0;
        
           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 = true}
               else{var status = false}
               
               //IP-Adresse
               var ip = getState("shelly.0." + devicenameName + ".hostname").val;
        
               //Infos abfragen
               if(status == true ) {
                   var status = "1"
        
                   //Typ
                   var geraet = getState("shelly.0." + devicenameName + ".id").val;
                   if(geraet == 'shelly1') {geraet = 'Shelly 1';}
                   if(geraet == 'shellyswitch25') {geraet = 'Shelly 2.5';}
                   if(geraet == 'shellyplug-s') {geraet = 'Shelly Plug S';}
                   if(geraet == 'shellyrgbw2') {geraet = 'Shelly RGBW 2';}
                   if(geraet == 'shellyplus1') {geraet = 'Shelly Plus 1';}
                   
                   //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 = getPosition(version, '.', 2);
                           
                           //Version auslesen
                           version = version.substring(indexv +1, position +2);
                       }
        
                   //Uptime
           		var uptime = getState("shelly.0." + devicenameName + ".uptime").val;
                       //Uptime in String konvertieren
                       uptime = String(uptime);
                       //Tage
                       indexday = uptime.indexOf('D');
                       
                       if(indexday != 0) {
                               tage = uptime.substring(0, indexday);
                               if(tage == 1) {tage = tage + ' Tag, ';}
                               if(tage > 1) {tage = tage + ' Tage, ';}
                       }
                       if(indexday < 1) {tage = '0 Tage, ';}
                   
                       //Stunden
                       indexstd = uptime.indexOf(':');
                       stunden = uptime.substring(indexday +1 , indexstd );
                       if(stunden == 1){stunden = stunden + ' Std, ';}
                       else{stunden = stunden + ' Std, ';}
                       //Minuten
                       minuten = uptime.substring(indexstd +1 , indexstd +3 );
                       minuten = minuten + ' Min';
        
                       uptime = tage + stunden + minuten;
               
        
        
                   //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;    
                   }
        
                   //Update
                   var update = getState("shelly.0." + devicenameName + ".firmware").val; 
                   if(update == true)   {update = "veraltet"}
                   else{update = "aktuell"}
                   if(!(update)) {update = ""}
               }
               if(status == false){
                   var status = "0"
                   var uptime = ""
                   var version = ""
                   //var ip = ""
                   var geraet = ""
                   var power = false
                   var update = ""
                   offline_devices = offline_devices+1;
               }
               
               //Alle Werte eines Gerätes in JSON schreiben
               let json = [];
               json.push({"Device-Name": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Gereat": geraet, "Power": power, "Update": update});
        
           }); 
           
        
        
           //JSON sortieren
           var sortierung = getState("0_userdata.0.shelly-devices.Sortierung").val;
           //Nach Namen sortieren
           console.log(sortierung);
         
        
        
           //Inhalt aus JSON in DPs schreiben
           counter = 0;
           json.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.geraetename, 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);
               // 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);
        
           });
        
        
        
           // Wegen shelly.0.info muss vom Counter 1 abgezogen werden
           counter = counter - 1
        
           // 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};
           
        
           //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);
        }); 
        
        
        

        Error:

        javascript.1	2022-07-25 11:04:30.007	error	at processTimers (node:internal/timers:502:7)
        javascript.1	2022-07-25 11:04:30.007	error	at listOnTimeout (node:internal/timers:559:17)
        javascript.1	2022-07-25 11:04:30.007	error	at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Invocation.js:228:7)
        javascript.1	2022-07-25 11:04:30.007	error	at /opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Invocation.js:268:28
        javascript.1	2022-07-25 11:04:30.007	error	at Job.invoke (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Job.js:171:15)
        javascript.1	2022-07-25 11:04:30.007	error	at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1408:34)
        javascript.1	2022-07-25 11:04:30.007	error	at Object.<anonymous> (script.js.java.abfragen.shelly_infos_neu:160:5)
        javascript.1	2022-07-25 11:04:30.007	error	Error in callback: ReferenceError: json is not defined
        

        EDIT:

        Fehler gefunden:

        Das

        let json = [];
        

        muss nach oben an den Anfang. Jetzt wird auch die Schleife abgearbeitet

        1 Antwort Letzte Antwort
        0
        • OliverIOO OliverIO

          @kuddel

          Zu 1)
          die richtige form wäre

          let json = [];
          json.push({"Device-Name": geraetename, "Uptime": uptime, "Status": status, "Version": version, "IP": ip, "Gereat": gereat, "Power": power, "Update": update};
          

          So wie du es aufgeschrieben hast würdest du direkt ein Array mit einem Objekt definieren, aber ohne das Push.
          Push wäre hier ein property des Objekts json was aber nicht gibt, Da ja oben abgefragt wird ob null oder undefined
          Das Komma nach der letzten geschweiften Klammer würde ebenfalls noch zu einem Fehler führen.

          Zu 2)
          https://www.javascripttutorial.net/array/javascript-sort-an-array-of-objects/

          K Offline
          K Offline
          Kuddel
          schrieb am zuletzt editiert von
          #4

          @oliverio ich habe jetzt mit der Sortierung angefangen:

          console.log("Test Sortierung");
              json.forEach((e) => {
              console.log(`${e.DeviceName}`);
              });
          

          Ergebnis:

          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: Shelly-1-Plus-Test
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: RA_SZ_Front
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: RA_KZ_Front
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: LS_BZ_Lichtschalter
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: HA_GA_Ventil-5
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_GA_Poolthermometer
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: Shelly1-Test
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: LS_BR_Deckenlampe
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: LS_AZ_Lichtschalter
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: LA_BR_3D-Drucker
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_Ladegereat
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_PCs
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_Monitore
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_ESX-NUC
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_FL_Lichterkette
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_SZ_Kommode
          javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_3D-Drucker
          
          OliverIOO 1 Antwort Letzte Antwort
          0
          • K Kuddel

            @oliverio ich habe jetzt mit der Sortierung angefangen:

            console.log("Test Sortierung");
                json.forEach((e) => {
                console.log(`${e.DeviceName}`);
                });
            

            Ergebnis:

            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: Shelly-1-Plus-Test
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: RA_SZ_Front
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: RA_KZ_Front
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: LS_BZ_Lichtschalter
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: HA_GA_Ventil-5
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_GA_Poolthermometer
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: Shelly1-Test
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: LS_BR_Deckenlampe
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: LS_AZ_Lichtschalter
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: LA_BR_3D-Drucker
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_Ladegereat
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_PCs
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_Monitore
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_ESX-NUC
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_FL_Lichterkette
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_SZ_Kommode
            javascript.1	2022-07-25 11:32:20.009	info	script.js.java.abfragen.shelly_infos_neu: SD_BR_3D-Drucker
            
            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von OliverIO
            #5

            @kuddel
            schade, du hast dir den link nicht durchgelesen. Nicht mit forEach, geht zwar auch ist aber
            aufwändiger

            json.sort((a, b) => {
                return a.name.localeCompare(b.name));
            });
            

            als anfänger erst mal alle befehle in der referenz nachlesen
            mdn hat viele Beschreibungen auch auf deutsch
            https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
            bei google einfach

            mdn <javascriptbefehl>
            

            eingeben

            noch ein Tip, nenne die variable nicht json, da sie ggfs. mit dem eingebauten Befehlsobjekt
            JSON kollidieren könnte.

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            K paul53P 2 Antworten Letzte Antwort
            0
            • OliverIOO OliverIO

              @kuddel
              schade, du hast dir den link nicht durchgelesen. Nicht mit forEach, geht zwar auch ist aber
              aufwändiger

              json.sort((a, b) => {
                  return a.name.localeCompare(b.name));
              });
              

              als anfänger erst mal alle befehle in der referenz nachlesen
              mdn hat viele Beschreibungen auch auf deutsch
              https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
              bei google einfach

              mdn <javascriptbefehl>
              

              eingeben

              noch ein Tip, nenne die variable nicht json, da sie ggfs. mit dem eingebauten Befehlsobjekt
              JSON kollidieren könnte.

              K Offline
              K Offline
              Kuddel
              schrieb am zuletzt editiert von
              #6

              @oliverio vielen Dank für deine Hilfe.

              Habe es jetzt genau so hinbekommen, wie ich wollte :-)

              1 Antwort Letzte Antwort
              0
              • OliverIOO OliverIO

                @kuddel
                schade, du hast dir den link nicht durchgelesen. Nicht mit forEach, geht zwar auch ist aber
                aufwändiger

                json.sort((a, b) => {
                    return a.name.localeCompare(b.name));
                });
                

                als anfänger erst mal alle befehle in der referenz nachlesen
                mdn hat viele Beschreibungen auch auf deutsch
                https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
                bei google einfach

                mdn <javascriptbefehl>
                

                eingeben

                noch ein Tip, nenne die variable nicht json, da sie ggfs. mit dem eingebauten Befehlsobjekt
                JSON kollidieren könnte.

                paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von
                #7

                @oliverio sagte: nenne die variable nicht json

                Sie enthält auch kein JSON, sondern ein Array.

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                K 1 Antwort Letzte Antwort
                0
                • paul53P paul53

                  @oliverio sagte: nenne die variable nicht json

                  Sie enthält auch kein JSON, sondern ein Array.

                  K Offline
                  K Offline
                  Kuddel
                  schrieb am zuletzt editiert von Kuddel
                  #8

                  Eine Frage habe ich dann doch noch:

                  Aktuell läuft das Skript ja alle 10 Sekunden.

                  Wie bekomme ich es hin, dass es zusätzlich zum schedule auch ausgeführt wird, wenn es gestartet wird und wenn der DP zur Sortierung sich ändert?

                  EDIT:

                  Habe es schon selber hinbekommen.

                  Das ganze Skript in eine Funktion, die dann aufgerufen wird

                  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

                  791

                  Online

                  32.6k

                  Benutzer

                  82.2k

                  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