Skip to content
  • 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
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Erledigt] Skript Lichtzählen [..] angezeigt

NEWS

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

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

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

[Erledigt] Skript Lichtzählen [..] angezeigt

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
23 Beiträge 5 Kommentatoren 1.5k Aufrufe 5 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.
  • malorossM Offline
    malorossM Offline
    maloross
    schrieb am zuletzt editiert von maloross
    #1

    Guten Morgen,
    habe ein an sich lauffähiges Skript hier aus dem Forum, das leider noch kleine Schönheitsfehler hat.

    1. Die Ausgabe der jeweiligen Räume funktioniert generell nicht
    2. Namensanzeige der geschalteten Lampe funktioniert nur bei Homematic, nicht bei anderen.

    Ich vermute, es liegt an der Struktur der Schleife zum Auslesen der jeweiligen Daten. Hier ein Auszug:

    // Schleife Homematic 
     cacheSelectorHomematic.each(function(id, i) {
            var obj = getObject(id);
            var name = getObject(id).common.name;
            var status = getState(id).val; 
            var devicename = name.substring(0, name.indexOf(".STATE"));
            var raumname = getObject(id, "rooms");
     
            if (logging) {
                log('-------');
                log('Kanal: ' + name);
                log('Status: ' + status);
            }
            if (status) {
                ++anzahlLichterAn;
                textLichterAn.push(devicename);
                textRaum.push(raumname.enumNames);
            }
            ++anzahlLichter; 
        });
    
    
    // Schleife Tradfri   
    if (logging) log('#### Tradfri ##### ');
    cacheSelectorTradfri.each(function(id, i) {
            var obj = getObject(id);
            var name = getObject(id).common.name;
            var status = getState(id).val;
            var devicename = name.substring(0, name.indexOf(".state"));
            var raumname = getObject(id, "rooms"); 
            if (logging) {
                log('-------');
                log('Kanal: ' + name);
                log('Status: ' + status);
            }
            if (status) {
                ++anzahlLichterAn;
                textLichterAn.push(devicename);
                textRaum.push(raumname.enumNames);
            }
            ++anzahlLichter;
        });
    
    

    Was habe ich da falsch gemacht?

    Auch Frauen können sich für Technik begeistern! ;)

    Equipment:
    diverse HM-, HMIP-, Aeotec- Tradfri- Sonos- und Fibaro-Geräte, Master-/Slavesystem auf 2 Raspi4, NAS

    T 1 Antwort Letzte Antwort
    0
    • malorossM maloross

      Guten Morgen,
      habe ein an sich lauffähiges Skript hier aus dem Forum, das leider noch kleine Schönheitsfehler hat.

      1. Die Ausgabe der jeweiligen Räume funktioniert generell nicht
      2. Namensanzeige der geschalteten Lampe funktioniert nur bei Homematic, nicht bei anderen.

      Ich vermute, es liegt an der Struktur der Schleife zum Auslesen der jeweiligen Daten. Hier ein Auszug:

      // Schleife Homematic 
       cacheSelectorHomematic.each(function(id, i) {
              var obj = getObject(id);
              var name = getObject(id).common.name;
              var status = getState(id).val; 
              var devicename = name.substring(0, name.indexOf(".STATE"));
              var raumname = getObject(id, "rooms");
       
              if (logging) {
                  log('-------');
                  log('Kanal: ' + name);
                  log('Status: ' + status);
              }
              if (status) {
                  ++anzahlLichterAn;
                  textLichterAn.push(devicename);
                  textRaum.push(raumname.enumNames);
              }
              ++anzahlLichter; 
          });
      
      
      // Schleife Tradfri   
      if (logging) log('#### Tradfri ##### ');
      cacheSelectorTradfri.each(function(id, i) {
              var obj = getObject(id);
              var name = getObject(id).common.name;
              var status = getState(id).val;
              var devicename = name.substring(0, name.indexOf(".state"));
              var raumname = getObject(id, "rooms"); 
              if (logging) {
                  log('-------');
                  log('Kanal: ' + name);
                  log('Status: ' + status);
              }
              if (status) {
                  ++anzahlLichterAn;
                  textLichterAn.push(devicename);
                  textRaum.push(raumname.enumNames);
              }
              ++anzahlLichter;
          });
      
      

      Was habe ich da falsch gemacht?

      T Offline
      T Offline
      Tictactoo
      schrieb am zuletzt editiert von
      #2

      @maloross Ist das deine komplettes Skirpt?

      Was mir jetzt auf die schnelle auffällt ist, dass in deinem Code für if(logging) Bedingung keine log für den Raum drin ist, sondern der Array nur unten bei is(status) in deine Variable textRaum gepusht wird. Da innerhalb des geposteten Skripts damit allerdings nicht gearbeitet wird, ist schwer zu sagen, was genau da nicht richtig läuft.

      Du könnntest btw auch die substring Methode durch ".replace(".STATE", "")" ersetzen, dann musst du nicht mit den Positionen der Chars arbeiten.

      In deinem Tradfri-Teil sieht es an sich erstmal net falsch aus, allerdings ist auch hier schwer zu sagen was falsch sein könnte, weil man anhand deines Codes nicht sieht, welche Variablen er überhaupt reingibt.

      malorossM 2 Antworten Letzte Antwort
      0
      • T Tictactoo

        @maloross Ist das deine komplettes Skirpt?

        Was mir jetzt auf die schnelle auffällt ist, dass in deinem Code für if(logging) Bedingung keine log für den Raum drin ist, sondern der Array nur unten bei is(status) in deine Variable textRaum gepusht wird. Da innerhalb des geposteten Skripts damit allerdings nicht gearbeitet wird, ist schwer zu sagen, was genau da nicht richtig läuft.

        Du könnntest btw auch die substring Methode durch ".replace(".STATE", "")" ersetzen, dann musst du nicht mit den Positionen der Chars arbeiten.

        In deinem Tradfri-Teil sieht es an sich erstmal net falsch aus, allerdings ist auch hier schwer zu sagen was falsch sein könnte, weil man anhand deines Codes nicht sieht, welche Variablen er überhaupt reingibt.

        malorossM Offline
        malorossM Offline
        maloross
        schrieb am zuletzt editiert von maloross
        #3

        @Tictactoo danke für die Rückmeldung, das ist nur ein Auszug, hier das komplette. Gezählt wird korrekt, lediglich die Textausgabe von Name des Gerätes und Raum bleibt leer.

        //Licht - Abfrage und Schaltung
        //----------------------------------------
        // allgemeine Variablen
        var logging = true;  // Logging on/off
        var debug = true;  // Debug on/off
        var instanz = 'javascript.0';   instanz = instanz + '.'; 
        var pfad0 =   'Licht';      pfad0 = pfad0 + '.';        
        
        //Selektoren für die jeweiligen herstellerspezifischen Status + Zeit
        var cacheSelectorHomematic =    $('[id=*.STATE](functions="light")');
        var cacheSelectorLevel =    $('[id=*.Instance_1:_Level_1](functions="light")');
        var cacheSelectorTradfri =   $('[id=*.state](functions="light")');
        var cacheSelectorZwave1 = $('[id=*.Instance_1:_Switch_1](functions="light")');
        var cacheSelectorZwave2 = $('[id=*.Instance_2:_Switch_2](functions="light")');  
        var time;
        
        //Lichtautomatik 
        var timer = [];
        var GeraeteListe = [];
        
        // Objekte "Zwischenlagerung"
        // Objekt: Zeigt den Status der Beleuchtung (irgendein Licht an?)
        createState(pfad0 + 'Status_Lichter',  {def:'false', type:'boolean', name:'Status Beleuchtung',});
        // Objekt: Zeitstempel letzte Änderung
        createState(pfad0 + 'Status_Lichter_Zeitstempel',  {def:'', type:'string', name:'Zeitstempel Beleuchtung_',});
        // Objekt: Schalte alle Lichter in Abhängigkeit des Status ein oder aus
        createState(pfad0 + 'Schalter_Lichter',  {def:'false', type: 'boolean',name: 'Schalter Beleuchtung',desc: 'Schaltet alle Lichter aus oder wenn alles aus ein'});
        // Objekt: Anzahl der vorhandenen Lichter
        createState(pfad0 + 'Anzahl_Lichter_gesamt', {def:0, min:0, type:'number', name: 'Anzahl aller Lichter'});
        // Objekt: Anzahl der eingeschalteten Lichter
        createState(pfad0 + 'Anzahl_Lichter_ein', {def: 0,min: 0, type:'number', name:'Anzahl der eingeschalteten Lichter'});
        // Objekt: Mit den Namen der eingeschalteten Lichter
        createState(pfad0 + 'Text', {def:' ', type:'string', name: 'Eingeschaltete Lichter'});
        // Objekt: Ansage für Sprachausgabe
        createState(pfad0 + 'Ansage', {def:' ', type:'string', name: 'Eingeschaltete Lichter (für Ansage aufbereitet)'});
        // Objekt: Liste der Räume mit eingeschalteten Lichtern
        createState(pfad0 + 'Raum', {def:' ', type: 'string', name: 'Räume mit eingeschalteten Lichter'});
        
        // Funktionen
        // Allgemein
        function checkDevices(obj) {
        var datum = formatDate(new Date(getState("javascript.0.Licht.Anzahl_Lichter_ein").lc), 'DD.MM.YY');
        var uhrzeit = formatDate(new Date(getState("javascript.0.Licht.Anzahl_Lichter_ein").lc), 'hh:mm');
        var zeitstempel = datum +' um '+uhrzeit;
           
        // Rücksetzung aller Zähler auf 0 bzw. leer
           var anzahlLichterAn = 0;
           var anzahlLichter = 0;
           var textLichterAn = [];
           var textRaum = [];
           if (logging) {
           log('++++++ Lichter Anzahl ++++ ');
           log('#### SCHALTER ##### ');
           }
        
        //Schleifen zur Datenerfassung
        // Schleife Homematic 
        if (logging) log('#### Homematic ##### ');
        cacheSelectorHomematic.each(function(id, i) {
               var obj = getObject(id);
               var name = getObject(id).common.name;
               var status = getState(id).val; 
               var devicename = name.substring(0, name.indexOf(".STATE"));
               var raumname = getObject(id, "rooms");
        
               if (logging) {
                   log('-------');
                   log('Kanal: ' + name);
                   log('Status: ' + status);
               }
               if (status) {
                   ++anzahlLichterAn;
                   textLichterAn.push(devicename);
                   textRaum.push(raumname.enumNames);
               }
               ++anzahlLichter; 
           });
        
        // Schleife Dimmer  
        if (logging) log('#### DIMMER ##### ');
           cacheSelectorLevel.each(function(id, i) {
               var obj = getObject(id);
               var name = getObject(id).common.name;
               var status = getState(id).val;
               var devicename = name.substring(0, name.indexOf(".Instance_1:_Level_1"));
               var raumname = getObject(id, "rooms");
               if (logging) {
                   log('-------');
                   log('Kanal: ' + name);
                   log('Status: ' + status + '%');
               }
               if (parseFloat(status) > 0) {
                   ++anzahlLichterAn;
                   textLichterAn.push(devicename);
                   textRaum.push(raumname.enumNames);
               }
               ++anzahlLichter;
           });
        
        // Schleife Tradfri   
        if (logging) log('#### Tradfri ##### ');
        cacheSelectorTradfri.each(function(id, i) {
               var obj = getObject(id);
               var name = getObject(id).common.name;
               var status = getState(id).val;
               var devicename = name.substring(0, name.indexOf(".state"));
               var raumname = getObject(id, "rooms"); 
               if (logging) {
                   log('-------');
                   log('Kanal: ' + name);
                   log('Status: ' + status);
               }
               if (status) {
                   ++anzahlLichterAn;
                   textLichterAn.push(devicename);
                   textRaum.push(raumname.enumNames);
               }
               ++anzahlLichter;
           });
        
        // Schleife Zwave 1
        if (logging) log('#### Zwave1 ##### ');
        cacheSelectorZwave1.each(function(id, i) {
               var obj = getObject(id);
               var name = getObject(id).common.name;
               var status = getState(id).val;
               var devicename = name.substring(0, name.indexOf(".Instance_1:_Switch_1"));
               var raumname = getObject(id, "rooms");
              if (logging) {
                   log('-------');
                   log('Kanal: ' + name);
                   log('Status: ' + status);
               }
               if (status) {
                   ++anzahlLichterAn;
                   textLichterAn.push(devicename);
                   textRaum.push(raumname.enumNames);
               }
               ++anzahlLichter;
           });
        
        // Schleife Zwave 2
        if (logging) log('#### Zwave2 ##### ');
        cacheSelectorZwave2.each(function(id, i) {
               var obj = getObject(id);
               var name = getObject(id).common.name;
               var status = getState(id).val;
               var devicename = name.substring(0, name.indexOf(".Instance_2:_Switch_2"));
               var raumname = getObject(id, "rooms");
              if (logging) {
                   log('-------');
                   log('Kanal: ' + name);
                   log('Status: ' + status);
               }
               if (status) {
                   ++anzahlLichterAn;
                   textLichterAn.push(devicename);
                   textRaum.push(raumname.enumNames);
               }
               ++anzahlLichter;
           });
           
        //Datenaufbereitung
        // Array mit Lichternamen sortieren, aufbereiten, Ausgabe in DP
        textLichterAn.sort();
        textRaum.sort();
        if (logging) log("Text: " + textLichterAn);
        if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn);
        setState(pfad0 + 'Text', textLichterAn.join('<br>'));
        setState(pfad0 + 'Anzahl_Lichter_ein', textLichterAn.length); 
        setState(pfad0 + 'Anzahl_Lichter_gesamt', anzahlLichter); 
        setState(pfad0 + 'Raum', textRaum.join(', '));
        if(anzahlLichterAn > 0){
               setState(instanz + pfad0 + 'Status_Lichter', true);
               setState(instanz + pfad0 + "Status_Lichter_Zeitstempel", zeitstempel);
           }
           else{
               setState(instanz + pfad0 + 'Status_Lichter', false);
               setState(instanz + pfad0 + "Status_Lichter_Zeitstempel", zeitstempel);
           }
        }
        
        // Schaltungsfunktion
        function switchDevices(dp) {
           cacheSelectorHomematic.each(function(id, i) {
               var status = getState(id).val;
             if(dp){
                   if(!status) setState(id, true);
               }
               else{
                   if(status)setState(id, false);
               }
           });
          cacheSelectorLevel.each(function(id, i) {
               var status = getState(id).val;
               if(dp){
                   if(parseFloat(status) === 0) setState(id, 20);
               }
               else{
                   if(parseFloat(status) > 0) setState(id, 0);
               }
           });
        cacheSelectorTradfri.each(function(id, i) {
               var status = getState(id).val; 
             if(dp){
                   if(!status) setState(id, true);
               }
               else{
                   if(status)setState(id, false);
               }
           });
           
           cacheSelectorZwave1.each(function(id, i) {
               var status = getState(id).val;
             if(dp){
                   if(!status) setState(id, true);
               }
               else{
                   if(status)setState(id, false);
               }
           });
        
        cacheSelectorZwave2.each(function(id, i) {
               var status = getState(id).val;
             if(dp){
                   if(!status) setState(id, true);
               }
               else{
                   if(status)setState(id, false);
               }
           });
        }
        
        // Trigger
        cacheSelectorHomematic.on(function(obj) {
           if (logging) log('Auslösende Homematic: ' + obj.id + ': ' + obj.state.val);
           checkDevices();
        });
        cacheSelectorTradfri.on(function(obj) {
           if (logging) log('Auslösender Tradfri: ' + obj.id + ': ' + obj.state.val); 
           checkDevices();
        });
        cacheSelectorLevel.on(function(obj) {
           if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); 
           checkDevices();
        });
        cacheSelectorZwave1.on(function(obj) {
           if (logging) log('Auslösender Zwave1: ' + obj.id + ': ' + obj.state.val); 
           checkDevices();
        });
        cacheSelectorZwave2.on(function(obj) {
           if (logging) log('Auslösender Zwave2: ' + obj.id + ': ' + obj.state.val); 
           checkDevices();
        });
        
        // Hauptfunktion 
        function main() {
           setTimeout(function() {
               if (logging) log('Auslöser Skriptstart');
               checkDevices();
           }, 2000);
        }
        main();
        
        // Aufbereitung für Ansage
        function strip_tags(data) {
           var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
           return (rueckgabe);
        }
        on(pfad0 + 'Text', function(obj) {
           var text = obj.state.val;
           text = (getState(pfad0 + 'Anzahl_Lichter_gesamt').val > 0) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet';
           setState(pfad0 + 'Ansage', text);
        });
        
        // Schaltungsfunktion
        on("javascript.0.Licht.Schalter_Lichter", function(dp) { 
             if(getState("javascript.0.Licht.Status_Lichter").val){
              switchDevices(false);
           }  
           else{
               switchDevices(true);
           }
        });
        
        
        

        EDIT: In der Debug-Ausgabe von javascript werden die Namen aller Geräte korrekt angezeigt, Räume fehlen auch hier.

        Auch Frauen können sich für Technik begeistern! ;)

        Equipment:
        diverse HM-, HMIP-, Aeotec- Tradfri- Sonos- und Fibaro-Geräte, Master-/Slavesystem auf 2 Raspi4, NAS

        C 1 Antwort Letzte Antwort
        0
        • malorossM maloross

          @Tictactoo danke für die Rückmeldung, das ist nur ein Auszug, hier das komplette. Gezählt wird korrekt, lediglich die Textausgabe von Name des Gerätes und Raum bleibt leer.

          //Licht - Abfrage und Schaltung
          //----------------------------------------
          // allgemeine Variablen
          var logging = true;  // Logging on/off
          var debug = true;  // Debug on/off
          var instanz = 'javascript.0';   instanz = instanz + '.'; 
          var pfad0 =   'Licht';      pfad0 = pfad0 + '.';        
          
          //Selektoren für die jeweiligen herstellerspezifischen Status + Zeit
          var cacheSelectorHomematic =    $('[id=*.STATE](functions="light")');
          var cacheSelectorLevel =    $('[id=*.Instance_1:_Level_1](functions="light")');
          var cacheSelectorTradfri =   $('[id=*.state](functions="light")');
          var cacheSelectorZwave1 = $('[id=*.Instance_1:_Switch_1](functions="light")');
          var cacheSelectorZwave2 = $('[id=*.Instance_2:_Switch_2](functions="light")');  
          var time;
          
          //Lichtautomatik 
          var timer = [];
          var GeraeteListe = [];
          
          // Objekte "Zwischenlagerung"
          // Objekt: Zeigt den Status der Beleuchtung (irgendein Licht an?)
          createState(pfad0 + 'Status_Lichter',  {def:'false', type:'boolean', name:'Status Beleuchtung',});
          // Objekt: Zeitstempel letzte Änderung
          createState(pfad0 + 'Status_Lichter_Zeitstempel',  {def:'', type:'string', name:'Zeitstempel Beleuchtung_',});
          // Objekt: Schalte alle Lichter in Abhängigkeit des Status ein oder aus
          createState(pfad0 + 'Schalter_Lichter',  {def:'false', type: 'boolean',name: 'Schalter Beleuchtung',desc: 'Schaltet alle Lichter aus oder wenn alles aus ein'});
          // Objekt: Anzahl der vorhandenen Lichter
          createState(pfad0 + 'Anzahl_Lichter_gesamt', {def:0, min:0, type:'number', name: 'Anzahl aller Lichter'});
          // Objekt: Anzahl der eingeschalteten Lichter
          createState(pfad0 + 'Anzahl_Lichter_ein', {def: 0,min: 0, type:'number', name:'Anzahl der eingeschalteten Lichter'});
          // Objekt: Mit den Namen der eingeschalteten Lichter
          createState(pfad0 + 'Text', {def:' ', type:'string', name: 'Eingeschaltete Lichter'});
          // Objekt: Ansage für Sprachausgabe
          createState(pfad0 + 'Ansage', {def:' ', type:'string', name: 'Eingeschaltete Lichter (für Ansage aufbereitet)'});
          // Objekt: Liste der Räume mit eingeschalteten Lichtern
          createState(pfad0 + 'Raum', {def:' ', type: 'string', name: 'Räume mit eingeschalteten Lichter'});
          
          // Funktionen
          // Allgemein
          function checkDevices(obj) {
          var datum = formatDate(new Date(getState("javascript.0.Licht.Anzahl_Lichter_ein").lc), 'DD.MM.YY');
          var uhrzeit = formatDate(new Date(getState("javascript.0.Licht.Anzahl_Lichter_ein").lc), 'hh:mm');
          var zeitstempel = datum +' um '+uhrzeit;
             
          // Rücksetzung aller Zähler auf 0 bzw. leer
             var anzahlLichterAn = 0;
             var anzahlLichter = 0;
             var textLichterAn = [];
             var textRaum = [];
             if (logging) {
             log('++++++ Lichter Anzahl ++++ ');
             log('#### SCHALTER ##### ');
             }
          
          //Schleifen zur Datenerfassung
          // Schleife Homematic 
          if (logging) log('#### Homematic ##### ');
          cacheSelectorHomematic.each(function(id, i) {
                 var obj = getObject(id);
                 var name = getObject(id).common.name;
                 var status = getState(id).val; 
                 var devicename = name.substring(0, name.indexOf(".STATE"));
                 var raumname = getObject(id, "rooms");
          
                 if (logging) {
                     log('-------');
                     log('Kanal: ' + name);
                     log('Status: ' + status);
                 }
                 if (status) {
                     ++anzahlLichterAn;
                     textLichterAn.push(devicename);
                     textRaum.push(raumname.enumNames);
                 }
                 ++anzahlLichter; 
             });
          
          // Schleife Dimmer  
          if (logging) log('#### DIMMER ##### ');
             cacheSelectorLevel.each(function(id, i) {
                 var obj = getObject(id);
                 var name = getObject(id).common.name;
                 var status = getState(id).val;
                 var devicename = name.substring(0, name.indexOf(".Instance_1:_Level_1"));
                 var raumname = getObject(id, "rooms");
                 if (logging) {
                     log('-------');
                     log('Kanal: ' + name);
                     log('Status: ' + status + '%');
                 }
                 if (parseFloat(status) > 0) {
                     ++anzahlLichterAn;
                     textLichterAn.push(devicename);
                     textRaum.push(raumname.enumNames);
                 }
                 ++anzahlLichter;
             });
          
          // Schleife Tradfri   
          if (logging) log('#### Tradfri ##### ');
          cacheSelectorTradfri.each(function(id, i) {
                 var obj = getObject(id);
                 var name = getObject(id).common.name;
                 var status = getState(id).val;
                 var devicename = name.substring(0, name.indexOf(".state"));
                 var raumname = getObject(id, "rooms"); 
                 if (logging) {
                     log('-------');
                     log('Kanal: ' + name);
                     log('Status: ' + status);
                 }
                 if (status) {
                     ++anzahlLichterAn;
                     textLichterAn.push(devicename);
                     textRaum.push(raumname.enumNames);
                 }
                 ++anzahlLichter;
             });
          
          // Schleife Zwave 1
          if (logging) log('#### Zwave1 ##### ');
          cacheSelectorZwave1.each(function(id, i) {
                 var obj = getObject(id);
                 var name = getObject(id).common.name;
                 var status = getState(id).val;
                 var devicename = name.substring(0, name.indexOf(".Instance_1:_Switch_1"));
                 var raumname = getObject(id, "rooms");
                if (logging) {
                     log('-------');
                     log('Kanal: ' + name);
                     log('Status: ' + status);
                 }
                 if (status) {
                     ++anzahlLichterAn;
                     textLichterAn.push(devicename);
                     textRaum.push(raumname.enumNames);
                 }
                 ++anzahlLichter;
             });
          
          // Schleife Zwave 2
          if (logging) log('#### Zwave2 ##### ');
          cacheSelectorZwave2.each(function(id, i) {
                 var obj = getObject(id);
                 var name = getObject(id).common.name;
                 var status = getState(id).val;
                 var devicename = name.substring(0, name.indexOf(".Instance_2:_Switch_2"));
                 var raumname = getObject(id, "rooms");
                if (logging) {
                     log('-------');
                     log('Kanal: ' + name);
                     log('Status: ' + status);
                 }
                 if (status) {
                     ++anzahlLichterAn;
                     textLichterAn.push(devicename);
                     textRaum.push(raumname.enumNames);
                 }
                 ++anzahlLichter;
             });
             
          //Datenaufbereitung
          // Array mit Lichternamen sortieren, aufbereiten, Ausgabe in DP
          textLichterAn.sort();
          textRaum.sort();
          if (logging) log("Text: " + textLichterAn);
          if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn);
          setState(pfad0 + 'Text', textLichterAn.join('<br>'));
          setState(pfad0 + 'Anzahl_Lichter_ein', textLichterAn.length); 
          setState(pfad0 + 'Anzahl_Lichter_gesamt', anzahlLichter); 
          setState(pfad0 + 'Raum', textRaum.join(', '));
          if(anzahlLichterAn > 0){
                 setState(instanz + pfad0 + 'Status_Lichter', true);
                 setState(instanz + pfad0 + "Status_Lichter_Zeitstempel", zeitstempel);
             }
             else{
                 setState(instanz + pfad0 + 'Status_Lichter', false);
                 setState(instanz + pfad0 + "Status_Lichter_Zeitstempel", zeitstempel);
             }
          }
          
          // Schaltungsfunktion
          function switchDevices(dp) {
             cacheSelectorHomematic.each(function(id, i) {
                 var status = getState(id).val;
               if(dp){
                     if(!status) setState(id, true);
                 }
                 else{
                     if(status)setState(id, false);
                 }
             });
            cacheSelectorLevel.each(function(id, i) {
                 var status = getState(id).val;
                 if(dp){
                     if(parseFloat(status) === 0) setState(id, 20);
                 }
                 else{
                     if(parseFloat(status) > 0) setState(id, 0);
                 }
             });
          cacheSelectorTradfri.each(function(id, i) {
                 var status = getState(id).val; 
               if(dp){
                     if(!status) setState(id, true);
                 }
                 else{
                     if(status)setState(id, false);
                 }
             });
             
             cacheSelectorZwave1.each(function(id, i) {
                 var status = getState(id).val;
               if(dp){
                     if(!status) setState(id, true);
                 }
                 else{
                     if(status)setState(id, false);
                 }
             });
          
          cacheSelectorZwave2.each(function(id, i) {
                 var status = getState(id).val;
               if(dp){
                     if(!status) setState(id, true);
                 }
                 else{
                     if(status)setState(id, false);
                 }
             });
          }
          
          // Trigger
          cacheSelectorHomematic.on(function(obj) {
             if (logging) log('Auslösende Homematic: ' + obj.id + ': ' + obj.state.val);
             checkDevices();
          });
          cacheSelectorTradfri.on(function(obj) {
             if (logging) log('Auslösender Tradfri: ' + obj.id + ': ' + obj.state.val); 
             checkDevices();
          });
          cacheSelectorLevel.on(function(obj) {
             if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); 
             checkDevices();
          });
          cacheSelectorZwave1.on(function(obj) {
             if (logging) log('Auslösender Zwave1: ' + obj.id + ': ' + obj.state.val); 
             checkDevices();
          });
          cacheSelectorZwave2.on(function(obj) {
             if (logging) log('Auslösender Zwave2: ' + obj.id + ': ' + obj.state.val); 
             checkDevices();
          });
          
          // Hauptfunktion 
          function main() {
             setTimeout(function() {
                 if (logging) log('Auslöser Skriptstart');
                 checkDevices();
             }, 2000);
          }
          main();
          
          // Aufbereitung für Ansage
          function strip_tags(data) {
             var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
             return (rueckgabe);
          }
          on(pfad0 + 'Text', function(obj) {
             var text = obj.state.val;
             text = (getState(pfad0 + 'Anzahl_Lichter_gesamt').val > 0) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet';
             setState(pfad0 + 'Ansage', text);
          });
          
          // Schaltungsfunktion
          on("javascript.0.Licht.Schalter_Lichter", function(dp) { 
               if(getState("javascript.0.Licht.Status_Lichter").val){
                switchDevices(false);
             }  
             else{
                 switchDevices(true);
             }
          });
          
          
          

          EDIT: In der Debug-Ausgabe von javascript werden die Namen aller Geräte korrekt angezeigt, Räume fehlen auch hier.

          C Offline
          C Offline
          CruziX
          schrieb am zuletzt editiert von CruziX
          #4

          @maloross Ich habe nichts davon getestet, aber was mir hier bei den Räumen auffällt ist folgendes:
          In der Zeile

          textRaum.push(raumname.enumNames);
          

          Wird ein Array aus zugewiesenen Räumen zurückgegeben und in das Array textRaum gespeichert.

          Das heißt, an dieser Stelle hast du ein Array, in einem Array.

          In folgendem Code versuchst du nun die im Array "textRaum" befindlichen Arrays (enumNames) zu joinen.

          setState(pfad0 + 'Raum', textRaum.join(', '));
          

          Ich kenne mich mit JavaScript leider nicht so sehr aus, um zu wissen was an dieser stelle passiert und wie er das macht.
          Ich gehe davon aus, dass du immer nur einen Raum zugewiesen hast.
          versuch mal bitte die Zeile

          textRaum.push(raumname.enumNames);
          

          durch

          let raumArray = raumname.enumNames;
          if(raumArray.lenght > 0) {
          textRaum.push(raumArray[0]);
          }
          else{
          textRaum.push('');
          }
          

          zu ersetzen.

          1 Antwort Letzte Antwort
          0
          • T Tictactoo

            @maloross Ist das deine komplettes Skirpt?

            Was mir jetzt auf die schnelle auffällt ist, dass in deinem Code für if(logging) Bedingung keine log für den Raum drin ist, sondern der Array nur unten bei is(status) in deine Variable textRaum gepusht wird. Da innerhalb des geposteten Skripts damit allerdings nicht gearbeitet wird, ist schwer zu sagen, was genau da nicht richtig läuft.

            Du könnntest btw auch die substring Methode durch ".replace(".STATE", "")" ersetzen, dann musst du nicht mit den Positionen der Chars arbeiten.

            In deinem Tradfri-Teil sieht es an sich erstmal net falsch aus, allerdings ist auch hier schwer zu sagen was falsch sein könnte, weil man anhand deines Codes nicht sieht, welche Variablen er überhaupt reingibt.

            malorossM Offline
            malorossM Offline
            maloross
            schrieb am zuletzt editiert von
            #5

            @Tictactoo sagte in Skript Lichtzählen: Räume werden nicht angezeigt:

            Du könnntest btw auch die substring Methode durch ".replace(".STATE", "")"

            Danke für den Hinweis, damit ist Punkt 2 erledigt, denn alle Gerätenamen werden nun korrekt angezeigt.

            @CruziX Bin im Skripting noch in den Anfängen und lerne per trial and error. Habe es mit der von dir vorgeschlagenen Änderung versucht, aber ohne Erfolg.

            Auch Frauen können sich für Technik begeistern! ;)

            Equipment:
            diverse HM-, HMIP-, Aeotec- Tradfri- Sonos- und Fibaro-Geräte, Master-/Slavesystem auf 2 Raspi4, NAS

            C 1 Antwort Letzte Antwort
            0
            • malorossM maloross

              @Tictactoo sagte in Skript Lichtzählen: Räume werden nicht angezeigt:

              Du könnntest btw auch die substring Methode durch ".replace(".STATE", "")"

              Danke für den Hinweis, damit ist Punkt 2 erledigt, denn alle Gerätenamen werden nun korrekt angezeigt.

              @CruziX Bin im Skripting noch in den Anfängen und lerne per trial and error. Habe es mit der von dir vorgeschlagenen Änderung versucht, aber ohne Erfolg.

              C Offline
              C Offline
              CruziX
              schrieb am zuletzt editiert von CruziX
              #6

              @maloross Ja, bin da auch noch Anfänger, daher ist es schwierig wenn man nicht selbst rumprobieren kann 🙂
              Kannst du mal mit einem log prüfen ob aus raumArray[0] das korrekte ausgelesen wird?

              malorossM 1 Antwort Letzte Antwort
              0
              • C CruziX

                @maloross Ja, bin da auch noch Anfänger, daher ist es schwierig wenn man nicht selbst rumprobieren kann 🙂
                Kannst du mal mit einem log prüfen ob aus raumArray[0] das korrekte ausgelesen wird?

                malorossM Offline
                malorossM Offline
                maloross
                schrieb am zuletzt editiert von maloross
                #7

                @CruziX sagte

                @maloross Ja, bin da auch noch Anfänger, daher ist es schwierig wenn man nicht selbst rumprobieren kann 🙂
                Kannst du mal mit einem log prüfen ob aus raumArray[0] das korrekte ausgelesen wird?

                Nein kommt ein Fehler.

                von meiner Logik her ist es doch so, dass Gerätename und Raumname innerhalb der Schleife in gleicher Weise abgerufen werden sollten

                var devicename = name.replace(".state", "");
                var raumname = getObject(id, "rooms"); 
                
                if (status) {
                            ++anzahlLichterAn;
                            textLichterAn.push(devicename);
                            textRaum.push(raumname);
                        }
                        ++anzahlLichter;
                    });
                

                Wobei die Variable devicename die bereinigte ID des Gerätes enthält.
                Das Array hat für diese beiden Variablen folgenden Befehle:

                textLichterAn.sort();
                textRaum.sort();
                
                setState(pfad0 + 'Text', textLichterAn.join('<br>'));
                setState(pfad0 + 'Raum', textRaum.join(', '));
                
                

                Aber der Raum wird nicht angezeigt., im Log steht: raum: [object Object]

                Auch Frauen können sich für Technik begeistern! ;)

                Equipment:
                diverse HM-, HMIP-, Aeotec- Tradfri- Sonos- und Fibaro-Geräte, Master-/Slavesystem auf 2 Raspi4, NAS

                paul53P 1 Antwort Letzte Antwort
                0
                • malorossM maloross

                  @CruziX sagte

                  @maloross Ja, bin da auch noch Anfänger, daher ist es schwierig wenn man nicht selbst rumprobieren kann 🙂
                  Kannst du mal mit einem log prüfen ob aus raumArray[0] das korrekte ausgelesen wird?

                  Nein kommt ein Fehler.

                  von meiner Logik her ist es doch so, dass Gerätename und Raumname innerhalb der Schleife in gleicher Weise abgerufen werden sollten

                  var devicename = name.replace(".state", "");
                  var raumname = getObject(id, "rooms"); 
                  
                  if (status) {
                              ++anzahlLichterAn;
                              textLichterAn.push(devicename);
                              textRaum.push(raumname);
                          }
                          ++anzahlLichter;
                      });
                  

                  Wobei die Variable devicename die bereinigte ID des Gerätes enthält.
                  Das Array hat für diese beiden Variablen folgenden Befehle:

                  textLichterAn.sort();
                  textRaum.sort();
                  
                  setState(pfad0 + 'Text', textLichterAn.join('<br>'));
                  setState(pfad0 + 'Raum', textRaum.join(', '));
                  
                  

                  Aber der Raum wird nicht angezeigt., im Log steht: raum: [object Object]

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

                  @maloross sagte:

                  var raumname = getObject(id, "rooms");

                  Richtig:

                  var raumname = getObject(id, "rooms").enumNames[0];
                  

                  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

                  malorossM 1 Antwort Letzte Antwort
                  0
                  • paul53P paul53

                    @maloross sagte:

                    var raumname = getObject(id, "rooms");

                    Richtig:

                    var raumname = getObject(id, "rooms").enumNames[0];
                    
                    malorossM Offline
                    malorossM Offline
                    maloross
                    schrieb am zuletzt editiert von
                    #9

                    @paul53 hat auch keinen Erfolg....es gab Ende 2017 auf Github diesbezüglich ein Fehlermeldung, allerdings ohne konkreten Lösungsansatz.

                    Auch Frauen können sich für Technik begeistern! ;)

                    Equipment:
                    diverse HM-, HMIP-, Aeotec- Tradfri- Sonos- und Fibaro-Geräte, Master-/Slavesystem auf 2 Raspi4, NAS

                    C paul53P 2 Antworten Letzte Antwort
                    0
                    • malorossM maloross

                      @paul53 hat auch keinen Erfolg....es gab Ende 2017 auf Github diesbezüglich ein Fehlermeldung, allerdings ohne konkreten Lösungsansatz.

                      C Offline
                      C Offline
                      CruziX
                      schrieb am zuletzt editiert von
                      #10

                      @maloross Ist ja auch so ziemlich das gleiche wie mein Code Schnipsel

                      malorossM 1 Antwort Letzte Antwort
                      0
                      • malorossM maloross

                        @paul53 hat auch keinen Erfolg....es gab Ende 2017 auf Github diesbezüglich ein Fehlermeldung, allerdings ohne konkreten Lösungsansatz.

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

                        @maloross sagte:

                        hat auch keinen Erfolg..

                        Wie hast Du die Räume zugeordnet ? Welche Javascript-Version ?

                        Testscript.JPG

                        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

                        T 1 Antwort Letzte Antwort
                        0
                        • C CruziX

                          @maloross Ist ja auch so ziemlich das gleiche wie mein Code Schnipsel

                          malorossM Offline
                          malorossM Offline
                          maloross
                          schrieb am zuletzt editiert von maloross
                          #12

                          @CruziX ja, aber manchmal sind es Kleingkeiten, die Fehler verursachen...
                          ich habe die Räume erst mal rausgenommen.

                          @paul53 angelegt über Aufzählung, Zuordnung Objekte-Auswahl
                          Danke für eure Unterstützung..

                          Auch Frauen können sich für Technik begeistern! ;)

                          Equipment:
                          diverse HM-, HMIP-, Aeotec- Tradfri- Sonos- und Fibaro-Geräte, Master-/Slavesystem auf 2 Raspi4, NAS

                          1 Antwort Letzte Antwort
                          0
                          • paul53P paul53

                            @maloross sagte:

                            hat auch keinen Erfolg..

                            Wie hast Du die Räume zugeordnet ? Welche Javascript-Version ?

                            Testscript.JPG

                            T Offline
                            T Offline
                            Tictactoo
                            schrieb am zuletzt editiert von
                            #13

                            @paul53
                            Ich hab die 4.3.4 am Laufen und bekomme es so auch nicht raus leider. Logge ich den Array enumNames, zeigt er mit zwar das JSON-Object darin an, wenn ich aber versuche mit .de auf den deutschen Namen zuzugreifen, sagt er das die Proberty nicht vorhanden wäre. Seltsam...

                            paul53P 1 Antwort Letzte Antwort
                            0
                            • T Tictactoo

                              @paul53
                              Ich hab die 4.3.4 am Laufen und bekomme es so auch nicht raus leider. Logge ich den Array enumNames, zeigt er mit zwar das JSON-Object darin an, wenn ich aber versuche mit .de auf den deutschen Namen zuzugreifen, sagt er das die Proberty nicht vorhanden wäre. Seltsam...

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

                              @Tictactoo sagte:

                              zeigt er mit zwar das JSON-Object darin an, wenn ich aber versuche mit .de auf den deutschen Namen zuzugreifen, sagt er das die Proberty nicht vorhanden wäre.

                              Du hast getObject so verwendet ?

                              getObject(id, "rooms").enumNames[0].de;
                              

                              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

                              T 1 Antwort Letzte Antwort
                              0
                              • paul53P paul53

                                @Tictactoo sagte:

                                zeigt er mit zwar das JSON-Object darin an, wenn ich aber versuche mit .de auf den deutschen Namen zuzugreifen, sagt er das die Proberty nicht vorhanden wäre.

                                Du hast getObject so verwendet ?

                                getObject(id, "rooms").enumNames[0].de;
                                
                                T Offline
                                T Offline
                                Tictactoo
                                schrieb am zuletzt editiert von
                                #15

                                @paul53 Ja, hab ich. Wie gesagt, wenn ich "getObject(id, "rooms").enumNames[0]" logge, zeigt er mir auch den Inhalt.

                                paul53P 1 Antwort Letzte Antwort
                                0
                                • T Tictactoo

                                  @paul53 Ja, hab ich. Wie gesagt, wenn ich "getObject(id, "rooms").enumNames[0]" logge, zeigt er mir auch den Inhalt.

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

                                  @Tictactoo sagte:

                                  zeigt er mir auch den Inhalt.

                                  Wie sieht er aus ?

                                  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

                                  T 1 Antwort Letzte Antwort
                                  0
                                  • paul53P paul53

                                    @Tictactoo sagte:

                                    zeigt er mir auch den Inhalt.

                                    Wie sieht er aus ?

                                    T Offline
                                    T Offline
                                    Tictactoo
                                    schrieb am zuletzt editiert von Tictactoo
                                    #17

                                    @paul53

                                    javascript.0 (17215) script.js.Rhasspy.Slots: [{'en':'bath_room','de':'Bad'}]
                                    
                                    

                                    Nehm ich die Variable und setzen "[0].de" dahinter bekomme ich nur das:

                                    javascript.0	2020-01-30 15:44:21.547	error	(17215) at Script.runInContext (vm.js:133:20)
                                    javascript.0	2020-01-30 15:44:21.546	error	(17215) at script.js.Rhasspy.Slots:9:84
                                    javascript.0	2020-01-30 15:44:21.546	error	(17215) TypeError: Cannot read property 'de' of undefined
                                    javascript.0	2020-01-30 15:44:21.546	error	(17215) ^
                                    javascript.0	2020-01-30 15:44:21.545	error	(17215) var test = getObject(devices[i].replace('.available',''), 'rooms').enumNames[0].de;
                                    javascript.0	2020-01-30 15:44:21.545	error	(17215) script.js.Rhasspy.Slots: script.js.Rhasspy.Slots:9
                                    

                                    Hatte es auch schon mit array['de'] versucht, aber das schluckt er auch net...

                                    paul53P 1 Antwort Letzte Antwort
                                    0
                                    • T Tictactoo

                                      @paul53

                                      javascript.0 (17215) script.js.Rhasspy.Slots: [{'en':'bath_room','de':'Bad'}]
                                      
                                      

                                      Nehm ich die Variable und setzen "[0].de" dahinter bekomme ich nur das:

                                      javascript.0	2020-01-30 15:44:21.547	error	(17215) at Script.runInContext (vm.js:133:20)
                                      javascript.0	2020-01-30 15:44:21.546	error	(17215) at script.js.Rhasspy.Slots:9:84
                                      javascript.0	2020-01-30 15:44:21.546	error	(17215) TypeError: Cannot read property 'de' of undefined
                                      javascript.0	2020-01-30 15:44:21.546	error	(17215) ^
                                      javascript.0	2020-01-30 15:44:21.545	error	(17215) var test = getObject(devices[i].replace('.available',''), 'rooms').enumNames[0].de;
                                      javascript.0	2020-01-30 15:44:21.545	error	(17215) script.js.Rhasspy.Slots: script.js.Rhasspy.Slots:9
                                      

                                      Hatte es auch schon mit array['de'] versucht, aber das schluckt er auch net...

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

                                      @Tictactoo sagte:

                                      bekomme ich nur das:

                                      Sehr eigenartig. Was ergibt im Log?

                                       var test = getObject(devices[i].replace('.available',''), 'rooms').enumNames[0];
                                      

                                      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

                                      T 1 Antwort Letzte Antwort
                                      0
                                      • C Offline
                                        C Offline
                                        CruziX
                                        schrieb am zuletzt editiert von
                                        #19

                                        Schomal iobroker bzw Script Engine neugestartet?

                                        1 Antwort Letzte Antwort
                                        0
                                        • paul53P paul53

                                          @Tictactoo sagte:

                                          bekomme ich nur das:

                                          Sehr eigenartig. Was ergibt im Log?

                                           var test = getObject(devices[i].replace('.available',''), 'rooms').enumNames[0];
                                          
                                          T Offline
                                          T Offline
                                          Tictactoo
                                          schrieb am zuletzt editiert von
                                          #20

                                          @paul53 Hatte es vorher oben reingeschrieben, vielleicht hatte sich das mit deiner Antwort überschnitten:

                                          javascript.0	2020-01-30 15:44:21.547	error	(17215) at Script.runInContext (vm.js:133:20)
                                          javascript.0	2020-01-30 15:44:21.546	error	(17215) at script.js.Rhasspy.Slots:9:84
                                          javascript.0	2020-01-30 15:44:21.546	error	(17215) TypeError: Cannot read property 'de' of undefined
                                          javascript.0	2020-01-30 15:44:21.546	error	(17215) ^
                                          javascript.0	2020-01-30 15:44:21.545	error	(17215) var test = getObject(devices[i].replace('.available',''), 'rooms').enumNames[0].de;
                                          javascript.0	2020-01-30 15:44:21.545	error	(17215) script.js.Rhasspy.Slots: script.js.Rhasspy.Slots:9
                                          
                                          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

                                          631

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          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
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe