Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Unifi WLAN Script

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Unifi WLAN Script

Scheduled Pinned Locked Moved JavaScript
380 Posts 13 Posters 61.1k Views 13 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • liv-in-skyL liv-in-sky

    @dslraser

    das neuste script

    // September 2019 @liv-in-sky durch viel vorarbeit von @thewhobox (api verbindung)
    
    // Definition Login
    const unifi_username = "x";
    const unifi_password = "xxxxxx!";
    const unifi_controller = "https://192.xxx.xxx.xxx:8443";
    
    
    // DEFINITION der zu anzeigenden Netzwerke am besten bis auf id und smart alle gleich setzen: beispiel:
    const wifis = {
      "WLAN_Dragon1": { name: "WLAN_Dragon1", id: "yyyyyyyyyyyyyyyyyyyyy", desc: "WLAN_Dragon1", smart: "WLAN_Dragon1" } ,
      "WLAN_DragonGuest": { name: "WLAN_DragonGuest", id: "yyyyyyyyyyyyyyyyyyyy", desc: "WLAN_DragonGuest", smart: "WLAN_DragonGuest" }
    }
    let wifiDPs = [];
    
    const request = require('request-promise-native').defaults({ rejectUnauthorized: false });
    var fs = require('fs')
    
    const datei = "/opt/iobroker/iobroker-data/files/iqontrol/htmlvoucher.html";
    const datei2 = "/opt/iobroker/iobroker-data/files/iqontrol/htmlclients.html";
    let writeFile = true;
    let  writeFileVar = 0;
    let writeClientTable = true;
    let writeAnwesenheit = true;
    let listeDatenpunkte = [];
    let listeDatenpunkteNew = [];
    let listeDatenpunkteAlt = [];
    
    // Datenpunkte Hauptpfad wählen - WICHTIG muss mit der javascript instanz, inder das script läuft zusammenpassen
    const dpPrefix = "javascript.0.";
    
    // Abfragezyklus definieren
    const abfragezyklus =20000;
    
    //HIER Einstellungen : EIN-AUSSCHALTEN Vouchers, iqontrol-Datei erstellen, anwesenheitskontrolle-clientpflege
    let  iqontrol = true;
    let  anwesenheit = true; // beim setzen von true auf false die verzeichnisstruktur unter iobroker-objects "von hand" löschen
    let vouchers = true;
    
    // Hier Definition iqontrol-Style für Popup
    const format = "<!DOCTYPE html><html><head><title>Voucher</title></head><body><table style=\"color:black;text-align:center; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
    const format2 = "<!DOCTYPE html><html><head><title>Clients</title></head><body><table style=\"color:black; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
    
    
    //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
    
    let cookies = [];
    let loggedIn = false;
    let debug = false;
    
    if ( !anwesenheit) fs.writeFileSync(datei2,("variable anwesenheit und/oder iqontrol ist nicht im unifiscript aktiviert - auf true setzen")); 
    if ( !vouchers) fs.writeFileSync(datei,("variable vouchers und/oder iqontrol ist nicht im unifiscript aktiviert - auf true setzen")); 
    
    
    
    //Erstelle Datenpunkte für die WLANs automatisch
    for(let wifi_name in wifis) {
    
        wifiDPs.push(dpPrefix + "WLANUnifi." + wifis[wifi_name].name);
       
       createState(dpPrefix + "WLANUnifi."+ wifi_name, {
          name: wifis[wifi_name].desc,
          role: 'state',
          read: true,
          write: true,
          type: "boolean",
          smartName: {
              de: wifis[wifi_name].smart,
              smartType: "SWITCH"
          } });}
    
    
    if (true) {
    createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
       name: 'Unifi Wifi Clients Table', 
       role: 'string',
       read:  true, 
       write: true,
    });}
    
    
    if (vouchers) {
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
       name: 'Unifi Wifi Vouchers_Table', 
       role: 'string',
       read:  true, 
       write: true,
    });
    
    for (var i = 1; i < 21; i++) { 
       var x=i.toString();
       if (i<10) x="0"+x;
      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
       name: 'Unifi Voucher_Code'+x, 
       role: 'string',
       read:  true, 
       write: true,
       });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
       name: 'Unifi Voucher_Code_code'+x, 
       role: 'string',
       read:  true, 
       write: true,
       });    
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
       name: 'Unifi Voucher_Code_erstellt'+x, 
       role: 'string',
       read:  true, 
       write: true,
       });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
       name: 'Unifi Voucher_Code_duration'+x, 
       role: 'string',
       read:  true, 
       write: true,
       });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
       name: 'Unifi Voucher_Code_expires'+x, 
       role: 'string',
       read:  true, 
       write: true,
       });
    }}
    
    createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
    if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
    
    function dlog(message) {
      if(debug)
          console.log(message);
    }
    //-----------------------------------------LOGIN---------------------------------------------------------------
    async function login() {
      return new Promise(async (resolve, reject) => {
          let resp = await request.post({
              resolveWithFullResponse: true,
              url: unifi_controller + "/api/login",
              body: JSON.stringify({ username: unifi_username, password: unifi_password }),
              headers: { 'Content-Type': 'application/json' }
          }).catch((e) => { dlog("login: reject"), reject(e) });
          
          if(resp != null) {
              dlog("login: login war erfolgreich! " + ((resp.headers && resp.headers.hasOwnProperty("set-cookie")) ? "Mit Cookies":"Ohne Cookies"));
              if(resp.headers && resp.headers.hasOwnProperty("set-cookie")) {
                  let set_cookies = resp.headers["set-cookie"];
                  for(i = 0; i < set_cookies.length; i++) {
                      let cookie = set_cookies[i];
                      cookie = cookie.split(";")[0];
                      cookies.push(cookie);
                  }
              } else {
                  dlog("login: no cookies to set!")
              }
              loggedIn = true;
              resolve();
          } else {
              dlog("login: rejected")
              reject("resp = null");
          }
      });
    }
    async function dlogout() {
      return new Promise(async (resolve, reject) => {
          let resp = await request.get({
              url: unifi_controller + "/dlogout",
              headers: { Cookie: cookies.join("; ") }
          }).catch((e) => reject(e));
          if(resp != null) {
              dlog("Du bist nun ausgedloggt.");
              dlog(resp);
              resolve();
          } else {
              reject("resp = null");
          }
      });
    }
    //-----------------------------------------STATUS   WIFI  ---------------------------------------------------------
    //Updatet status vom Wifi
    //wifi: wifi object aus der konstanten wifis
    async function getStatus(wifi) {
         dlog("BIN IN STATUS");
      return new Promise(async (resolve, reject) => {
          dlog("nur mal so");
          if (!loggedIn) await login().catch((e) => reject(e));
          let resp = await request.get({
              url: unifi_controller + "/api/s/default/rest/wlanconf/" + wifi.id,
              headers: { Cookie: cookies.join("; ") }
          }).catch((e) => { dlog("getStatus reject " + e); reject(e) });
    
          dlog("got response " + JSON.stringify(resp));
          resp = JSON.parse(resp);
    
          let wlanOn = resp.data[0].enabled;
          dlog("WLAN " + wifi.name + " ist: " + (wlanOn ? "an" : "aus"));
    
          if (resp != null && resp.meta && resp.meta.rc == "ok") {
              dlog("Status erfolgreich geholt!");
              dlog(resp);
              let wlanOn = resp.data[0].enabled;
              dlog("WLAN ist: " + (wlanOn ? "an" : "aus"));
              setStateDelayed(dpPrefix + "WLANUnifi." + wifi.name, wlanOn, 200);
           
              resolve(wlanOn);
          } else {
              dlog("nicht ok...")
              reject(JSON.stringify(resp));
          }dlog("BIN aus STATUS raus");
      });
       
    }
    
    //-----------------------------------------GETCLIENTS---------------------------------------------------------------
     async function getClients() {
        dlog("BIN IN CLIENTS");
       
       return new Promise(async (resolve, reject) => {
           dlog("nur mal so");
           if(!loggedIn) await login().catch((e) => reject(e));
           let resp = await request.get({
               url: unifi_controller + "/api/s/default/stat/sta/",
               headers: { Cookie: cookies.join("; ") }
           }).catch((e) => { dlog("getStatus reject " + e); reject(e) });  
      
    dlog("got response " + JSON.stringify(resp));
    dlog(typeof resp);
    dlog("--------------------- " + resp);
    //resp = JSON.parse(resp);
    
    //Sortierung Daten und Verwandlung Json
    var versuch = [];
    versuch = JSON.parse(resp).data;
    dlog(versuch[2].hostname+versuch[2].mac);
    
    versuch.sort(function(alpha, beta) {
       if ( alpha.hostname < beta.hostname )
           return -1;
       if ( alpha.hostname > beta.hostname )
           return 1;
       return 0;
    });
    dlog(versuch.length.toString());
    
    var anzahlClients = versuch.length;
    setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);
    
    var clientListe = "";
    await getExistingClients();
    
    //erstelle aktuelles array
    
    listeDatenpunkteNew=[];
    for (var i = 0; i < versuch.length; i++) { 
       listeDatenpunkteNew[i] = versuch[i].hostname;}
      dlog (listeDatenpunkteNew[3]);
    
    // gibt es unterschiedliche Daten - bezug listeDatenpunkte anwesenheit?  
    dlog("ClientTable "+listeDatenpunkteNew.length + " - " + listeDatenpunkteAlt.length); 
    if  (listeDatenpunkteNew.length == listeDatenpunkteAlt.length) {writeClientTable = false;} else {writeClientTable=true;listeDatenpunkteAlt=[];listeDatenpunkteAlt=listeDatenpunkteNew.concat();}   
    dlog("ClientTable "+writeClientTable.toString());
    dlog("ClientTable "+listeDatenpunkteNew.length + " - " + listeDatenpunkteAlt.length);
    
    
    // gibt es unterschiedliche Daten - bezug listeDatenpunkte anwesenheit?
    if (anwesenheit && listeDatenpunkteNew.length==listeDatenpunkte.length) {writeAnwesenheit = false;} else {writeAnwesenheit=true}
    dlog("writeAnwesenheit "+writeAnwesenheit.toString());
    dlog("writeAnwesenheit "+listeDatenpunkteNew.length + " - " + listeDatenpunkte.length);
    
    // erstelle htmlclientliste wenn listenDaten verändert  
        if ( writeClientTable ) {
         for (var i = 0; i < versuch.length; i++)  {
           dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
           clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
           dlog(clientListe);
           var ipWandler= versuch[i].ip;
           if (anwesenheit && writeAnwesenheit) {
              createState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].hostname, {
              name: ipWandler, 
              role: 'boolean',
              read:  true, 
              write: true,
              });
           }
         
         if (anwesenheit && listeDatenpunkteNew.indexOf(versuch[i].hostname)>-1) { //ist hostname in neuer liste und verzeichnisstruktur  -> true (anwesend)
           dlog("gefunden"+versuch[i].hostname);
           setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].hostname, true, 500);}
     } }
         
     
    if (anwesenheit) {
    for (var b = 0; b < listeDatenpunkte.length-1; b++) { //  ist hostname in verzeichnis struktur und nicht in neuer liste -> false (abwesend)
    if (listeDatenpunkteNew.indexOf(listeDatenpunkte[b])==-1) {
        dlog("nicht gefunden"+listeDatenpunkte[b]);
        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[b], false, 500);}}}
    
    if (iqontrol && anwesenheit && writeClientTable) fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl angemeldeter Geräte:"+versuch.length+"</p>"));
    
    dlog("ClientFile schreibt! "+iqontrol.toString()+writeClientTable.toString());
    if (writeClientTable) setState(dpPrefix + "WLANUnifi.Wifi_Clients", "<table>"+clientListe.concat("</table>")); //schreibe client table
    dlog("bin raus aus  clients");
    });
    
    }
    
    
    async function getExistingClients() {
       dlog("BIN IN EXISTING CLIENTS");
    listeDatenpunkte = [];
    var cacheSelectorState = $("state[state.id=" + dpPrefix + "WLANUnifi.Wifi_Client_States.*]");
      cacheSelectorState.each(function (id, c) {
        if (!id.includes("undefined")) {
         listeDatenpunkte[c] = id.replace(dpPrefix + "WLANUnifi.Wifi_Client_States.", "");}
    });
    //for (i = 0; i<listeDatenpunkte.length;i++) {log(listeDatenpunkte[i]);}
    //log(listeDatenpunkte.length.toString());
    dlog("bin raus a existing clients");
    }
    
    //-----------------------------------------GET--VOUCHERS---------------------------------------------------------------
    async function getVouchers() {
         dlog("BIN IN VOUCHERS");
       return new Promise(async (resolve, reject) => {
           dlog("nur mal so");
           if(!loggedIn) await login().catch((e) => reject(e));
           let resp = await request.get({
               url: unifi_controller + "/api/s/default/stat/voucher",
               headers: { Cookie: cookies.join("; ") }
           }).catch((e) => { dlog("getStatus reject " + e); reject(e) });  
      
    dlog("got response " + JSON.stringify(resp));
    dlog(typeof resp);
    dlog("--------------------- " + resp);
    resp = JSON.parse(resp);
    
    dlog(resp.meta);
    dlog(resp.meta.rc);
    dlog(resp.data[1].code);
    dlog(resp.data.length);
    dlog(JSON.stringify(resp).length.toString());
    var laengeMessage=JSON.stringify(resp).length;
    if (laengeMessage==writeFileVar) {writeFile = false;} else {writeFile=true}
    writeFileVar=JSON.stringify(resp).length;
    
    if (writeFile) {
    var clientListe = "<tr><td>DAUER&ensp;</td><td>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
    
    for (var i = 1; i < 21; i++) { 
       var x=i.toString();
       if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
       
    for (var i = 0; i < resp.data.length; i++) { 
      var zeit= resp.data[i].create_time*1000
      let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
    
      clientListe = clientListe.concat("<tr><td>"+resp.data[i].duration+"&ensp;</td><td>"+resp.data[i].status_expires+"&ensp;&ensp;&ensp;&ensp;</td><td>"+resp.data[i].code+"&ensp;&ensp;</td><td>" +zeit1 + "</td></tr>");
      var y=i+1; 
      var yy=y.toString();
      if (y<10 )  yy="0"+yy;
     
      if (i<20  )  {
          dlog(zeit1);
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".code"+yy, resp.data[i].code );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", zeit1 );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", resp.data[i].duration );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", resp.data[i].status_expires );
          
      }}
    
    
    //Datenpunkteäalt löschen
    var w = resp.data.length;
    for (i = w; i < 20; i++) { 
          var y=i+1; 
      var yy=y.toString();
      if (y<10 )  yy="0"+yy;
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".code"+yy, " na " );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", " na " );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", " na " );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", " na " );
    }
    }
    
    if (iqontrol && writeFile) {fs.writeFileSync(datei, format + clientListe.concat("</table></style></body></html><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl Vouchers:"+resp.data.length+"</p>"));}
    if (writeFile) setState(dpPrefix + "WLANUnifi.Wifi_Vouchers", "<table>"+clientListe.concat("</table></style></body></html>"));
    if (writeFile) setState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", resp.data.length);
    dlog("bin raus a existing vouchers");
    });
    
    }
    
    
    //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
    //Wifi an-/ausschalten
    //enabled: true = anschalten; false = ausschalten
    //wifi: wifi object aus der konstanten wifis
    async function setWifi(enabled, wifi) {
      return new Promise(async (resolve, reject) => {
          dlog("setWifi: start set Wifi_haupt");
          if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
          dlog("setWifi: now setting Wifi_haupt");
          let resp = request.post({
              url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
              body: JSON.stringify({ enabled }),
              headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
          }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
          dlog("setWifi: got response")
    
          if (resp != null) {
              dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
              dlog(resp);
              setState(dpPrefix + "WLANUnifi." + wifi.name, enabled, enabled);
              resolve();
          } else {
              dlog("setWifi: rejetced")
              dlog("resp: " + JSON.stringify(resp));
              reject("msg: " + JSON.parse(resp.body).meta.msg);
          }
      });
    }
    
    
    
    //-----------------------------------------------SCHALTER------------------------------------------------
    on({id: wifiDPs, ack: false, change: "ne"}, function (obj) { 
     var value = obj.state.val;
     var dp2 = obj.name
     setWifi(value, wifis[dp2]);
     dlog(wifis[dp2])
    });
    
    //-----------------------------------------------MAIN LOOP------------------------------------------------
    setInterval(async () => {
    
       for(let wifi_name in wifis) {
       await getStatus(wifis[wifi_name]);}
     
       if (vouchers)  getVouchers();
       await getClients();
     
    
       }, abfragezyklus); // wird oben definiert
    
    
    // Beispiel für
    //setWifi(true, wifis.WLAN_DragoRootGuest);
    
    

    bitte testen - viele änderungen

    werd mir das anwesenheitsspiel noch näher ansehen - aber wenn alles funktioniert sollte das so klappen

    dslraserD Offline
    dslraserD Offline
    dslraser
    Forum Testing Most Active
    wrote on last edited by
    #163

    @liv-in-sky
    iQontrol im Moment

    Bildschirmfoto 2019-09-03 um 15.38.23.png

    liv-in-skyL 1 Reply Last reply
    0
    • dslraserD dslraser

      @liv-in-sky
      iQontrol im Moment

      Bildschirmfoto 2019-09-03 um 15.38.23.png

      liv-in-skyL Offline
      liv-in-skyL Offline
      liv-in-sky
      wrote on last edited by
      #164

      @dslraser falls du es testest bitte vorher datenpunkte löschen

      gehe jetzt kurz rasenmähen - muss mal vom rechner weg :-)

      nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

      dslraserD S 4 Replies Last reply
      0
      • liv-in-skyL liv-in-sky

        @dslraser

        das neuste script

        // September 2019 @liv-in-sky durch viel vorarbeit von @thewhobox (api verbindung)
        
        // Definition Login
        const unifi_username = "x";
        const unifi_password = "xxxxxx!";
        const unifi_controller = "https://192.xxx.xxx.xxx:8443";
        
        
        // DEFINITION der zu anzeigenden Netzwerke am besten bis auf id und smart alle gleich setzen: beispiel:
        const wifis = {
          "WLAN_Dragon1": { name: "WLAN_Dragon1", id: "yyyyyyyyyyyyyyyyyyyyy", desc: "WLAN_Dragon1", smart: "WLAN_Dragon1" } ,
          "WLAN_DragonGuest": { name: "WLAN_DragonGuest", id: "yyyyyyyyyyyyyyyyyyyy", desc: "WLAN_DragonGuest", smart: "WLAN_DragonGuest" }
        }
        let wifiDPs = [];
        
        const request = require('request-promise-native').defaults({ rejectUnauthorized: false });
        var fs = require('fs')
        
        const datei = "/opt/iobroker/iobroker-data/files/iqontrol/htmlvoucher.html";
        const datei2 = "/opt/iobroker/iobroker-data/files/iqontrol/htmlclients.html";
        let writeFile = true;
        let  writeFileVar = 0;
        let writeClientTable = true;
        let writeAnwesenheit = true;
        let listeDatenpunkte = [];
        let listeDatenpunkteNew = [];
        let listeDatenpunkteAlt = [];
        
        // Datenpunkte Hauptpfad wählen - WICHTIG muss mit der javascript instanz, inder das script läuft zusammenpassen
        const dpPrefix = "javascript.0.";
        
        // Abfragezyklus definieren
        const abfragezyklus =20000;
        
        //HIER Einstellungen : EIN-AUSSCHALTEN Vouchers, iqontrol-Datei erstellen, anwesenheitskontrolle-clientpflege
        let  iqontrol = true;
        let  anwesenheit = true; // beim setzen von true auf false die verzeichnisstruktur unter iobroker-objects "von hand" löschen
        let vouchers = true;
        
        // Hier Definition iqontrol-Style für Popup
        const format = "<!DOCTYPE html><html><head><title>Voucher</title></head><body><table style=\"color:black;text-align:center; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
        const format2 = "<!DOCTYPE html><html><head><title>Clients</title></head><body><table style=\"color:black; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
        
        
        //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
        
        let cookies = [];
        let loggedIn = false;
        let debug = false;
        
        if ( !anwesenheit) fs.writeFileSync(datei2,("variable anwesenheit und/oder iqontrol ist nicht im unifiscript aktiviert - auf true setzen")); 
        if ( !vouchers) fs.writeFileSync(datei,("variable vouchers und/oder iqontrol ist nicht im unifiscript aktiviert - auf true setzen")); 
        
        
        
        //Erstelle Datenpunkte für die WLANs automatisch
        for(let wifi_name in wifis) {
        
            wifiDPs.push(dpPrefix + "WLANUnifi." + wifis[wifi_name].name);
           
           createState(dpPrefix + "WLANUnifi."+ wifi_name, {
              name: wifis[wifi_name].desc,
              role: 'state',
              read: true,
              write: true,
              type: "boolean",
              smartName: {
                  de: wifis[wifi_name].smart,
                  smartType: "SWITCH"
              } });}
        
        
        if (true) {
        createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
           name: 'Unifi Wifi Clients Table', 
           role: 'string',
           read:  true, 
           write: true,
        });}
        
        
        if (vouchers) {
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
           name: 'Unifi Wifi Vouchers_Table', 
           role: 'string',
           read:  true, 
           write: true,
        });
        
        for (var i = 1; i < 21; i++) { 
           var x=i.toString();
           if (i<10) x="0"+x;
          createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
           name: 'Unifi Voucher_Code'+x, 
           role: 'string',
           read:  true, 
           write: true,
           });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
           name: 'Unifi Voucher_Code_code'+x, 
           role: 'string',
           read:  true, 
           write: true,
           });    
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
           name: 'Unifi Voucher_Code_erstellt'+x, 
           role: 'string',
           read:  true, 
           write: true,
           });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
           name: 'Unifi Voucher_Code_duration'+x, 
           role: 'string',
           read:  true, 
           write: true,
           });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
           name: 'Unifi Voucher_Code_expires'+x, 
           role: 'string',
           read:  true, 
           write: true,
           });
        }}
        
        createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
        if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
        
        function dlog(message) {
          if(debug)
              console.log(message);
        }
        //-----------------------------------------LOGIN---------------------------------------------------------------
        async function login() {
          return new Promise(async (resolve, reject) => {
              let resp = await request.post({
                  resolveWithFullResponse: true,
                  url: unifi_controller + "/api/login",
                  body: JSON.stringify({ username: unifi_username, password: unifi_password }),
                  headers: { 'Content-Type': 'application/json' }
              }).catch((e) => { dlog("login: reject"), reject(e) });
              
              if(resp != null) {
                  dlog("login: login war erfolgreich! " + ((resp.headers && resp.headers.hasOwnProperty("set-cookie")) ? "Mit Cookies":"Ohne Cookies"));
                  if(resp.headers && resp.headers.hasOwnProperty("set-cookie")) {
                      let set_cookies = resp.headers["set-cookie"];
                      for(i = 0; i < set_cookies.length; i++) {
                          let cookie = set_cookies[i];
                          cookie = cookie.split(";")[0];
                          cookies.push(cookie);
                      }
                  } else {
                      dlog("login: no cookies to set!")
                  }
                  loggedIn = true;
                  resolve();
              } else {
                  dlog("login: rejected")
                  reject("resp = null");
              }
          });
        }
        async function dlogout() {
          return new Promise(async (resolve, reject) => {
              let resp = await request.get({
                  url: unifi_controller + "/dlogout",
                  headers: { Cookie: cookies.join("; ") }
              }).catch((e) => reject(e));
              if(resp != null) {
                  dlog("Du bist nun ausgedloggt.");
                  dlog(resp);
                  resolve();
              } else {
                  reject("resp = null");
              }
          });
        }
        //-----------------------------------------STATUS   WIFI  ---------------------------------------------------------
        //Updatet status vom Wifi
        //wifi: wifi object aus der konstanten wifis
        async function getStatus(wifi) {
             dlog("BIN IN STATUS");
          return new Promise(async (resolve, reject) => {
              dlog("nur mal so");
              if (!loggedIn) await login().catch((e) => reject(e));
              let resp = await request.get({
                  url: unifi_controller + "/api/s/default/rest/wlanconf/" + wifi.id,
                  headers: { Cookie: cookies.join("; ") }
              }).catch((e) => { dlog("getStatus reject " + e); reject(e) });
        
              dlog("got response " + JSON.stringify(resp));
              resp = JSON.parse(resp);
        
              let wlanOn = resp.data[0].enabled;
              dlog("WLAN " + wifi.name + " ist: " + (wlanOn ? "an" : "aus"));
        
              if (resp != null && resp.meta && resp.meta.rc == "ok") {
                  dlog("Status erfolgreich geholt!");
                  dlog(resp);
                  let wlanOn = resp.data[0].enabled;
                  dlog("WLAN ist: " + (wlanOn ? "an" : "aus"));
                  setStateDelayed(dpPrefix + "WLANUnifi." + wifi.name, wlanOn, 200);
               
                  resolve(wlanOn);
              } else {
                  dlog("nicht ok...")
                  reject(JSON.stringify(resp));
              }dlog("BIN aus STATUS raus");
          });
           
        }
        
        //-----------------------------------------GETCLIENTS---------------------------------------------------------------
         async function getClients() {
            dlog("BIN IN CLIENTS");
           
           return new Promise(async (resolve, reject) => {
               dlog("nur mal so");
               if(!loggedIn) await login().catch((e) => reject(e));
               let resp = await request.get({
                   url: unifi_controller + "/api/s/default/stat/sta/",
                   headers: { Cookie: cookies.join("; ") }
               }).catch((e) => { dlog("getStatus reject " + e); reject(e) });  
          
        dlog("got response " + JSON.stringify(resp));
        dlog(typeof resp);
        dlog("--------------------- " + resp);
        //resp = JSON.parse(resp);
        
        //Sortierung Daten und Verwandlung Json
        var versuch = [];
        versuch = JSON.parse(resp).data;
        dlog(versuch[2].hostname+versuch[2].mac);
        
        versuch.sort(function(alpha, beta) {
           if ( alpha.hostname < beta.hostname )
               return -1;
           if ( alpha.hostname > beta.hostname )
               return 1;
           return 0;
        });
        dlog(versuch.length.toString());
        
        var anzahlClients = versuch.length;
        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);
        
        var clientListe = "";
        await getExistingClients();
        
        //erstelle aktuelles array
        
        listeDatenpunkteNew=[];
        for (var i = 0; i < versuch.length; i++) { 
           listeDatenpunkteNew[i] = versuch[i].hostname;}
          dlog (listeDatenpunkteNew[3]);
        
        // gibt es unterschiedliche Daten - bezug listeDatenpunkte anwesenheit?  
        dlog("ClientTable "+listeDatenpunkteNew.length + " - " + listeDatenpunkteAlt.length); 
        if  (listeDatenpunkteNew.length == listeDatenpunkteAlt.length) {writeClientTable = false;} else {writeClientTable=true;listeDatenpunkteAlt=[];listeDatenpunkteAlt=listeDatenpunkteNew.concat();}   
        dlog("ClientTable "+writeClientTable.toString());
        dlog("ClientTable "+listeDatenpunkteNew.length + " - " + listeDatenpunkteAlt.length);
        
        
        // gibt es unterschiedliche Daten - bezug listeDatenpunkte anwesenheit?
        if (anwesenheit && listeDatenpunkteNew.length==listeDatenpunkte.length) {writeAnwesenheit = false;} else {writeAnwesenheit=true}
        dlog("writeAnwesenheit "+writeAnwesenheit.toString());
        dlog("writeAnwesenheit "+listeDatenpunkteNew.length + " - " + listeDatenpunkte.length);
        
        // erstelle htmlclientliste wenn listenDaten verändert  
            if ( writeClientTable ) {
             for (var i = 0; i < versuch.length; i++)  {
               dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
               clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
               dlog(clientListe);
               var ipWandler= versuch[i].ip;
               if (anwesenheit && writeAnwesenheit) {
                  createState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].hostname, {
                  name: ipWandler, 
                  role: 'boolean',
                  read:  true, 
                  write: true,
                  });
               }
             
             if (anwesenheit && listeDatenpunkteNew.indexOf(versuch[i].hostname)>-1) { //ist hostname in neuer liste und verzeichnisstruktur  -> true (anwesend)
               dlog("gefunden"+versuch[i].hostname);
               setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].hostname, true, 500);}
         } }
             
         
        if (anwesenheit) {
        for (var b = 0; b < listeDatenpunkte.length-1; b++) { //  ist hostname in verzeichnis struktur und nicht in neuer liste -> false (abwesend)
        if (listeDatenpunkteNew.indexOf(listeDatenpunkte[b])==-1) {
            dlog("nicht gefunden"+listeDatenpunkte[b]);
            setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[b], false, 500);}}}
        
        if (iqontrol && anwesenheit && writeClientTable) fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl angemeldeter Geräte:"+versuch.length+"</p>"));
        
        dlog("ClientFile schreibt! "+iqontrol.toString()+writeClientTable.toString());
        if (writeClientTable) setState(dpPrefix + "WLANUnifi.Wifi_Clients", "<table>"+clientListe.concat("</table>")); //schreibe client table
        dlog("bin raus aus  clients");
        });
        
        }
        
        
        async function getExistingClients() {
           dlog("BIN IN EXISTING CLIENTS");
        listeDatenpunkte = [];
        var cacheSelectorState = $("state[state.id=" + dpPrefix + "WLANUnifi.Wifi_Client_States.*]");
          cacheSelectorState.each(function (id, c) {
            if (!id.includes("undefined")) {
             listeDatenpunkte[c] = id.replace(dpPrefix + "WLANUnifi.Wifi_Client_States.", "");}
        });
        //for (i = 0; i<listeDatenpunkte.length;i++) {log(listeDatenpunkte[i]);}
        //log(listeDatenpunkte.length.toString());
        dlog("bin raus a existing clients");
        }
        
        //-----------------------------------------GET--VOUCHERS---------------------------------------------------------------
        async function getVouchers() {
             dlog("BIN IN VOUCHERS");
           return new Promise(async (resolve, reject) => {
               dlog("nur mal so");
               if(!loggedIn) await login().catch((e) => reject(e));
               let resp = await request.get({
                   url: unifi_controller + "/api/s/default/stat/voucher",
                   headers: { Cookie: cookies.join("; ") }
               }).catch((e) => { dlog("getStatus reject " + e); reject(e) });  
          
        dlog("got response " + JSON.stringify(resp));
        dlog(typeof resp);
        dlog("--------------------- " + resp);
        resp = JSON.parse(resp);
        
        dlog(resp.meta);
        dlog(resp.meta.rc);
        dlog(resp.data[1].code);
        dlog(resp.data.length);
        dlog(JSON.stringify(resp).length.toString());
        var laengeMessage=JSON.stringify(resp).length;
        if (laengeMessage==writeFileVar) {writeFile = false;} else {writeFile=true}
        writeFileVar=JSON.stringify(resp).length;
        
        if (writeFile) {
        var clientListe = "<tr><td>DAUER&ensp;</td><td>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
        
        for (var i = 1; i < 21; i++) { 
           var x=i.toString();
           if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
           
        for (var i = 0; i < resp.data.length; i++) { 
          var zeit= resp.data[i].create_time*1000
          let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
        
          clientListe = clientListe.concat("<tr><td>"+resp.data[i].duration+"&ensp;</td><td>"+resp.data[i].status_expires+"&ensp;&ensp;&ensp;&ensp;</td><td>"+resp.data[i].code+"&ensp;&ensp;</td><td>" +zeit1 + "</td></tr>");
          var y=i+1; 
          var yy=y.toString();
          if (y<10 )  yy="0"+yy;
         
          if (i<20  )  {
              dlog(zeit1);
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".code"+yy, resp.data[i].code );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", zeit1 );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", resp.data[i].duration );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", resp.data[i].status_expires );
              
          }}
        
        
        //Datenpunkteäalt löschen
        var w = resp.data.length;
        for (i = w; i < 20; i++) { 
              var y=i+1; 
          var yy=y.toString();
          if (y<10 )  yy="0"+yy;
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".code"+yy, " na " );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", " na " );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", " na " );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", " na " );
        }
        }
        
        if (iqontrol && writeFile) {fs.writeFileSync(datei, format + clientListe.concat("</table></style></body></html><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl Vouchers:"+resp.data.length+"</p>"));}
        if (writeFile) setState(dpPrefix + "WLANUnifi.Wifi_Vouchers", "<table>"+clientListe.concat("</table></style></body></html>"));
        if (writeFile) setState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", resp.data.length);
        dlog("bin raus a existing vouchers");
        });
        
        }
        
        
        //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
        //Wifi an-/ausschalten
        //enabled: true = anschalten; false = ausschalten
        //wifi: wifi object aus der konstanten wifis
        async function setWifi(enabled, wifi) {
          return new Promise(async (resolve, reject) => {
              dlog("setWifi: start set Wifi_haupt");
              if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
              dlog("setWifi: now setting Wifi_haupt");
              let resp = request.post({
                  url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
                  body: JSON.stringify({ enabled }),
                  headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
              }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
              dlog("setWifi: got response")
        
              if (resp != null) {
                  dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                  dlog(resp);
                  setState(dpPrefix + "WLANUnifi." + wifi.name, enabled, enabled);
                  resolve();
              } else {
                  dlog("setWifi: rejetced")
                  dlog("resp: " + JSON.stringify(resp));
                  reject("msg: " + JSON.parse(resp.body).meta.msg);
              }
          });
        }
        
        
        
        //-----------------------------------------------SCHALTER------------------------------------------------
        on({id: wifiDPs, ack: false, change: "ne"}, function (obj) { 
         var value = obj.state.val;
         var dp2 = obj.name
         setWifi(value, wifis[dp2]);
         dlog(wifis[dp2])
        });
        
        //-----------------------------------------------MAIN LOOP------------------------------------------------
        setInterval(async () => {
        
           for(let wifi_name in wifis) {
           await getStatus(wifis[wifi_name]);}
         
           if (vouchers)  getVouchers();
           await getClients();
         
        
           }, abfragezyklus); // wird oben definiert
        
        
        // Beispiel für
        //setWifi(true, wifis.WLAN_DragoRootGuest);
        
        

        bitte testen - viele änderungen

        werd mir das anwesenheitsspiel noch näher ansehen - aber wenn alles funktioniert sollte das so klappen

        dslraserD Offline
        dslraserD Offline
        dslraser
        Forum Testing Most Active
        wrote on last edited by
        #165

        @liv-in-sky

        neues Script getestet. Es wird alles angelegt.
        Ich kann keinen Status von den WLAN's sehen, angezeigt wird maximal null (geschaltet werden die WLAN anscheinend trotzdem, habe eben mein Haupt WLAN ausversehen ausgeknipst:confounded: )

        Bildschirmfoto 2019-09-03 um 15.54.00.png

        1 Reply Last reply
        0
        • liv-in-skyL liv-in-sky

          @dslraser falls du es testest bitte vorher datenpunkte löschen

          gehe jetzt kurz rasenmähen - muss mal vom rechner weg :-)

          dslraserD Offline
          dslraserD Offline
          dslraser
          Forum Testing Most Active
          wrote on last edited by
          #166

          @liv-in-sky

          jetzt ist es sichtbar (habe einmal das Script neu gestartet, vielleicht kam es aber auch mit dem Aktualisierungsintervall, kann ich nicht genau sagen ?)

          Bildschirmfoto 2019-09-03 um 16.05.46.png

          1 Reply Last reply
          0
          • liv-in-skyL liv-in-sky

            @dslraser falls du es testest bitte vorher datenpunkte löschen

            gehe jetzt kurz rasenmähen - muss mal vom rechner weg :-)

            dslraserD Offline
            dslraserD Offline
            dslraser
            Forum Testing Most Active
            wrote on last edited by dslraser
            #167

            @liv-in-sky
            die Sortierung der Clients in den Objekten klappt fast. Ich habe eine alphabetische Reihenfolge, bis auf alle Amazon ECHO Geräte habe sich dazwischengemogelt, aber alle hintereinander.

            Bildschirmfoto 2019-09-03 um 16.11.33.png

            Edit:
            Gerade gesehen, die Amazon Geräte fangen alle mit einem kleinen Buchstaben an, wahrscheinlich passt die Sortierung deshalb irgendwie nicht.

            thewhoboxT 1 Reply Last reply
            0
            • liv-in-skyL liv-in-sky

              @dslraser falls du es testest bitte vorher datenpunkte löschen

              gehe jetzt kurz rasenmähen - muss mal vom rechner weg :-)

              dslraserD Offline
              dslraserD Offline
              dslraser
              Forum Testing Most Active
              wrote on last edited by
              #168

              @liv-in-sky
              läuft alles, super Arbeit !:+1:
              In der Client Liste habe ich jetzt auch die IP Adresse:blush:

              iQontrol am Mac

              Bildschirmfoto 2019-09-03 um 16.19.08.png

              1 Reply Last reply
              0
              • dslraserD dslraser

                @liv-in-sky
                die Sortierung der Clients in den Objekten klappt fast. Ich habe eine alphabetische Reihenfolge, bis auf alle Amazon ECHO Geräte habe sich dazwischengemogelt, aber alle hintereinander.

                Bildschirmfoto 2019-09-03 um 16.11.33.png

                Edit:
                Gerade gesehen, die Amazon Geräte fangen alle mit einem kleinen Buchstaben an, wahrscheinlich passt die Sortierung deshalb irgendwie nicht.

                thewhoboxT Offline
                thewhoboxT Offline
                thewhobox
                wrote on last edited by
                #169

                @dslraser sagte in Unifi WLAN Script:

                Gerade gesehen, die Amazon Geräte fangen alle mit einem kleinen Buchstaben an, wahrscheinlich passt die Sortierung deshalb irgendwie nicht.

                versuch.sort(function (alpha, beta) {
                      if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                        return -1;
                      if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                        return 1;
                      return 0;
                    });
                

                Das sollte das Sortierproblem lösen.

                Meine Adapter: emby | discovery
                Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                liv-in-skyL 1 Reply Last reply
                1
                • dslraserD Offline
                  dslraserD Offline
                  dslraser
                  Forum Testing Most Active
                  wrote on last edited by dslraser
                  #170

                  @liv-in-sky

                  Telegram
                  Screenshot_20190903-164108_Telegram.jpg

                  Meine Frau hatte noch nicht mal an der Tür geklingelt, da kam schon die Nachricht. An meinem Handy habe ich dann auch direkt mal WLAN eingeschaltet.

                  1 Reply Last reply
                  0
                  • thewhoboxT thewhobox

                    @dslraser sagte in Unifi WLAN Script:

                    Gerade gesehen, die Amazon Geräte fangen alle mit einem kleinen Buchstaben an, wahrscheinlich passt die Sortierung deshalb irgendwie nicht.

                    versuch.sort(function (alpha, beta) {
                          if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                            return -1;
                          if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                            return 1;
                          return 0;
                        });
                    

                    Das sollte das Sortierproblem lösen.

                    liv-in-skyL Offline
                    liv-in-skyL Offline
                    liv-in-sky
                    wrote on last edited by
                    #171

                    @thewhobox sagte in Unifi WLAN Script:

                    @dslraser sagte in Unifi WLAN Script:

                    Gerade gesehen, die Amazon Geräte fangen alle mit einem kleinen Buchstaben an, wahrscheinlich passt die Sortierung deshalb irgendwie nicht.

                    versuch.sort(function (alpha, beta) {
                          if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                            return -1;
                          if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                            return 1;
                          return 0;
                        });
                    

                    Das sollte das Sortierproblem lösen.

                    kenn ich - aber leider geht's nicht - habe ich gestern getestet

                    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                    dslraserD thewhoboxT 2 Replies Last reply
                    0
                    • liv-in-skyL liv-in-sky

                      @thewhobox sagte in Unifi WLAN Script:

                      @dslraser sagte in Unifi WLAN Script:

                      Gerade gesehen, die Amazon Geräte fangen alle mit einem kleinen Buchstaben an, wahrscheinlich passt die Sortierung deshalb irgendwie nicht.

                      versuch.sort(function (alpha, beta) {
                            if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                              return -1;
                            if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                              return 1;
                            return 0;
                          });
                      

                      Das sollte das Sortierproblem lösen.

                      kenn ich - aber leider geht's nicht - habe ich gestern getestet

                      dslraserD Offline
                      dslraserD Offline
                      dslraser
                      Forum Testing Most Active
                      wrote on last edited by
                      #172

                      @liv-in-sky
                      habe ich eben auch probiert, ging bei mir auch nicht

                      1 Reply Last reply
                      0
                      • liv-in-skyL liv-in-sky

                        @thewhobox sagte in Unifi WLAN Script:

                        @dslraser sagte in Unifi WLAN Script:

                        Gerade gesehen, die Amazon Geräte fangen alle mit einem kleinen Buchstaben an, wahrscheinlich passt die Sortierung deshalb irgendwie nicht.

                        versuch.sort(function (alpha, beta) {
                              if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                                return -1;
                              if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                                return 1;
                              return 0;
                            });
                        

                        Das sollte das Sortierproblem lösen.

                        kenn ich - aber leider geht's nicht - habe ich gestern getestet

                        thewhoboxT Offline
                        thewhoboxT Offline
                        thewhobox
                        wrote on last edited by
                        #173

                        @liv-in-sky Was heißt ging nicht?
                        Waren immer noch so sortiert?

                        @dslraser Kannst du mir mal ein Beispiel von 1-2 Amazon Geräten und auch den darunter liegenden geben?
                        Gern auch per PN.

                        Meine Adapter: emby | discovery
                        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                        liv-in-skyL 1 Reply Last reply
                        0
                        • thewhoboxT thewhobox

                          @liv-in-sky Was heißt ging nicht?
                          Waren immer noch so sortiert?

                          @dslraser Kannst du mir mal ein Beispiel von 1-2 Amazon Geräten und auch den darunter liegenden geben?
                          Gern auch per PN.

                          liv-in-skyL Offline
                          liv-in-skyL Offline
                          liv-in-sky
                          wrote on last edited by
                          #174

                          @thewhobox
                          nein - nach der sortierung wird nicht mehr weitergearbeitet - script steht an dieser stelle - ich lasse anschliessend ein log raus mit der länge des sortierten arrays - das log kommt in der "guten" variante - es kokmmt aber nichts mehr in der lowercase - methode

                          nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                          dslraserD thewhoboxT 2 Replies Last reply
                          0
                          • liv-in-skyL liv-in-sky

                            @thewhobox
                            nein - nach der sortierung wird nicht mehr weitergearbeitet - script steht an dieser stelle - ich lasse anschliessend ein log raus mit der länge des sortierten arrays - das log kommt in der "guten" variante - es kokmmt aber nichts mehr in der lowercase - methode

                            dslraserD Offline
                            dslraserD Offline
                            dslraser
                            Forum Testing Most Active
                            wrote on last edited by
                            #175

                            @liv-in-sky
                            ja, genau so war es bei mir. Es wurden nicht mal mehr die DP angelegt.

                            @thewhobox
                            was genau brauchst Du, die Bezeichnung bzw. den Namen der ECHO'S ?

                            1 Reply Last reply
                            0
                            • liv-in-skyL liv-in-sky

                              @thewhobox
                              nein - nach der sortierung wird nicht mehr weitergearbeitet - script steht an dieser stelle - ich lasse anschliessend ein log raus mit der länge des sortierten arrays - das log kommt in der "guten" variante - es kokmmt aber nichts mehr in der lowercase - methode

                              thewhoboxT Offline
                              thewhoboxT Offline
                              thewhobox
                              wrote on last edited by
                              #176

                              @liv-in-sky Kann natürlich sein, dass wenn der hostname undefined ist dass er dann die Biege macht. Da er von undefined ja nicht Lowercase machen kann.

                              So funktioniert es bei mir:

                              var sorted = list.sort((a, b) => {
                                  if(a.hostname == undefined || b.hostname == undefined) return;
                              
                                  let ah = a.hostname.toLowerCase();
                                  let bh = b.hostname.toLowerCase();
                                  if(ah < bh)
                                      return -1;
                                  else if(ah > bh)
                                      return 1;
                                  else
                                      return 0;
                              });
                              

                              Damit landen alle mit Hostname = undefined am unteren Ende der Liste.

                              Meine Adapter: emby | discovery
                              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                              dslraserD liv-in-skyL 3 Replies Last reply
                              2
                              • thewhoboxT thewhobox

                                @liv-in-sky Kann natürlich sein, dass wenn der hostname undefined ist dass er dann die Biege macht. Da er von undefined ja nicht Lowercase machen kann.

                                So funktioniert es bei mir:

                                var sorted = list.sort((a, b) => {
                                    if(a.hostname == undefined || b.hostname == undefined) return;
                                
                                    let ah = a.hostname.toLowerCase();
                                    let bh = b.hostname.toLowerCase();
                                    if(ah < bh)
                                        return -1;
                                    else if(ah > bh)
                                        return 1;
                                    else
                                        return 0;
                                });
                                

                                Damit landen alle mit Hostname = undefined am unteren Ende der Liste.

                                dslraserD Offline
                                dslraserD Offline
                                dslraser
                                Forum Testing Most Active
                                wrote on last edited by
                                #177

                                @thewhobox sagte in Unifi WLAN Script:

                                undefined

                                davon habe ich ja einige (hatte ich Dir ja in der PN geschrieben).

                                1 Reply Last reply
                                0
                                • thewhoboxT thewhobox

                                  @liv-in-sky Kann natürlich sein, dass wenn der hostname undefined ist dass er dann die Biege macht. Da er von undefined ja nicht Lowercase machen kann.

                                  So funktioniert es bei mir:

                                  var sorted = list.sort((a, b) => {
                                      if(a.hostname == undefined || b.hostname == undefined) return;
                                  
                                      let ah = a.hostname.toLowerCase();
                                      let bh = b.hostname.toLowerCase();
                                      if(ah < bh)
                                          return -1;
                                      else if(ah > bh)
                                          return 1;
                                      else
                                          return 0;
                                  });
                                  

                                  Damit landen alle mit Hostname = undefined am unteren Ende der Liste.

                                  liv-in-skyL Offline
                                  liv-in-skyL Offline
                                  liv-in-sky
                                  wrote on last edited by
                                  #178

                                  @thewhobox werd ich probieren und rückmeldung geben - habe auch einen mit undefined

                                  nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                                  1 Reply Last reply
                                  0
                                  • thewhoboxT thewhobox

                                    @liv-in-sky Kann natürlich sein, dass wenn der hostname undefined ist dass er dann die Biege macht. Da er von undefined ja nicht Lowercase machen kann.

                                    So funktioniert es bei mir:

                                    var sorted = list.sort((a, b) => {
                                        if(a.hostname == undefined || b.hostname == undefined) return;
                                    
                                        let ah = a.hostname.toLowerCase();
                                        let bh = b.hostname.toLowerCase();
                                        if(ah < bh)
                                            return -1;
                                        else if(ah > bh)
                                            return 1;
                                        else
                                            return 0;
                                    });
                                    

                                    Damit landen alle mit Hostname = undefined am unteren Ende der Liste.

                                    liv-in-skyL Offline
                                    liv-in-skyL Offline
                                    liv-in-sky
                                    wrote on last edited by
                                    #179

                                    @thewhobox sagte in Unifi WLAN Script:

                                    @liv-in-sky Kann natürlich sein, dass wenn der hostname undefined ist dass er dann die Biege macht. Da er von undefined ja nicht Lowercase machen kann.

                                    So funktioniert es bei mir:

                                    var sorted = list.sort((a, b) => {
                                        if(a.hostname == undefined || b.hostname == undefined) return;
                                    
                                        let ah = a.hostname.toLowerCase();
                                        let bh = b.hostname.toLowerCase();
                                        if(ah < bh)
                                            return -1;
                                        else if(ah > bh)
                                            return 1;
                                        else
                                            return 0;
                                    });
                                    

                                    Damit landen alle mit Hostname = undefined am unteren Ende der Liste.

                                    könnte man das so ändern, dass die undefined nicht mehr erscheinen bzw aus dem array verschwinden - ich versuche gerade noch die last-seen-by-uap zu integrieren - da hab ich probleme mit den undefined.
                                    mir ist eh nicht klar,wo die herkommen - habe ein gerät, was einen namen hat und im netzwerk erkannt wird - nur im unifi ist er undefined

                                    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                                    thewhoboxT 1 Reply Last reply
                                    0
                                    • liv-in-skyL liv-in-sky

                                      @thewhobox sagte in Unifi WLAN Script:

                                      @liv-in-sky Kann natürlich sein, dass wenn der hostname undefined ist dass er dann die Biege macht. Da er von undefined ja nicht Lowercase machen kann.

                                      So funktioniert es bei mir:

                                      var sorted = list.sort((a, b) => {
                                          if(a.hostname == undefined || b.hostname == undefined) return;
                                      
                                          let ah = a.hostname.toLowerCase();
                                          let bh = b.hostname.toLowerCase();
                                          if(ah < bh)
                                              return -1;
                                          else if(ah > bh)
                                              return 1;
                                          else
                                              return 0;
                                      });
                                      

                                      Damit landen alle mit Hostname = undefined am unteren Ende der Liste.

                                      könnte man das so ändern, dass die undefined nicht mehr erscheinen bzw aus dem array verschwinden - ich versuche gerade noch die last-seen-by-uap zu integrieren - da hab ich probleme mit den undefined.
                                      mir ist eh nicht klar,wo die herkommen - habe ein gerät, was einen namen hat und im netzwerk erkannt wird - nur im unifi ist er undefined

                                      thewhoboxT Offline
                                      thewhoboxT Offline
                                      thewhobox
                                      wrote on last edited by thewhobox
                                      #180

                                      @liv-in-sky Bin ich grad dran, aber ich weiß nicht wie die zweite Eigenschaft heißt.

                                      Also { hostname: "Amazon-xyz", xyz: "Hier der WLAN name", ip: "192.168.0.41", mac: "ab:ce:xx:yy" }
                                      Wofür steht xyz?
                                      Das ist ja auch ausschlaggeben für die Geräte die per LAN angeschlossen sind.

                                      Meine Adapter: emby | discovery
                                      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                      liv-in-skyL 1 Reply Last reply
                                      0
                                      • thewhoboxT thewhobox

                                        @liv-in-sky Bin ich grad dran, aber ich weiß nicht wie die zweite Eigenschaft heißt.

                                        Also { hostname: "Amazon-xyz", xyz: "Hier der WLAN name", ip: "192.168.0.41", mac: "ab:ce:xx:yy" }
                                        Wofür steht xyz?
                                        Das ist ja auch ausschlaggeben für die Geräte die per LAN angeschlossen sind.

                                        liv-in-skyL Offline
                                        liv-in-skyL Offline
                                        liv-in-sky
                                        wrote on last edited by
                                        #181

                                        @thewhobox aaahh - sind das die geräte die doppelpunkte haben im namen - hier das tablet, das nicht erkannt wird
                                        Image 3.png

                                        was der name bedeuted kann ich nicht sagen - leider nutzt die fritzbox diesen internen amazon namen obwohl in der fritzbox ein anderer name festgelegt wird - ist seit ein paar fritz-os-versione so !

                                        aber ich glaube nicht, das die amazon ein problem machen - die haben einen "blöden namen" aber lesbar

                                        Image 6.png

                                        hier ein file, falls noch nicht bei dir, mit allen daten von "resp - kennwort kommt via pn
                                        json-von-geraeten.zip

                                        oder habe ich nicht verstanden was du suchst

                                        nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                                        thewhoboxT dslraserD 2 Replies Last reply
                                        0
                                        • liv-in-skyL liv-in-sky

                                          @thewhobox aaahh - sind das die geräte die doppelpunkte haben im namen - hier das tablet, das nicht erkannt wird
                                          Image 3.png

                                          was der name bedeuted kann ich nicht sagen - leider nutzt die fritzbox diesen internen amazon namen obwohl in der fritzbox ein anderer name festgelegt wird - ist seit ein paar fritz-os-versione so !

                                          aber ich glaube nicht, das die amazon ein problem machen - die haben einen "blöden namen" aber lesbar

                                          Image 6.png

                                          hier ein file, falls noch nicht bei dir, mit allen daten von "resp - kennwort kommt via pn
                                          json-von-geraeten.zip

                                          oder habe ich nicht verstanden was du suchst

                                          thewhoboxT Offline
                                          thewhoboxT Offline
                                          thewhobox
                                          wrote on last edited by
                                          #182

                                          @liv-in-sky Dankeschön

                                          Ich hab das mal so probiert:

                                          var unfiltered = [];
                                          unfiltered = JSON.parse(resp).data;
                                          dlog(unfiltered[2].hostname + unfiltered[2].mac);
                                          var versuch = [];
                                          for(var index in unfiltered) {
                                              let device = unfiltered[index];
                                              if(device.hostname !== undefined && device.essid !== undefined)
                                                  versuch.push(device);
                                          }
                                          versuch.sort(function (alpha, beta) {
                                              if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                                                  return -1;
                                              if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                                                  return 1;
                                              return 0;
                                          });
                                          

                                          Das sollte theoretisch alle an LAN angeschlossenen Geräte ausschließen, da diese keinen Wert für essid haben (vermutlich den Namen des AP an dem sie angemeldet sind)

                                          Meine Adapter: emby | discovery
                                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                          liv-in-skyL 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          782

                                          Online

                                          32.6k

                                          Users

                                          82.2k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe