Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

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

NEWS

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

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

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

Unifi WLAN Script

Geplant Angeheftet Gesperrt Verschoben JavaScript
380 Beiträge 13 Kommentatoren 57.6k Aufrufe 13 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.
  • liv-in-skyL liv-in-sky

    @dslraser @chaot

    neue version - mit aliasnamen - im script einstellen - es gibt auch einen schalter dafür - aber der ist nur für mich zum testen - wie erwähnt - alle clients müssen ein alias haben, sonst gibt es probleme mit der anwesenheit - die wird dann nicht mehr augeführt für den, mit dem fehlenden alias.

    es werden nun auch alle existierenden clients angezeigt. wenn sie nicht verbunden sind, sind sie blau markiert - man kann beobachten - zuerst stehen die disconnecten clients noch alphbetisch dabei - wenn sie im controller verschwunden sind, werden sie ans ende der list gesetzt

    diesmal sehr wichtig - datenpunkte löschen - und wie immer die instanz :-)

    damit der ap-name zum client angezeigt wird, muss eine neue konstante (gleich am anfang vom script) definiert werden - ich bekomme nur die mac-addresse des ap's - was nicht schön aussieht - in der const "apname" kannst du einen alias für den ap definieren - dieser alias hat nix mit dem ap alias im controller zu tun - die mac adresse für den ap findest du im controller (für die constante) - ich weiß nicht, wie deine lan geräte reagieren werden - gib mal vorsichtshalber auch den switch mit seiner mac an

    ich hoffe es funktioniert alles - war wieder mal eine umschreiberei des scripts - gleich mal sorry, falls ein log übergeblieben ist

    wie immer fehlt der kopf bis zu den wlan constanten

    const apName = {  "b4:xx:xx:f3:xx:63" : { aname: "AP-LongR"},
                     "18:xx:29:xx:xx:e2" : { aname: "AP-Light"}
    }
    
    
    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";
    
    
    
    
    // Datenpunkte Hauptpfad wählen - WICHTIG muss mit der javascript instanz, ind er das script läuft zusammenpassen
    const dpPrefix = "javascript.2.";
    
    //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen der clients wieder normal
    const clientPauseConst = 200000;    //1000 bedeutet 1 Sekunde -  das braucht Zeit !!!
    
    // Abfragezyklus definieren
    const abfragezyklus =20000; // es ist nicht zu empfehlen unter 20000 (20 sekunden) zu gehen
    const abfageoffset = 15000; // zu schnelle Abmeldungen können hier eingestellt weren - > erhöhen (15000 = 15 sek.)
    
    //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;
    let health = true;  // Angaben zum Systemstatus - die Healtdaten werden nur alle 5 Abfragezyklen geholt
    let aliasname=false; //benutzt alias namen, die im controller hinterlegt sind - anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige des Clients!!!
                        // es funktioniren auch die Anwesenheitserkennung nicht !!!!, wenn kein Alias im 
    
    // 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);\">";
    const format3 = "<table style=\"color:#848484; font-family:Helvetica;\">";
    
    //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
    let cookies = [];
    let loggedIn = false;
    let debug = false;
    let mylogs = false;
    let clientPause = false;
    let clientPauseVal;
    let wifiDPs = [];
    let myname = 'hostname';
    let respv;
    let respc;
    let respw;
    let resph;
    let respgv;
    let statusarr=[];
    let versuch;
    let listeDatenpunkte = [];
    let lastChange=[];
    let testerrc=false;
    let testerrl=false;
    let testerrv=false;
    let testerrs=false;
    let testerrh=false;
    let testerrcv=false;
    let testerrws=false;
    var scriptCounter=0;
    let alarmSwitch =false;
    let alarmCounter =0;
    let firstTime=0;
    let mybodyVouchers;
    var wifiLength=0;
         for(let wifi_name in wifis) {      
       wifiLength++; }
    
    
    if (aliasname)  myname="name";
    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")); 
    //if (aliasname) realname="name";
    
    
    //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: 'switch',
          read: true,
          write: true,
          type: "boolean",
          smartName: {
              de: wifis[wifi_name].smart,
              smartType: "SWITCH"
          } });}
    
    
    
    createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
       name: 'Unifi Wifi Clients Table', 
       role: 'string',
       read:  true, 
       write: true,
    });
    
    var foo = (aliasname) ? true : false;
    createState(dpPrefix + "WLANUnifi.AliasName", foo,  {
       name: ' AliasName', 
       desc:  'schaltet Aliasnamen ein',
       role: 'switch',
       type: 'boolean',
       read:  true, 
       write: true,
    }  , function() {setStateDelayed(dpPrefix + "WLANUnifi.AliasName", foo, 200)});
    
    createState(dpPrefix + "WLANUnifi.Aussortiert", {
       name: 'Aussortiert', 
       role: 'string',
       read:  true, 
       write: true,
    });
    
    if (vouchers) {
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
       name: 'Unifi Wifi Vouchers_Table', 
       role: 'string',
       read:  true, 
       write: true,
    });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create", false,  {
       name: ' A_New_Voucher_Create', 
       role: 'switch',
       type: 'boolean',
       read:  true, 
       write: true,
    });
    
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set",{
       name: ' A_New_Voucher_Dauer', 
       role: 'string',
       read:  true, 
       write: true,
    });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set",{
       name: ' A_New_Voucher_MultiUse', 
       role: 'string',
       read:  true, 
       write: true,
    });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set",{
       name: ' A_New_Voucher_Anzahl', 
       role: 'string',
       read:  true, 
       write: true,
    });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "",{
       name: ' A_New_Voucher_Notiz', 
       role: 'string',
       read:  true, 
       write: true,
    });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "",{
       name: ' A_New_Voucher_Uplaod', 
       role: 'string',
       read:  true, 
       write: true,
    });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "",{
       name: ' A_New_Voucher_Download', 
       role: 'string',
       read:  true, 
       write: true,
    });
    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", {
       name: ' A_New_Voucher_Mb_Begrenzung', 
       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 });
    
    if (health) {createState(dpPrefix + "WLANUnifi.Health.WLAN.Status", { name: 'Health_Status', desc: 'Health_Status', type: 'string', unit: '',  role: '',read: true, write: true }); 
                createState(dpPrefix + "WLANUnifi.Health.WLAN.Users", { name: 'Health_Users', desc: 'Health_Users', type: 'number', unit: '', min: '0', max: '1000', role: '',read: true, write: true }); 
                createState(dpPrefix + "WLANUnifi.Health.WLAN.Guests", { name: 'Health_Guests', desc: 'Health_Guests', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                createState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes", { name: 'Health_TXBytes', desc: 'Health_TXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true });
                createState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes", { name: 'Health_RXBytes', desc: 'Health_RXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true }); 
                createState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted", { name: 'Health_Adopted', desc: 'Health_Adopted', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                createState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled", { name: 'Health_Disabled', desc: 'Health_Disabled', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                createState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected", { name: 'Health_Disconnected', desc: 'Health_Disconnected', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });   }
    
    
    function dlog(message) {
      if(debug)
          console.log(message);
    }
    function mylog(message) {
      if(mylogs)
          console.log(message);
    }
    
    
    
    
    
    //-----------------------------------------LOGIN---------------------------------------------------------------
    async function login() {
      return new Promise(async (resolve, reject) => {
          cookies=[];
          let respl = 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) => { log("login: reject"), reject(e);  loggedIn =false;return respl=[];});
          
          if(respl != null) {
              mylog("login: login war erfolgreich! " + ((respl.headers && respl.headers.hasOwnProperty("set-cookie")) ? "Mit Cookies":"Ohne Cookies"));
              if(respl.headers && respl.headers.hasOwnProperty("set-cookie")) {
                  let set_cookies = respl.headers["set-cookie"];
                  for(i = 0; i < set_cookies.length; i++) {
                      let cookie = set_cookies[i];
                      //log(set_cookies[i]);
                      cookie = cookie.split(";")[0];
                      cookies.push(cookie);
                  }
              } else {
                  log("login: no cookies to set!")
              }
              loggedIn = true;
                    
              resolve();
          } else {
              log("login: rejected")
                loggedIn = false;
              reject("respl = null");
          }
      });
    }
    
     //-----------------------------------------LOGOUT---------------------------------------------------------------  
    async function logout() {
       log("BIN IN LOGOUT");
      return new Promise(async (resolve, reject) => {
          let respo = await request.get({
              url: unifi_controller + "/logout",
              headers: { Cookie: cookies.join("; ") }
          }).catch((e) => { log("logout fehler" + e)/*reject(e)*/ ;return testerrl=true;} );
          if (!testerrl) {
          if(respo != null) {
              log("Du bist nun ausgedloggt.");
              dlog(respo);
              log("BIN raus aus LOGOUT");
               loggedIn = true;          
              resolve();
             
          } else {
              reject("resp = null");
          }
          } else {log("reject weil resplogin ist 00"); log("BIN raus aus LOGOUT"); reject();}
          log("BIN raus aus LOGOUT");
      });
    }
    //-----------------------------------------STATUS   WIFI  ---------------------------------------------------------
    //Updatet status vom Wifi
    //wifi: wifi object aus der konstanten wifis
    function getStatus(wifi) {
         mylog("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)*/ return testerrs=true; });
        if (!testerrs) {
          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 {
              log("nicht ok... getStatusWifi")
              reject(JSON.stringify(resp));
          }
          } else {mylog("reject weil respslogin ist 00"); mylog("BIN raus aus LOGOUT"); reject();}
          mylog("BIN aus STATUS raus");
      });
       
    }
    
    //-----------------------------------------GETCLIENTS---------------------------------------------------------------
    async function getClients() {
        mylog("BIN IN getclients");
       
       return new Promise(async (resolve, reject) => {
           dlog("getclient nur mal so" + loggedIn);
          if(!loggedIn) await login().catch((e) => reject(e));
            respc = await request.get({
               url: unifi_controller + "/api/s/default/stat/sta",
               headers: { Cookie: cookies.join("; ") }
           }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrc=true; }); 
            
      if (!testerrc) {     
    dlog("got respconse nach log in getclient " + JSON.stringify(respc));
    dlog(typeof respc);
    dlog("--------------------- " + respc);
    //respc = JSON.parse(respc);
    
    //Sortierung Daten und Verwandlung Json
    
    var unfiltered = [];
    unfiltered = JSON.parse(respc).data;
    dlog("bin da");
    dlog(unfiltered[5][myname] + unfiltered[2].mac);
    versuch = [];
     let trash="";
    for(var index in unfiltered) {
       let device = unfiltered[index];
      
       if(device[myname] !== undefined && device.essid !== undefined) {versuch.push(device); } /*else {if (aliasname) {trash = trash+unfiltered[index].hostname+","}
                                                                                                     else {trash = trash+device[name]+","}}*/
       //if(device[myname] !== undefined) {trash = trash+unfiltered[index].hostname+","}
    }
    setState(dpPrefix + "WLANUnifi.Aussortiert", trash);
    versuch.sort(function (alpha, beta) {
       if (alpha[myname].toLowerCase() < beta[myname].toLowerCase())
           return -1;
       if (alpha[myname].toLowerCase() > beta[myname].toLowerCase())
           return 1;
       return 0;
    });
    
    resolve();
      } else {log("reject weil respc 00"); reject() } mylog("bin raus aus  getclients");
    }); //new promise
    
    } //getclientend
    //-----------------------------------------workCLIENTS---------------------------------------------------------------
    function workClients() {
        mylog("BIN IN workclients");
        dlog("got respconse " + JSON.stringify(respc));
        dlog(typeof respc);
        dlog("--------------------- " + respc);
    
      
    
    let writeFile = true;
    let  writeFileVar = 0;
    let writeClientTable = true;
    let writeAnwesenheit = true;
    
    var anzahlClients = versuch.length;
    setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);
    
    var clientListe = "";
    getExistingClients();
    
    
    mylog("Status1");
    
    var listeDatenpunkteNew=[];                                                        //erstelle aktuelles array von controller daten
    for (var i = 0; i < versuch.length; i++) { 
       listeDatenpunkteNew[i] = versuch[i][myname];
       }
      dlog (listeDatenpunkteNew[3]);
    
    
    let notSeen=[];
    // sind clients von controller in verzeichnisliste ? 
     for (var z = 0; z < listeDatenpunkteNew.length; z++) 
      {
               if ( listeDatenpunkte.indexOf(listeDatenpunkteNew[z]) == -1 ){   //ist controller-client existent nicht in verzeichnis-list
                      mylog("Datenpunktanlegen" + listeDatenpunkteNew[z] +"index:"+ listeDatenpunkte.indexOf(listeDatenpunkteNew[z]).toString());
                      var ipWandler= versuch[z].ip;
                      var data = dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkteNew[z];
    
                      createState(data, true, {name: ipWandler,  role: 'boolean',read:  true,  write: true, }, function() {mylog("created"); });
                      //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z][myname], true);
                      mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ; 
                } 
      }
    mylog("Status2");
    
    //sind datenpunkte noch in controller vorhanden
     if (anwesenheit) {
     for (var z = 0; z < listeDatenpunkte.length; z++)  {
               if ( listeDatenpunkteNew.indexOf(listeDatenpunkte[z]) == -1 ){        //ist datenpunkt-verzeihnis existent und nicht in controller liste
                    notSeen.push(listeDatenpunkte[z]);//log(listeDatenpunkte[z]);            //array der notSeen datenpunkte sind nicht im controller
                   if (getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z]).val) {          // setze datenpunkt auf false - nur wenn true war
                         setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z], false, 500);
                      
                         mylog("Datenpunkt ist falsch zu setzen"+listeDatenpunkte[z]);}
                  } else {dlog("ist noch im controller" + listeDatenpunkte[z]);    }
    
                  
     } }  
    
     //sind datenpunkte nicht in controller vorhanden
    
    
    mylog("Status3"); 
    
    // setze datenpunkte nach last_seen_by_uap - ausnahme: controller-clients sind nicht mehr connectet aber in vereichnis 
    
    let lastChangeList;
    if (anwesenheit) {
    timeout = setTimeout(function () {  //wegen createstate und zu schnelles setstate
    
    
    
    for (var z = 0; z < listeDatenpunkteNew.length; z++)  {
    
       var tester = parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000);
       dlog(tester.toString() + "laenge : " +listeDatenpunkteNew.length);
       if (parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) > abfragezyklus+abfageoffset && getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val) {
     //    if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, false, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100)}
           setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100);
           mylog("abgesetzt: " +listeDatenpunkteNew[z] + " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
           if (lastChange.length>=10) lastChange.shift()
           lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>out</td><td>&ensp;&ensp;vor: "+tester/1000+" Sek</td></tr>");
              mylog(lastChange[0]);
        
       }
       if (parseFloat((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) < abfragezyklus && !getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val ==null ) {
     // if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, true, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100)}
           setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100);
           mylog("gesetzt" +listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
           if (lastChange.length>=10) lastChange.shift()
           lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>in</td><td>&ensp;&ensp;vor: " + tester/1000+" Sek</td></tr>");
       }  
    }
    
    
    
    mylog("Status4");
    // erstelle htmlclientliste  
        
         for (var i = 0; i < versuch.length; i++)  {
           dlog(versuch[i][myname] + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
           if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {  
               for(let device_name in apName) {                            //Abfrage welcher AP
                   dlog(versuch[i].ap_mac +" - " + device_name +" - " + apName[device_name].aname); 
                   if (versuch[i].ap_mac==device_name) var apTransfer = apName[device_name].aname};                    
           clientListe = clientListe.concat("<tr><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>"+apTransfer+"</td></tr>");
           dlog(clientListe);} 
           else {anzahlClients=anzahlClients-1; clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>noConn</td></tr>");}
           }
         setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
    
          for (var h =0; h<notSeen.length;h++){    
                 if (notSeen.indexOf(versuch[i]) == -1 ) 
                 clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+notSeen[h]+
                 "&ensp;</td><td>noConn&ensp;&ensp;&ensp;&ensp;</td><td>noConn&ensp;&ensp;</td><td>noConn</td></tr>");
          }
    mylog("Status5");
    
    if (iqontrol && anwesenheit ) {
       
       lastChangeList=format3;
       for (var g = lastChange.length-1; g >= 0 ; g--)  {
           lastChangeList=lastChangeList.concat(lastChange[g]/*+"</table>"*/); 
           lastChangeList.concat(lastChange[g]+"</table>");
          }
    
       fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:#01A9DB; font-family:Helvetica;\">Geamtanzahl angemeldeter Clients:"+anzahlClients+"<br>Insgesamt Clients registriert: "+ listeDatenpunkte.length+
                                                          "</p><p style=\"color:#848484; font-family:Helvetica;\">Letzter Wechsel im Netzwerk:<br>"+lastChangeList+"</p>"
       ));
       //if (lastChange.length>10) lastChange=[];
    }
    dlog("ClientFile schreibt! "+iqontrol.toString()+writeClientTable.toString());
    if (true) setState(dpPrefix + "WLANUnifi.Wifi_Clients", "<table>"+clientListe.concat("</table>")); //schreibe client table
    mylog("bin raus aus  workclients");
    
    }, 2500);}
    
    
    } //workclientend
    
    //-----------------------------------------EXISTING CLIENTS---------------------------------------------------------------
    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.", "");}
    });
    
    dlog("bin raus a existing clients");
    }
    
    
    //-----------------------------------------GET--VOUCHERS---------------------------------------------------------------
    async function getVouchers() {
        if (vouchers)  {
         mylog("BIN IN getvouchers");
       return new Promise(async (resolve, reject) => {
           dlog("nur mal so");
           if(!loggedIn) await login().catch((e) => reject(e));
            respv = await request.get({
               url: unifi_controller + "/api/s/default/stat/voucher",
               headers: { Cookie: cookies.join("; ") }
           }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrv=true; });  
      if (!testerrv) {
    dlog("got response " + JSON.stringify(respv));
    dlog(typeof respv);
    dlog("--------------------- " + respv);
    resolve("done");
      } else {log("reject weil respv ist 00"); reject();}
    mylog("bin raus a GET vouchers");
    });
    }}
    
    //-----------------------------------------WORK--VOUCHERS---------------------------------------------------------------
    function workVouchers() {
       if (vouchers)  {
     //  mylog("BIN IN  workvouchers");
       dlog("got response " + JSON.stringify(respv));
       dlog(typeof respv);
       dlog("--------------------- " + respv);
    respv = JSON.parse(respv);
    
    
       dlog("--------------------- " + respv);
    dlog(respv.meta);
    dlog(respv.meta.rc);
    dlog(respv.data[1].code);
    dlog(respv.data.length);
    dlog(JSON.stringify(respv).length.toString());
    var writeFile;
    var laengeMessage=JSON.stringify(respv).length;
    if (laengeMessage==writeFileVar) {writeFile = false;} else {writeFile=true}
    var writeFileVar=JSON.stringify(respv).length;
    
    if (writeFile) {
    var clientListe = "<tr><td>DAUER&ensp;</td><td>FERTIG&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td>&ensp;&ensp;<td>NOTIZ</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 < respv.data.length; i++) { 
      var zeit= respv.data[i].create_time*1000
      let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
      let notizen;
     
      if (respv.data[i].note !== null) { notizen=respv.data[i].note} else {notizen= "&ensp;&ensp; - &ensp;&ensp;&ensp; ";}
       
      clientListe = clientListe.concat("<tr><td>"+respv.data[i].duration+"&ensp;</td><td>"+respv.data[i].status_expires+"&ensp;&ensp;&ensp;&ensp;</td><td>"+respv.data[i].code+"&ensp;&ensp;</td><td>" +zeit1 + "&ensp;&ensp;</td><td>"+notizen+"</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, respv.data[i].code );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", zeit1 );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", respv.data[i].duration );
          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", respv.data[i].status_expires );
          
      }}
    }
    
    //Datenpunkteäalt löschen
    var w = respv.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:"+respv.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", respv.data.length);
    //mylog("BIN RAUS AUS  workvouchers");
    
    }
    //-----------------------------------------GET--Health---------------------------------------------------------------
    async function getHealth() {
        if (vouchers)  {
         mylog("BIN IN gethealth");
       return new Promise(async (resolve, reject) => {
           dlog("nur mal so");
           if(!loggedIn) await login().catch((e) => reject(e));
            resph = await request.get({
               url: unifi_controller + "/api/s/default/stat/health",
               headers: { Cookie: cookies.join("; ") }
           }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrh=true; });  
      if (!testerrh) {
    dlog("got response " + JSON.stringify(resph));
    dlog(typeof resph);
    mylog("--------------------- " + resph);
    resolve("done");
      } else {log("reject weil resph ist 00"); reject();}
    mylog("bin raus a GET health");
    });
    }}
    //-----------------------------------------WORK--HEALTH---------------------------------------------------------------
    function workHealth() {
       
       mylog("BIN IN  workhealth");
       dlog("got response " + JSON.stringify(resph));
       dlog(typeof resph);
       dlog("--------------------- " + resph);
       resph=resph.replace(/-r/g, "_r")
       resph = JSON.parse(resph);
       setState(dpPrefix + "WLANUnifi.Health.WLAN.Status",resph.data[0].status );
       setState(dpPrefix + "WLANUnifi.Health.WLAN.Users",resph.data[0].num_user);
       setState(dpPrefix + "WLANUnifi.Health.WLAN.Guests",resph.data[0].num_guest );
       setState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes",resph.data[0].tx_bytes_r );
       setState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes",resph.data[0].rx_bytes_r );
       setState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted",resph.data[0].num_adopted );
       setState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled",resph.data[0].num_disabled );
       setState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected",resph.data[0].num_disconnected );
    
       mylog("bin raus a work health");
    }
    //-----------------------------------------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) {
      if (!clientPause) {
      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)*/ return testerrws=true; });
          dlog("setWifi: got response")
    
          if (resp != null) {
              dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
              dlog(resp);
                      // getclient()  Pause für umschalten
    
         
             if (firstTime>=wifiLength) {       
               //   if (true) {       
              clientPause = true;
              clientPauseVal=parseInt((new Date().getTime())); 
              }
           
              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);}
          
      });
    } else { log("WLAN wird gerade umgeschaltet"); }
    }
    
    //-----------------------------------------CREATE VOUCHERS----------------------------------------------
    //Wifi an-/ausschalten
    //enabled: true = anschalten; false = ausschalten
    //wifi: wifi object aus der konstanten wifis
    async function createVoucher (mybody) {
    
      mylog(JSON.stringify( mybody ));
      return new Promise(async (resolve, reject) => {
          log("createVoucher in aktion");
          if (!loggedIn) { mylog("need to login"); await login().catch((e) => reject(e)); }
          mylog("do it !");
          let respcv = request.post({
              url: unifi_controller + "/api/s/default/cmd/hotspot/" ,
              body: JSON.stringify( mybody ),
              // body: mybody,
              headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
          }).catch((e) => { log("setWifi: rejected: " + e);  /*reject(e)*/ return testerrcv=true; });
          log("setWifi: got response")
          log("------------: "+respcv);
    
      });
    }
    
    //-----------------------------------------------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])
     if (firstTime<wifiLength+1) firstTime++;
     
     
              
    });
    //-----------------------------------------------Aliasnamen schalten------------------------------------------------
    on({id:  dpPrefix + "WLANUnifi.AliasName",  change: "any"}, function (obj) { 
       
        (getState(dpPrefix + "WLANUnifi.AliasName").val) ? myname='name' : myname='hostname'
    
    });
    //-----------------------------------------------SCHALTER Create Voucher------------------------------------------------
    on({id:  dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",  val: true}, function (obj) { 
      var mybodyVouchers;
      var expire_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer").val;
      var n_var      = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl").val ;
      var quota_var  = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse").val ;
      var note_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz").val;
      var up_var     = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload").val ;
      var down_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download").val;
      var MBytes_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung").val ;
    
        if (expire_var !="must be set" && n_var!="must be set" && quota_var!="must be set" &&  !clientPause)  {
    
      
        //   Orginal JSON Daten
        /*   mybodyVouchers = {cmd:'create-voucher',expire:expire_var,   
                                           n:n_var, 
                                           quota:quota_var,
                                           note:note_var,
                                           up:up_var, 
                                           down:down_var,  
                                           MBytes:MBytes_var };*/
    
         var x = "{cmd:'create-voucher',expire:"+expire_var+", n:"+n_var+", quota:"+quota_var+","
    
           if (note_var != "")   x= x.concat('note:\"'+note_var+'\",')
           if (up_var != "")     x= x.concat("up:"+up_var+",")
           if (down_var != "")   x= x.concat("down:"+down_var+",")                                                        
           if (MBytes_var != "") x= x.concat("MBytes:"+MBytes_var+",")  
    
         x=x.substr(0, x.length-1);
         x=x.concat("}");
         //log (x);
         eval('var mybodyVouchers='+x);
         log(mybodyVouchers);
                                                      
         createVoucher(mybodyVouchers);
    
       } else {log("FEHLER IN createVoucher - sind die 'must be set' Werte gesetzt?","error")}
    
      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",false, 4000);
      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set" , 2000);
      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set", 2000);
      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set", 2000);
      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "", 2000);
      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "", 2000);
      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "", 2000);
      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", 2000);
    });
    
    
    //-----------------------------------------------MAIN LOOP------------------------------------------------
    setInterval(async () => {
    
          // for (let suche in wifis) {
          // if ( getState(dpPrefix + "WLANUnifi."+suche).val == null ) {log("datanpunkt ist null")} else {log("datanpunkt ist geschrieben - nicht null")};}
    
    
        scriptCounter++
        mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
        mylog(loggedIn.toString())
            
        await login().catch(alarm1)  
    
      // log("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs + " - "+testerrh);
    
    if (loggedIn) {
        if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
        if (alarmCounter > 0) {alarmCounter=0; }
        
        await getClients().catch(alarm3)  ;
        if (vouchers) await getVouchers().catch(alarm4);
        if (health)   await getHealth().catch(alarm7);
        if ( !testerrl && !testerrc && !testerrv && !testerrs && !testerrh ) {
               workVouchers();
              if (!clientPause) workClients();
               if (health && scriptCounter==5) {scriptCounter=0;workHealth();}
               }
      
               
       for(let wifi_name in wifis) {
           if ( firstTime == 3 && getState(dpPrefix + "WLANUnifi."+wifi_name).val !== null ) firstTime = 3;
           await getStatus(wifis[wifi_name]).catch(alarm6)}   
    
    }   else { alarmCounter++; 
              if (alarmCounter > 5) {log("Unifi Sript hat 'Problem mit Einloggen - Prüfe Unifi Controller, Port, Einlog-Daten","error");
                                     if  (!testerrv) log("evtl. Vouchers deaktivieren","warn");}}
    
                                   
      if (clientPause) {
            var interim=parseInt(new Date().getTime());
            log("Unifi Script ist in Pause wegen WLAN Umschalteung- bis: " + formatDate(clientPauseVal + clientPauseConst, "SS:mm:ss"),"warn");
            if (interim - clientPauseVal > clientPauseConst) {clientPause=false;log("Unifi Script hat Pause beendet"  );}  }
    
              
     testerrc=false;
         testerrv=false;
          testerrs=false;
           testerrl=false;
            testerrc=false;
             testerrh=false;
    
    
    
       }, abfragezyklus); // wird oben definiert
    
    function alarm12() {log("Im Unifi Script stimmte etwas nicht - Alarm12 - Create Voucher","warn");     loggedIn=false; testerrcv=false;cookies=[];}   
    function alarm11() {log("Im Unifi Script stimmte etwas nicht - Alarm11 - WLAN schalten","warn");      loggedIn=false; testerrws=false;cookies=[];} 
    
    function alarm7() {log("Im Unifi Script stimmte etwas nicht - Alarm7 - Health","warn");               loggedIn=false; testerrh=false;cookies=[];}   
    function alarm6() {log("Im Unifi Script stimmte etwas nicht - Alarm6 - Statusabfrage","warn");        loggedIn=false; testerrs=false;cookies=[];}    
    function alarm5() {log("Im Unifi Script stimmte etwas nicht - Alarm5 - logout","warn");               loggedIn=false; testerrl=false;cookies=[];}    
    function alarm4() {log("Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login","warn");    loggedIn=false; testerrv=false;cookies=[];}
    function alarm3() {log("Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login","warn");      loggedIn=false; testerrc=false;cookies=[];}
    function alarm1() {log("Im Unifi Script stimmte etwas nicht - Alarm1 - Login fehlgeschlagen","warn"); loggedIn=false; ;alarmSwitch=true }
    
    
    
    // Beispiel für
    //setWifi(true, wifis.WLAN_DragonGuest);
    

    @Chaot soll ich die mal eine version geben, die noch mehr log daten ausgibt - damit wir mal sehen, wo das script eigentlich hängt ? falls ja, kannst du schon mal die ap sache konfigurieren
    und falls du kein iqontrol installiert hast (adapter) muss du das auch im script disabeln !!!
    ich check es nicht, wie das script laufen kann ohne fehlermeldungen ?!? bevor du das neue script ausprobierst, kann es mnötig sein, dass du die javascript instanz des scriptes neu startest - wenn nämlich ein fehler auftritt, kann es sein, dass das alarmsystem einen sog. promise verschickt hat - und wenn dieser promise nicht aufgelöst wird, tut das script nur so, als ob es läuft
    die constante apName braucht die macadresse des accessponts, der bei die wahrsch. an der decke hängt

    ChaotC Offline
    ChaotC Offline
    Chaot
    schrieb am zuletzt editiert von
    #330

    @liv-in-sky Ich denke ich habe den Fehler gefunden.

    Die Site auf der ich meinen AP Administriere nennt sich nicht "Default" sondern "Haus"
    Ich habe das mal auf Anweisung vom Service geändert.

    Mal so eine ganz blöde Frage: Was macht eigentlich die Einstellung "Controller" im Unifi Controler? Bei mir steht da eine ganz seltsame IP Adresse drin.

    ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

    liv-in-skyL 2 Antworten Letzte Antwort
    0
    • ChaotC Chaot

      @liv-in-sky Ich denke ich habe den Fehler gefunden.

      Die Site auf der ich meinen AP Administriere nennt sich nicht "Default" sondern "Haus"
      Ich habe das mal auf Anweisung vom Service geändert.

      Mal so eine ganz blöde Frage: Was macht eigentlich die Einstellung "Controller" im Unifi Controler? Bei mir steht da eine ganz seltsame IP Adresse drin.

      liv-in-skyL Offline
      liv-in-skyL Offline
      liv-in-sky
      schrieb am zuletzt editiert von
      #331

      @Chaot bei mir steht die ip addresse des servers, auf dem der controller läuft, drin

      das dein sitename anders ist ist schon wichtig - und erklärt einiges - mal sehen, ob ich das noch im script einfüge - gebe dir morgen bescheid, dann sollte man auch den site namen definieren können

      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 Antwort Letzte Antwort
      1
      • ChaotC Chaot

        @liv-in-sky Ich denke ich habe den Fehler gefunden.

        Die Site auf der ich meinen AP Administriere nennt sich nicht "Default" sondern "Haus"
        Ich habe das mal auf Anweisung vom Service geändert.

        Mal so eine ganz blöde Frage: Was macht eigentlich die Einstellung "Controller" im Unifi Controler? Bei mir steht da eine ganz seltsame IP Adresse drin.

        liv-in-skyL Offline
        liv-in-skyL Offline
        liv-in-sky
        schrieb am zuletzt editiert von liv-in-sky
        #332

        @Chaot

        hier die version , in der man die site einstellen kann - das script beginnt unter der ap constanten - mit der falschen site geht im script nichts - gut, dass du den fehler entdeckt hast :-)

        
        let siteName ="default";   //Site name 
        
        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";
        
        
        
        
        // Datenpunkte Hauptpfad wählen - WICHTIG muss mit der javascript instanz, ind er das script läuft zusammenpassen
        const dpPrefix = "javascript.2.";
        
        //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen der clients wieder normal
        const clientPauseConst = 200000;    //1000 bedeutet 1 Sekunde -  das braucht Zeit !!!
        
        // Abfragezyklus definieren
        const abfragezyklus =20000; // es ist nicht zu empfehlen unter 20000 (20 sekunden) zu gehen
        const abfageoffset = 15000; // zu schnelle Abmeldungen können hier eingestellt weren - > erhöhen (15000 = 15 sek.)
        
        //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;
        let health = true;  // Angaben zum Systemstatus - die Healtdaten werden nur alle 5 Abfragezyklen geholt
        let aliasname=false; //benutzt alias namen, die im controller hinterlegt sind - anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige des Clients!!!
                            // es funktioniren auch die Anwesenheitserkennung nicht !!!!, wenn kein Alias im 
        
        // 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);\">";
        const format3 = "<table style=\"color:#848484; font-family:Helvetica;\">";
        
        //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
        let cookies = [];
        let loggedIn = false;
        let debug = false;
        let mylogs = false;
        let clientPause = false;
        let clientPauseVal;
        let wifiDPs = [];
        let myname = 'hostname';
        let respv;
        let respc;
        let respw;
        let resph;
        let respgv;
        let statusarr=[];
        let versuch;
        let listeDatenpunkte = [];
        let lastChange=[];
        let testerrc=false;
        let testerrl=false;
        let testerrv=false;
        let testerrs=false;
        let testerrh=false;
        let testerrcv=false;
        let testerrws=false;
        var scriptCounter=0;
        let alarmSwitch =false;
        let alarmCounter =0;
        let firstTime=0;
        let mybodyVouchers;
        var wifiLength=0;
             for(let wifi_name in wifis) {      
           wifiLength++; }
        
        
        if (aliasname)  myname="name";
        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")); 
        //if (aliasname) realname="name";
        
        
        //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: 'switch',
              read: true,
              write: true,
              type: "boolean",
              smartName: {
                  de: wifis[wifi_name].smart,
                  smartType: "SWITCH"
              } });}
        
        
        
        createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
           name: 'Unifi Wifi Clients Table', 
           role: 'string',
           read:  true, 
           write: true,
        });
        
        var foo = (aliasname) ? true : false;
        createState(dpPrefix + "WLANUnifi.AliasName", foo,  {
           name: ' AliasName', 
           desc:  'schaltet Aliasnamen ein',
           role: 'switch',
           type: 'boolean',
           read:  true, 
           write: true,
        }  , function() {setStateDelayed(dpPrefix + "WLANUnifi.AliasName", foo, 200)});
        
        createState(dpPrefix + "WLANUnifi.Aussortiert", {
           name: 'Aussortiert', 
           role: 'string',
           read:  true, 
           write: true,
        });
        
        if (vouchers) {
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
           name: 'Unifi Wifi Vouchers_Table', 
           role: 'string',
           read:  true, 
           write: true,
        });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create", false,  {
           name: ' A_New_Voucher_Create', 
           role: 'switch',
           type: 'boolean',
           read:  true, 
           write: true,
        });
        
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set",{
           name: ' A_New_Voucher_Dauer', 
           role: 'string',
           read:  true, 
           write: true,
        });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set",{
           name: ' A_New_Voucher_MultiUse', 
           role: 'string',
           read:  true, 
           write: true,
        });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set",{
           name: ' A_New_Voucher_Anzahl', 
           role: 'string',
           read:  true, 
           write: true,
        });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "",{
           name: ' A_New_Voucher_Notiz', 
           role: 'string',
           read:  true, 
           write: true,
        });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "",{
           name: ' A_New_Voucher_Uplaod', 
           role: 'string',
           read:  true, 
           write: true,
        });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "",{
           name: ' A_New_Voucher_Download', 
           role: 'string',
           read:  true, 
           write: true,
        });
        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", {
           name: ' A_New_Voucher_Mb_Begrenzung', 
           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 });
        
        if (health) {createState(dpPrefix + "WLANUnifi.Health.WLAN.Status", { name: 'Health_Status', desc: 'Health_Status', type: 'string', unit: '',  role: '',read: true, write: true }); 
                    createState(dpPrefix + "WLANUnifi.Health.WLAN.Users", { name: 'Health_Users', desc: 'Health_Users', type: 'number', unit: '', min: '0', max: '1000', role: '',read: true, write: true }); 
                    createState(dpPrefix + "WLANUnifi.Health.WLAN.Guests", { name: 'Health_Guests', desc: 'Health_Guests', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                    createState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes", { name: 'Health_TXBytes', desc: 'Health_TXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true });
                    createState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes", { name: 'Health_RXBytes', desc: 'Health_RXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true }); 
                    createState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted", { name: 'Health_Adopted', desc: 'Health_Adopted', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                    createState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled", { name: 'Health_Disabled', desc: 'Health_Disabled', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                    createState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected", { name: 'Health_Disconnected', desc: 'Health_Disconnected', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });   }
        
        
        function dlog(message) {
          if(debug)
              console.log(message);
        }
        function mylog(message) {
          if(mylogs)
              console.log(message);
        }
        
        
        
        
        
        //-----------------------------------------LOGIN---------------------------------------------------------------
        async function login() {
          return new Promise(async (resolve, reject) => {
              cookies=[];
              let respl = 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) => { log("login: reject"), reject(e);  loggedIn =false;return respl=[];});
              
              if(respl != null) {
                  mylog("login: login war erfolgreich! " + ((respl.headers && respl.headers.hasOwnProperty("set-cookie")) ? "Mit Cookies":"Ohne Cookies"));
                  if(respl.headers && respl.headers.hasOwnProperty("set-cookie")) {
                      let set_cookies = respl.headers["set-cookie"];
                      for(i = 0; i < set_cookies.length; i++) {
                          let cookie = set_cookies[i];
                          //log(set_cookies[i]);
                          cookie = cookie.split(";")[0];
                          cookies.push(cookie);
                      }
                  } else {
                      log("login: no cookies to set!")
                  }
                  loggedIn = true;
                        
                  resolve();
              } else {
                  log("login: rejected")
                    loggedIn = false;
                  reject("respl = null");
              }
          });
        }
        
         //-----------------------------------------LOGOUT---------------------------------------------------------------  
        async function logout() {
           log("BIN IN LOGOUT");
          return new Promise(async (resolve, reject) => {
              let respo = await request.get({
                  url: unifi_controller + "/logout",
                  headers: { Cookie: cookies.join("; ") }
              }).catch((e) => { log("logout fehler" + e)/*reject(e)*/ ;return testerrl=true;} );
              if (!testerrl) {
              if(respo != null) {
                  log("Du bist nun ausgedloggt.");
                  dlog(respo);
                  log("BIN raus aus LOGOUT");
                   loggedIn = true;          
                  resolve();
                 
              } else {
                  reject("resp = null");
              }
              } else {log("reject weil resplogin ist 00"); log("BIN raus aus LOGOUT"); reject();}
              log("BIN raus aus LOGOUT");
          });
        }
        //-----------------------------------------STATUS   WIFI  ---------------------------------------------------------
        //Updatet status vom Wifi
        //wifi: wifi object aus der konstanten wifis
        function getStatus(wifi) {
             mylog("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/"+siteName+"/rest/wlanconf/" + wifi.id,
                  headers: { Cookie: cookies.join("; ") }
              }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrs=true; });
            if (!testerrs) {
              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 {
                  log("nicht ok... getStatusWifi")
                  reject(JSON.stringify(resp));
              }
              } else {mylog("reject weil respslogin ist 00"); mylog("BIN raus aus LOGOUT"); reject();}
              mylog("BIN aus STATUS raus");
          });
           
        }
        
        //-----------------------------------------GETCLIENTS---------------------------------------------------------------
        async function getClients() {
            mylog("BIN IN getclients");
           
           return new Promise(async (resolve, reject) => {
               dlog("getclient nur mal so" + loggedIn);
              if(!loggedIn) await login().catch((e) => reject(e));
                respc = await request.get({
                   url: unifi_controller + "/api/s/"+siteName+"/stat/sta",
                   headers: { Cookie: cookies.join("; ") }
               }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrc=true; }); 
                
          if (!testerrc) {     
        dlog("got respconse nach log in getclient " + JSON.stringify(respc));
        dlog(typeof respc);
        dlog("--------------------- " + respc);
        //respc = JSON.parse(respc);
        
        //Sortierung Daten und Verwandlung Json
        
        var unfiltered = [];
        unfiltered = JSON.parse(respc).data;
        dlog("bin da");
        dlog(unfiltered[5][myname] + unfiltered[2].mac);
        versuch = [];
         let trash="";
        for(var index in unfiltered) {
           let device = unfiltered[index];
          
           if(device[myname] !== undefined && device.essid !== undefined) {versuch.push(device); } /*else {if (aliasname) {trash = trash+unfiltered[index].hostname+","}
                                                                                                         else {trash = trash+device[name]+","}}*/
           //if(device[myname] !== undefined) {trash = trash+unfiltered[index].hostname+","}
        }
        setState(dpPrefix + "WLANUnifi.Aussortiert", trash);
        versuch.sort(function (alpha, beta) {
           if (alpha[myname].toLowerCase() < beta[myname].toLowerCase())
               return -1;
           if (alpha[myname].toLowerCase() > beta[myname].toLowerCase())
               return 1;
           return 0;
        });
        
        resolve();
          } else {log("reject weil respc 00"); reject() } mylog("bin raus aus  getclients");
        }); //new promise
        
        } //getclientend
        //-----------------------------------------workCLIENTS---------------------------------------------------------------
        function workClients() {
            mylog("BIN IN workclients");
            dlog("got respconse " + JSON.stringify(respc));
            dlog(typeof respc);
            dlog("--------------------- " + respc);
        
          
        
        let writeFile = true;
        let  writeFileVar = 0;
        let writeClientTable = true;
        let writeAnwesenheit = true;
        
        var anzahlClients = versuch.length;
        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);
        
        var clientListe = "";
        getExistingClients();
        
        
        mylog("Status1");
        
        var listeDatenpunkteNew=[];                                                        //erstelle aktuelles array von controller daten
        for (var i = 0; i < versuch.length; i++) { 
           listeDatenpunkteNew[i] = versuch[i][myname];
           }
          dlog (listeDatenpunkteNew[3]);
        
        
        let notSeen=[];
        // sind clients von controller in verzeichnisliste ? 
         for (var z = 0; z < listeDatenpunkteNew.length; z++) 
          {
                   if ( listeDatenpunkte.indexOf(listeDatenpunkteNew[z]) == -1 ){   //ist controller-client existent nicht in verzeichnis-list
                          mylog("Datenpunktanlegen" + listeDatenpunkteNew[z] +"index:"+ listeDatenpunkte.indexOf(listeDatenpunkteNew[z]).toString());
                          var ipWandler= versuch[z].ip;
                          var data = dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkteNew[z];
        
                          createState(data, true, {name: ipWandler,  role: 'boolean',read:  true,  write: true, }, function() {mylog("created"); });
                          //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z][myname], true);
                          mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ; 
                    } 
          }
        mylog("Status2");
        
        //sind datenpunkte noch in controller vorhanden
         if (anwesenheit) {
         for (var z = 0; z < listeDatenpunkte.length; z++)  {
                   if ( listeDatenpunkteNew.indexOf(listeDatenpunkte[z]) == -1 ){        //ist datenpunkt-verzeihnis existent und nicht in controller liste
                        notSeen.push(listeDatenpunkte[z]);//log(listeDatenpunkte[z]);            //array der notSeen datenpunkte sind nicht im controller
                       if (getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z]).val) {          // setze datenpunkt auf false - nur wenn true war
                             setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z], false, 500);
                          
                             mylog("Datenpunkt ist falsch zu setzen"+listeDatenpunkte[z]);}
                      } else {dlog("ist noch im controller" + listeDatenpunkte[z]);    }
        
                      
         } }  
        
         //sind datenpunkte nicht in controller vorhanden
        
        
        mylog("Status3"); 
        
        // setze datenpunkte nach last_seen_by_uap - ausnahme: controller-clients sind nicht mehr connectet aber in vereichnis 
        
        let lastChangeList;
        if (anwesenheit) {
        timeout = setTimeout(function () {  //wegen createstate und zu schnelles setstate
        
        
        
        for (var z = 0; z < listeDatenpunkteNew.length; z++)  {
        
           var tester = parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000);
           dlog(tester.toString() + "laenge : " +listeDatenpunkteNew.length);
           if (parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) > abfragezyklus+abfageoffset && getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val) {
         //    if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, false, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100)}
               setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100);
               mylog("abgesetzt: " +listeDatenpunkteNew[z] + " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
               if (lastChange.length>=10) lastChange.shift()
               lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>out</td><td>&ensp;&ensp;vor: "+tester/1000+" Sek</td></tr>");
                  mylog(lastChange[0]);
            
           }
           if (parseFloat((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) < abfragezyklus && !getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val ==null ) {
         // if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, true, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100)}
               setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100);
               mylog("gesetzt" +listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
               if (lastChange.length>=10) lastChange.shift()
               lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>in</td><td>&ensp;&ensp;vor: " + tester/1000+" Sek</td></tr>");
           }  
        }
        
        
        
        mylog("Status4");
        // erstelle htmlclientliste  
            
             for (var i = 0; i < versuch.length; i++)  {
               dlog(versuch[i][myname] + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
               if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {  
                   for(let device_name in apName) {                            //Abfrage welcher AP
                       dlog(versuch[i].ap_mac +" - " + device_name +" - " + apName[device_name].aname); 
                       if (versuch[i].ap_mac==device_name) var apTransfer = apName[device_name].aname};                    
               clientListe = clientListe.concat("<tr><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>"+apTransfer+"</td></tr>");
               dlog(clientListe);} 
               else {anzahlClients=anzahlClients-1; clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>noConn</td></tr>");}
               }
             setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
        
              for (var h =0; h<notSeen.length;h++){    
                     if (notSeen.indexOf(versuch[i]) == -1 ) 
                     clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+notSeen[h]+
                     "&ensp;</td><td>noConn&ensp;&ensp;&ensp;&ensp;</td><td>noConn&ensp;&ensp;</td><td>noConn</td></tr>");
              }
        mylog("Status5");
        
        if (iqontrol && anwesenheit ) {
           
           lastChangeList=format3;
           for (var g = lastChange.length-1; g >= 0 ; g--)  {
               lastChangeList=lastChangeList.concat(lastChange[g]/*+"</table>"*/); 
               lastChangeList.concat(lastChange[g]+"</table>");
              }
        
           fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:#01A9DB; font-family:Helvetica;\">Geamtanzahl angemeldeter Clients:"+anzahlClients+"<br>Insgesamt Clients registriert: "+ listeDatenpunkte.length+
                                                              "</p><p style=\"color:#848484; font-family:Helvetica;\">Letzter Wechsel im Netzwerk:<br>"+lastChangeList+"</p>"
           ));
           //if (lastChange.length>10) lastChange=[];
        }
        dlog("ClientFile schreibt! "+iqontrol.toString()+writeClientTable.toString());
        if (true) setState(dpPrefix + "WLANUnifi.Wifi_Clients", "<table>"+clientListe.concat("</table>")); //schreibe client table
        mylog("bin raus aus  workclients");
        
        }, 2500);}
        
        
        } //workclientend
        
        //-----------------------------------------EXISTING CLIENTS---------------------------------------------------------------
        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.", "");}
        });
        
        dlog("bin raus a existing clients");
        }
        
        
        //-----------------------------------------GET--VOUCHERS---------------------------------------------------------------
        async function getVouchers() {
            if (vouchers)  {
             mylog("BIN IN getvouchers");
           return new Promise(async (resolve, reject) => {
               dlog("nur mal so");
               if(!loggedIn) await login().catch((e) => reject(e));
                respv = await request.get({
                   url: unifi_controller + "/api/s/"+siteName+"/stat/voucher",
                   headers: { Cookie: cookies.join("; ") }
               }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrv=true; });  
          if (!testerrv) {
        dlog("got response " + JSON.stringify(respv));
        dlog(typeof respv);
        dlog("--------------------- " + respv);
        resolve("done");
          } else {log("reject weil respv ist 00"); reject();}
        mylog("bin raus a GET vouchers");
        });
        }}
        
        //-----------------------------------------WORK--VOUCHERS---------------------------------------------------------------
        function workVouchers() {
           if (vouchers)  {
         //  mylog("BIN IN  workvouchers");
           dlog("got response " + JSON.stringify(respv));
           dlog(typeof respv);
           dlog("--------------------- " + respv);
        respv = JSON.parse(respv);
        
        
           dlog("--------------------- " + respv);
        dlog(respv.meta);
        dlog(respv.meta.rc);
        dlog(respv.data[1].code);
        dlog(respv.data.length);
        dlog(JSON.stringify(respv).length.toString());
        var writeFile;
        var laengeMessage=JSON.stringify(respv).length;
        if (laengeMessage==writeFileVar) {writeFile = false;} else {writeFile=true}
        var writeFileVar=JSON.stringify(respv).length;
        
        if (writeFile) {
        var clientListe = "<tr><td>DAUER&ensp;</td><td>FERTIG&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td>&ensp;&ensp;<td>NOTIZ</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 < respv.data.length; i++) { 
          var zeit= respv.data[i].create_time*1000
          let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
          let notizen;
         
          if (respv.data[i].note !== null) { notizen=respv.data[i].note} else {notizen= "&ensp;&ensp; - &ensp;&ensp;&ensp; ";}
           
          clientListe = clientListe.concat("<tr><td>"+respv.data[i].duration+"&ensp;</td><td>"+respv.data[i].status_expires+"&ensp;&ensp;&ensp;&ensp;</td><td>"+respv.data[i].code+"&ensp;&ensp;</td><td>" +zeit1 + "&ensp;&ensp;</td><td>"+notizen+"</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, respv.data[i].code );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", zeit1 );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", respv.data[i].duration );
              setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", respv.data[i].status_expires );
              
          }}
        }
        
        //Datenpunkteäalt löschen
        var w = respv.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:"+respv.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", respv.data.length);
        //mylog("BIN RAUS AUS  workvouchers");
        
        }
        //-----------------------------------------GET--Health---------------------------------------------------------------
        async function getHealth() {
            if (vouchers)  {
             mylog("BIN IN gethealth");
           return new Promise(async (resolve, reject) => {
               dlog("nur mal so");
               if(!loggedIn) await login().catch((e) => reject(e));
                resph = await request.get({
                   url: unifi_controller + "/api/s/"+siteName+"/stat/health",
                   headers: { Cookie: cookies.join("; ") }
               }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrh=true; });  
          if (!testerrh) {
        dlog("got response " + JSON.stringify(resph));
        dlog(typeof resph);
        mylog("--------------------- " + resph);
        resolve("done");
          } else {log("reject weil resph ist 00"); reject();}
        mylog("bin raus a GET health");
        });
        }}
        //-----------------------------------------WORK--HEALTH---------------------------------------------------------------
        function workHealth() {
           
           mylog("BIN IN  workhealth");
           dlog("got response " + JSON.stringify(resph));
           dlog(typeof resph);
           dlog("--------------------- " + resph);
           resph=resph.replace(/-r/g, "_r")
           resph = JSON.parse(resph);
           setState(dpPrefix + "WLANUnifi.Health.WLAN.Status",resph.data[0].status );
           setState(dpPrefix + "WLANUnifi.Health.WLAN.Users",resph.data[0].num_user);
           setState(dpPrefix + "WLANUnifi.Health.WLAN.Guests",resph.data[0].num_guest );
           setState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes",resph.data[0].tx_bytes_r );
           setState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes",resph.data[0].rx_bytes_r );
           setState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted",resph.data[0].num_adopted );
           setState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled",resph.data[0].num_disabled );
           setState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected",resph.data[0].num_disconnected );
        
           mylog("bin raus a work health");
        }
        //-----------------------------------------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) {
          if (!clientPause) {
          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/"+siteName+"/upd/wlanconf/" + wifi.id,
                  body: JSON.stringify({ enabled }),
                  headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
              }).catch((e) => { dlog("setWifi: rejected: " + e); /*reject(e)*/ return testerrws=true; });
              dlog("setWifi: got response")
        
              if (resp != null) {
                  dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                  dlog(resp);
                          // getclient()  Pause für umschalten
        
             
                 if (firstTime>=wifiLength) {       
                   //   if (true) {       
                  clientPause = true;
                  clientPauseVal=parseInt((new Date().getTime())); 
                  }
               
                  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);}
              
          });
        } else { log("WLAN wird gerade umgeschaltet"); }
        }
        
        //-----------------------------------------CREATE VOUCHERS----------------------------------------------
        //Wifi an-/ausschalten
        //enabled: true = anschalten; false = ausschalten
        //wifi: wifi object aus der konstanten wifis
        async function createVoucher (mybody) {
        
          mylog(JSON.stringify( mybody ));
          return new Promise(async (resolve, reject) => {
              log("createVoucher in aktion");
              if (!loggedIn) { mylog("need to login"); await login().catch((e) => reject(e)); }
              mylog("do it !");
              let respcv = request.post({
                  url: unifi_controller + "/api/s/"+siteName+"/cmd/hotspot/" ,
                  body: JSON.stringify( mybody ),
                  // body: mybody,
                  headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
              }).catch((e) => { log("setWifi: rejected: " + e);  /*reject(e)*/ return testerrcv=true; });
              log("setWifi: got response")
              log("------------: "+respcv);
        
          });
        }
        
        //-----------------------------------------------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])
         if (firstTime<wifiLength+1) firstTime++;
         
         
                  
        });
        //-----------------------------------------------Aliasnamen schalten------------------------------------------------
        on({id:  dpPrefix + "WLANUnifi.AliasName",  change: "any"}, function (obj) { 
           
            (getState(dpPrefix + "WLANUnifi.AliasName").val) ? myname='name' : myname='hostname'
        
        });
        //-----------------------------------------------SCHALTER Create Voucher------------------------------------------------
        on({id:  dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",  val: true}, function (obj) { 
          var mybodyVouchers;
          var expire_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer").val;
          var n_var      = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl").val ;
          var quota_var  = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse").val ;
          var note_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz").val;
          var up_var     = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload").val ;
          var down_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download").val;
          var MBytes_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung").val ;
        
            if (expire_var !="must be set" && n_var!="must be set" && quota_var!="must be set" &&  !clientPause)  {
        
          
            //   Orginal JSON Daten
            /*   mybodyVouchers = {cmd:'create-voucher',expire:expire_var,   
                                               n:n_var, 
                                               quota:quota_var,
                                               note:note_var,
                                               up:up_var, 
                                               down:down_var,  
                                               MBytes:MBytes_var };*/
        
             var x = "{cmd:'create-voucher',expire:"+expire_var+", n:"+n_var+", quota:"+quota_var+","
        
               if (note_var != "")   x= x.concat('note:\"'+note_var+'\",')
               if (up_var != "")     x= x.concat("up:"+up_var+",")
               if (down_var != "")   x= x.concat("down:"+down_var+",")                                                        
               if (MBytes_var != "") x= x.concat("MBytes:"+MBytes_var+",")  
        
             x=x.substr(0, x.length-1);
             x=x.concat("}");
             //log (x);
             eval('var mybodyVouchers='+x);
             log(mybodyVouchers);
                                                          
             createVoucher(mybodyVouchers);
        
           } else {log("FEHLER IN createVoucher - sind die 'must be set' Werte gesetzt?","error")}
        
          setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",false, 4000);
          setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set" , 2000);
          setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set", 2000);
          setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set", 2000);
          setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "", 2000);
          setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "", 2000);
          setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "", 2000);
          setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", 2000);
        });
        
        
        //-----------------------------------------------MAIN LOOP------------------------------------------------
        setInterval(async () => {
        
              // for (let suche in wifis) {
              // if ( getState(dpPrefix + "WLANUnifi."+suche).val == null ) {log("datanpunkt ist null")} else {log("datanpunkt ist geschrieben - nicht null")};}
        
        
            scriptCounter++
            mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
            mylog(loggedIn.toString())
                
            await login().catch(alarm1)  
        
          // log("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs + " - "+testerrh);
        
        if (loggedIn) {
            if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
            if (alarmCounter > 0) {alarmCounter=0; }
            
            await getClients().catch(alarm3)  ;
            if (vouchers) await getVouchers().catch(alarm4);
            if (health)   await getHealth().catch(alarm7);
            if ( !testerrl && !testerrc && !testerrv && !testerrs && !testerrh ) {
                   workVouchers();
                  if (!clientPause) workClients();
                   if (health && scriptCounter==5) {scriptCounter=0;workHealth();}
                   }
          
                   
           for(let wifi_name in wifis) {
               if ( firstTime == 3 && getState(dpPrefix + "WLANUnifi."+wifi_name).val !== null ) firstTime = 3;
               await getStatus(wifis[wifi_name]).catch(alarm6)}   
        
        }   else { alarmCounter++; 
                  if (alarmCounter > 5) {log("Unifi Sript hat 'Problem mit Einloggen - Prüfe Unifi Controller, Port, Einlog-Daten","error");
                                         if  (!testerrv) log("evtl. Vouchers deaktivieren","warn");}}
        
                                       
          if (clientPause) {
                var interim=parseInt(new Date().getTime());
                log("Unifi Script ist in Pause wegen WLAN Umschalteung- bis: " + formatDate(clientPauseVal + clientPauseConst, "SS:mm:ss"),"warn");
                if (interim - clientPauseVal > clientPauseConst) {clientPause=false;log("Unifi Script hat Pause beendet"  );}  }
        
                  
         testerrc=false;
             testerrv=false;
              testerrs=false;
               testerrl=false;
                testerrc=false;
                 testerrh=false;
        
        
        
           }, abfragezyklus); // wird oben definiert
        
        function alarm12() {log("Im Unifi Script stimmte etwas nicht - Alarm12 - Create Voucher","warn");     loggedIn=false; testerrcv=false;cookies=[];}   
        function alarm11() {log("Im Unifi Script stimmte etwas nicht - Alarm11 - WLAN schalten","warn");      loggedIn=false; testerrws=false;cookies=[];} 
        
        function alarm7() {log("Im Unifi Script stimmte etwas nicht - Alarm7 - Health","warn");               loggedIn=false; testerrh=false;cookies=[];}   
        function alarm6() {log("Im Unifi Script stimmte etwas nicht - Alarm6 - Statusabfrage","warn");        loggedIn=false; testerrs=false;cookies=[];}    
        function alarm5() {log("Im Unifi Script stimmte etwas nicht - Alarm5 - logout","warn");               loggedIn=false; testerrl=false;cookies=[];}    
        function alarm4() {log("Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login","warn");    loggedIn=false; testerrv=false;cookies=[];}
        function alarm3() {log("Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login","warn");      loggedIn=false; testerrc=false;cookies=[];}
        function alarm1() {log("Im Unifi Script stimmte etwas nicht - Alarm1 - Login fehlgeschlagen","warn"); loggedIn=false; ;alarmSwitch=true }
        
        
        
        // Beispiel für
        //setWifi(true, wifis.WLAN_DragonGuest);
        
        

        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 Antwort Letzte Antwort
        1
        • ChaotC Offline
          ChaotC Offline
          Chaot
          schrieb am zuletzt editiert von
          #333

          Aha!:```
          javascript.0 2019-09-12 21:33:17.603 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm7 - Health
          javascript.0 2019-09-12 21:33:17.322 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login
          javascript.0 2019-09-12 21:33:16.934 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login
          javascript.0 2019-09-12 21:32:57.671 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm7 - Health
          javascript.0 2019-09-12 21:32:57.389 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login
          javascript.0 2019-09-12 21:32:57.055 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login
          host.ioBroker 2019-09-12 21:31:34.074 info instance system.adapter.javascript.0 started with pid 25156

          
          Login ist als Superadmin

          ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

          liv-in-skyL 1 Antwort Letzte Antwort
          0
          • ChaotC Chaot

            Aha!:```
            javascript.0 2019-09-12 21:33:17.603 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm7 - Health
            javascript.0 2019-09-12 21:33:17.322 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login
            javascript.0 2019-09-12 21:33:16.934 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login
            javascript.0 2019-09-12 21:32:57.671 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm7 - Health
            javascript.0 2019-09-12 21:32:57.389 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login
            javascript.0 2019-09-12 21:32:57.055 warn script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login
            host.ioBroker 2019-09-12 21:31:34.074 info instance system.adapter.javascript.0 started with pid 25156

            
            Login ist als Superadmin
            liv-in-skyL Offline
            liv-in-skyL Offline
            liv-in-sky
            schrieb am zuletzt editiert von
            #334

            @Chaot
            hast du die javascript instanz neugestartet - damit der neustart mal " clean ist"

            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

            ChaotC 1 Antwort Letzte Antwort
            0
            • liv-in-skyL liv-in-sky

              @Chaot
              hast du die javascript instanz neugestartet - damit der neustart mal " clean ist"

              ChaotC Offline
              ChaotC Offline
              Chaot
              schrieb am zuletzt editiert von
              #335

              @liv-in-sky Eigentlich ja. Ic h werde mal den ganzen Broker nochmal starten damit auch sicher aller Müll draußen ist.

              ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

              liv-in-skyL 1 Antwort Letzte Antwort
              0
              • ChaotC Chaot

                @liv-in-sky Eigentlich ja. Ic h werde mal den ganzen Broker nochmal starten damit auch sicher aller Müll draußen ist.

                liv-in-skyL Offline
                liv-in-skyL Offline
                liv-in-sky
                schrieb am zuletzt editiert von
                #336

                @Chaot das login sollte eigentlich gut sein - sonnst kommt alarm 1als erstes

                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 Antwort Letzte Antwort
                0
                • ChaotC Offline
                  ChaotC Offline
                  Chaot
                  schrieb am zuletzt editiert von
                  #337

                  Nö - gleiche Fehlermeldung.
                  Allerdings habe ich beim Start auch noch einen Fehler der neu scheint:

                  host.ioBroker	2019-09-12 21:41:45.943	info	instance system.adapter.javascript.0 terminated with code 156 ()
                  Caught	2019-09-12 21:41:45.943	error	by controller[4]: (node:29788) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecti
                  Caught	2019-09-12 21:41:45.943	error	by controller[3]: (node:29788) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'rc' of undefined
                  Caught	2019-09-12 21:41:45.943	error	by controller[2]: (node:29788) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecti
                  Caught	2019-09-12 21:41:45.943	error	by controller[1]: (node:29788) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'rc' of undefined
                  host.ioBroker	2019-09-12 21:41:45.928	info	instance system.adapter.javascript.1 terminated with code 156 ()
                  

                  Kann der mit den Modulen zusammenhängen?

                  ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                  liv-in-skyL 1 Antwort Letzte Antwort
                  0
                  • ChaotC Chaot

                    Nö - gleiche Fehlermeldung.
                    Allerdings habe ich beim Start auch noch einen Fehler der neu scheint:

                    host.ioBroker	2019-09-12 21:41:45.943	info	instance system.adapter.javascript.0 terminated with code 156 ()
                    Caught	2019-09-12 21:41:45.943	error	by controller[4]: (node:29788) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecti
                    Caught	2019-09-12 21:41:45.943	error	by controller[3]: (node:29788) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'rc' of undefined
                    Caught	2019-09-12 21:41:45.943	error	by controller[2]: (node:29788) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecti
                    Caught	2019-09-12 21:41:45.943	error	by controller[1]: (node:29788) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'rc' of undefined
                    host.ioBroker	2019-09-12 21:41:45.928	info	instance system.adapter.javascript.1 terminated with code 156 ()
                    

                    Kann der mit den Modulen zusammenhängen?

                    liv-in-skyL Offline
                    liv-in-skyL Offline
                    liv-in-sky
                    schrieb am zuletzt editiert von
                    #338

                    @Chaot das sind die promises, die vom script über sind, wenn etwas schief läuft - nach einem neustart sollten die nicht da sein

                    es sind aber unterschiedliche js instanzen in dem log - hast du beide instanzen neugestartet?

                    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 Antwort Letzte Antwort
                    0
                    • liv-in-skyL liv-in-sky

                      @dslraser @chaot

                      neue version - mit aliasnamen - im script einstellen - es gibt auch einen schalter dafür - aber der ist nur für mich zum testen - wie erwähnt - alle clients müssen ein alias haben, sonst gibt es probleme mit der anwesenheit - die wird dann nicht mehr augeführt für den, mit dem fehlenden alias.

                      es werden nun auch alle existierenden clients angezeigt. wenn sie nicht verbunden sind, sind sie blau markiert - man kann beobachten - zuerst stehen die disconnecten clients noch alphbetisch dabei - wenn sie im controller verschwunden sind, werden sie ans ende der list gesetzt

                      diesmal sehr wichtig - datenpunkte löschen - und wie immer die instanz :-)

                      damit der ap-name zum client angezeigt wird, muss eine neue konstante (gleich am anfang vom script) definiert werden - ich bekomme nur die mac-addresse des ap's - was nicht schön aussieht - in der const "apname" kannst du einen alias für den ap definieren - dieser alias hat nix mit dem ap alias im controller zu tun - die mac adresse für den ap findest du im controller (für die constante) - ich weiß nicht, wie deine lan geräte reagieren werden - gib mal vorsichtshalber auch den switch mit seiner mac an

                      ich hoffe es funktioniert alles - war wieder mal eine umschreiberei des scripts - gleich mal sorry, falls ein log übergeblieben ist

                      wie immer fehlt der kopf bis zu den wlan constanten

                      const apName = {  "b4:xx:xx:f3:xx:63" : { aname: "AP-LongR"},
                                       "18:xx:29:xx:xx:e2" : { aname: "AP-Light"}
                      }
                      
                      
                      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";
                      
                      
                      
                      
                      // Datenpunkte Hauptpfad wählen - WICHTIG muss mit der javascript instanz, ind er das script läuft zusammenpassen
                      const dpPrefix = "javascript.2.";
                      
                      //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen der clients wieder normal
                      const clientPauseConst = 200000;    //1000 bedeutet 1 Sekunde -  das braucht Zeit !!!
                      
                      // Abfragezyklus definieren
                      const abfragezyklus =20000; // es ist nicht zu empfehlen unter 20000 (20 sekunden) zu gehen
                      const abfageoffset = 15000; // zu schnelle Abmeldungen können hier eingestellt weren - > erhöhen (15000 = 15 sek.)
                      
                      //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;
                      let health = true;  // Angaben zum Systemstatus - die Healtdaten werden nur alle 5 Abfragezyklen geholt
                      let aliasname=false; //benutzt alias namen, die im controller hinterlegt sind - anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige des Clients!!!
                                          // es funktioniren auch die Anwesenheitserkennung nicht !!!!, wenn kein Alias im 
                      
                      // 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);\">";
                      const format3 = "<table style=\"color:#848484; font-family:Helvetica;\">";
                      
                      //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
                      let cookies = [];
                      let loggedIn = false;
                      let debug = false;
                      let mylogs = false;
                      let clientPause = false;
                      let clientPauseVal;
                      let wifiDPs = [];
                      let myname = 'hostname';
                      let respv;
                      let respc;
                      let respw;
                      let resph;
                      let respgv;
                      let statusarr=[];
                      let versuch;
                      let listeDatenpunkte = [];
                      let lastChange=[];
                      let testerrc=false;
                      let testerrl=false;
                      let testerrv=false;
                      let testerrs=false;
                      let testerrh=false;
                      let testerrcv=false;
                      let testerrws=false;
                      var scriptCounter=0;
                      let alarmSwitch =false;
                      let alarmCounter =0;
                      let firstTime=0;
                      let mybodyVouchers;
                      var wifiLength=0;
                           for(let wifi_name in wifis) {      
                         wifiLength++; }
                      
                      
                      if (aliasname)  myname="name";
                      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")); 
                      //if (aliasname) realname="name";
                      
                      
                      //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: 'switch',
                            read: true,
                            write: true,
                            type: "boolean",
                            smartName: {
                                de: wifis[wifi_name].smart,
                                smartType: "SWITCH"
                            } });}
                      
                      
                      
                      createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                         name: 'Unifi Wifi Clients Table', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      
                      var foo = (aliasname) ? true : false;
                      createState(dpPrefix + "WLANUnifi.AliasName", foo,  {
                         name: ' AliasName', 
                         desc:  'schaltet Aliasnamen ein',
                         role: 'switch',
                         type: 'boolean',
                         read:  true, 
                         write: true,
                      }  , function() {setStateDelayed(dpPrefix + "WLANUnifi.AliasName", foo, 200)});
                      
                      createState(dpPrefix + "WLANUnifi.Aussortiert", {
                         name: 'Aussortiert', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      
                      if (vouchers) {
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                         name: 'Unifi Wifi Vouchers_Table', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create", false,  {
                         name: ' A_New_Voucher_Create', 
                         role: 'switch',
                         type: 'boolean',
                         read:  true, 
                         write: true,
                      });
                      
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set",{
                         name: ' A_New_Voucher_Dauer', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set",{
                         name: ' A_New_Voucher_MultiUse', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set",{
                         name: ' A_New_Voucher_Anzahl', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "",{
                         name: ' A_New_Voucher_Notiz', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "",{
                         name: ' A_New_Voucher_Uplaod', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "",{
                         name: ' A_New_Voucher_Download', 
                         role: 'string',
                         read:  true, 
                         write: true,
                      });
                      createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", {
                         name: ' A_New_Voucher_Mb_Begrenzung', 
                         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 });
                      
                      if (health) {createState(dpPrefix + "WLANUnifi.Health.WLAN.Status", { name: 'Health_Status', desc: 'Health_Status', type: 'string', unit: '',  role: '',read: true, write: true }); 
                                  createState(dpPrefix + "WLANUnifi.Health.WLAN.Users", { name: 'Health_Users', desc: 'Health_Users', type: 'number', unit: '', min: '0', max: '1000', role: '',read: true, write: true }); 
                                  createState(dpPrefix + "WLANUnifi.Health.WLAN.Guests", { name: 'Health_Guests', desc: 'Health_Guests', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                                  createState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes", { name: 'Health_TXBytes', desc: 'Health_TXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true });
                                  createState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes", { name: 'Health_RXBytes', desc: 'Health_RXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true }); 
                                  createState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted", { name: 'Health_Adopted', desc: 'Health_Adopted', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                                  createState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled", { name: 'Health_Disabled', desc: 'Health_Disabled', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                                  createState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected", { name: 'Health_Disconnected', desc: 'Health_Disconnected', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });   }
                      
                      
                      function dlog(message) {
                        if(debug)
                            console.log(message);
                      }
                      function mylog(message) {
                        if(mylogs)
                            console.log(message);
                      }
                      
                      
                      
                      
                      
                      //-----------------------------------------LOGIN---------------------------------------------------------------
                      async function login() {
                        return new Promise(async (resolve, reject) => {
                            cookies=[];
                            let respl = 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) => { log("login: reject"), reject(e);  loggedIn =false;return respl=[];});
                            
                            if(respl != null) {
                                mylog("login: login war erfolgreich! " + ((respl.headers && respl.headers.hasOwnProperty("set-cookie")) ? "Mit Cookies":"Ohne Cookies"));
                                if(respl.headers && respl.headers.hasOwnProperty("set-cookie")) {
                                    let set_cookies = respl.headers["set-cookie"];
                                    for(i = 0; i < set_cookies.length; i++) {
                                        let cookie = set_cookies[i];
                                        //log(set_cookies[i]);
                                        cookie = cookie.split(";")[0];
                                        cookies.push(cookie);
                                    }
                                } else {
                                    log("login: no cookies to set!")
                                }
                                loggedIn = true;
                                      
                                resolve();
                            } else {
                                log("login: rejected")
                                  loggedIn = false;
                                reject("respl = null");
                            }
                        });
                      }
                      
                       //-----------------------------------------LOGOUT---------------------------------------------------------------  
                      async function logout() {
                         log("BIN IN LOGOUT");
                        return new Promise(async (resolve, reject) => {
                            let respo = await request.get({
                                url: unifi_controller + "/logout",
                                headers: { Cookie: cookies.join("; ") }
                            }).catch((e) => { log("logout fehler" + e)/*reject(e)*/ ;return testerrl=true;} );
                            if (!testerrl) {
                            if(respo != null) {
                                log("Du bist nun ausgedloggt.");
                                dlog(respo);
                                log("BIN raus aus LOGOUT");
                                 loggedIn = true;          
                                resolve();
                               
                            } else {
                                reject("resp = null");
                            }
                            } else {log("reject weil resplogin ist 00"); log("BIN raus aus LOGOUT"); reject();}
                            log("BIN raus aus LOGOUT");
                        });
                      }
                      //-----------------------------------------STATUS   WIFI  ---------------------------------------------------------
                      //Updatet status vom Wifi
                      //wifi: wifi object aus der konstanten wifis
                      function getStatus(wifi) {
                           mylog("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)*/ return testerrs=true; });
                          if (!testerrs) {
                            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 {
                                log("nicht ok... getStatusWifi")
                                reject(JSON.stringify(resp));
                            }
                            } else {mylog("reject weil respslogin ist 00"); mylog("BIN raus aus LOGOUT"); reject();}
                            mylog("BIN aus STATUS raus");
                        });
                         
                      }
                      
                      //-----------------------------------------GETCLIENTS---------------------------------------------------------------
                      async function getClients() {
                          mylog("BIN IN getclients");
                         
                         return new Promise(async (resolve, reject) => {
                             dlog("getclient nur mal so" + loggedIn);
                            if(!loggedIn) await login().catch((e) => reject(e));
                              respc = await request.get({
                                 url: unifi_controller + "/api/s/default/stat/sta",
                                 headers: { Cookie: cookies.join("; ") }
                             }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrc=true; }); 
                              
                        if (!testerrc) {     
                      dlog("got respconse nach log in getclient " + JSON.stringify(respc));
                      dlog(typeof respc);
                      dlog("--------------------- " + respc);
                      //respc = JSON.parse(respc);
                      
                      //Sortierung Daten und Verwandlung Json
                      
                      var unfiltered = [];
                      unfiltered = JSON.parse(respc).data;
                      dlog("bin da");
                      dlog(unfiltered[5][myname] + unfiltered[2].mac);
                      versuch = [];
                       let trash="";
                      for(var index in unfiltered) {
                         let device = unfiltered[index];
                        
                         if(device[myname] !== undefined && device.essid !== undefined) {versuch.push(device); } /*else {if (aliasname) {trash = trash+unfiltered[index].hostname+","}
                                                                                                                       else {trash = trash+device[name]+","}}*/
                         //if(device[myname] !== undefined) {trash = trash+unfiltered[index].hostname+","}
                      }
                      setState(dpPrefix + "WLANUnifi.Aussortiert", trash);
                      versuch.sort(function (alpha, beta) {
                         if (alpha[myname].toLowerCase() < beta[myname].toLowerCase())
                             return -1;
                         if (alpha[myname].toLowerCase() > beta[myname].toLowerCase())
                             return 1;
                         return 0;
                      });
                      
                      resolve();
                        } else {log("reject weil respc 00"); reject() } mylog("bin raus aus  getclients");
                      }); //new promise
                      
                      } //getclientend
                      //-----------------------------------------workCLIENTS---------------------------------------------------------------
                      function workClients() {
                          mylog("BIN IN workclients");
                          dlog("got respconse " + JSON.stringify(respc));
                          dlog(typeof respc);
                          dlog("--------------------- " + respc);
                      
                        
                      
                      let writeFile = true;
                      let  writeFileVar = 0;
                      let writeClientTable = true;
                      let writeAnwesenheit = true;
                      
                      var anzahlClients = versuch.length;
                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);
                      
                      var clientListe = "";
                      getExistingClients();
                      
                      
                      mylog("Status1");
                      
                      var listeDatenpunkteNew=[];                                                        //erstelle aktuelles array von controller daten
                      for (var i = 0; i < versuch.length; i++) { 
                         listeDatenpunkteNew[i] = versuch[i][myname];
                         }
                        dlog (listeDatenpunkteNew[3]);
                      
                      
                      let notSeen=[];
                      // sind clients von controller in verzeichnisliste ? 
                       for (var z = 0; z < listeDatenpunkteNew.length; z++) 
                        {
                                 if ( listeDatenpunkte.indexOf(listeDatenpunkteNew[z]) == -1 ){   //ist controller-client existent nicht in verzeichnis-list
                                        mylog("Datenpunktanlegen" + listeDatenpunkteNew[z] +"index:"+ listeDatenpunkte.indexOf(listeDatenpunkteNew[z]).toString());
                                        var ipWandler= versuch[z].ip;
                                        var data = dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkteNew[z];
                      
                                        createState(data, true, {name: ipWandler,  role: 'boolean',read:  true,  write: true, }, function() {mylog("created"); });
                                        //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z][myname], true);
                                        mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ; 
                                  } 
                        }
                      mylog("Status2");
                      
                      //sind datenpunkte noch in controller vorhanden
                       if (anwesenheit) {
                       for (var z = 0; z < listeDatenpunkte.length; z++)  {
                                 if ( listeDatenpunkteNew.indexOf(listeDatenpunkte[z]) == -1 ){        //ist datenpunkt-verzeihnis existent und nicht in controller liste
                                      notSeen.push(listeDatenpunkte[z]);//log(listeDatenpunkte[z]);            //array der notSeen datenpunkte sind nicht im controller
                                     if (getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z]).val) {          // setze datenpunkt auf false - nur wenn true war
                                           setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z], false, 500);
                                        
                                           mylog("Datenpunkt ist falsch zu setzen"+listeDatenpunkte[z]);}
                                    } else {dlog("ist noch im controller" + listeDatenpunkte[z]);    }
                      
                                    
                       } }  
                      
                       //sind datenpunkte nicht in controller vorhanden
                      
                      
                      mylog("Status3"); 
                      
                      // setze datenpunkte nach last_seen_by_uap - ausnahme: controller-clients sind nicht mehr connectet aber in vereichnis 
                      
                      let lastChangeList;
                      if (anwesenheit) {
                      timeout = setTimeout(function () {  //wegen createstate und zu schnelles setstate
                      
                      
                      
                      for (var z = 0; z < listeDatenpunkteNew.length; z++)  {
                      
                         var tester = parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000);
                         dlog(tester.toString() + "laenge : " +listeDatenpunkteNew.length);
                         if (parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) > abfragezyklus+abfageoffset && getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val) {
                       //    if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, false, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100)}
                             setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100);
                             mylog("abgesetzt: " +listeDatenpunkteNew[z] + " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                             if (lastChange.length>=10) lastChange.shift()
                             lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>out</td><td>&ensp;&ensp;vor: "+tester/1000+" Sek</td></tr>");
                                mylog(lastChange[0]);
                          
                         }
                         if (parseFloat((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) < abfragezyklus && !getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val ==null ) {
                       // if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, true, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100)}
                             setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100);
                             mylog("gesetzt" +listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                             if (lastChange.length>=10) lastChange.shift()
                             lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>in</td><td>&ensp;&ensp;vor: " + tester/1000+" Sek</td></tr>");
                         }  
                      }
                      
                      
                      
                      mylog("Status4");
                      // erstelle htmlclientliste  
                          
                           for (var i = 0; i < versuch.length; i++)  {
                             dlog(versuch[i][myname] + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                             if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {  
                                 for(let device_name in apName) {                            //Abfrage welcher AP
                                     dlog(versuch[i].ap_mac +" - " + device_name +" - " + apName[device_name].aname); 
                                     if (versuch[i].ap_mac==device_name) var apTransfer = apName[device_name].aname};                    
                             clientListe = clientListe.concat("<tr><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>"+apTransfer+"</td></tr>");
                             dlog(clientListe);} 
                             else {anzahlClients=anzahlClients-1; clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>noConn</td></tr>");}
                             }
                           setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
                      
                            for (var h =0; h<notSeen.length;h++){    
                                   if (notSeen.indexOf(versuch[i]) == -1 ) 
                                   clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+notSeen[h]+
                                   "&ensp;</td><td>noConn&ensp;&ensp;&ensp;&ensp;</td><td>noConn&ensp;&ensp;</td><td>noConn</td></tr>");
                            }
                      mylog("Status5");
                      
                      if (iqontrol && anwesenheit ) {
                         
                         lastChangeList=format3;
                         for (var g = lastChange.length-1; g >= 0 ; g--)  {
                             lastChangeList=lastChangeList.concat(lastChange[g]/*+"</table>"*/); 
                             lastChangeList.concat(lastChange[g]+"</table>");
                            }
                      
                         fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:#01A9DB; font-family:Helvetica;\">Geamtanzahl angemeldeter Clients:"+anzahlClients+"<br>Insgesamt Clients registriert: "+ listeDatenpunkte.length+
                                                                            "</p><p style=\"color:#848484; font-family:Helvetica;\">Letzter Wechsel im Netzwerk:<br>"+lastChangeList+"</p>"
                         ));
                         //if (lastChange.length>10) lastChange=[];
                      }
                      dlog("ClientFile schreibt! "+iqontrol.toString()+writeClientTable.toString());
                      if (true) setState(dpPrefix + "WLANUnifi.Wifi_Clients", "<table>"+clientListe.concat("</table>")); //schreibe client table
                      mylog("bin raus aus  workclients");
                      
                      }, 2500);}
                      
                      
                      } //workclientend
                      
                      //-----------------------------------------EXISTING CLIENTS---------------------------------------------------------------
                      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.", "");}
                      });
                      
                      dlog("bin raus a existing clients");
                      }
                      
                      
                      //-----------------------------------------GET--VOUCHERS---------------------------------------------------------------
                      async function getVouchers() {
                          if (vouchers)  {
                           mylog("BIN IN getvouchers");
                         return new Promise(async (resolve, reject) => {
                             dlog("nur mal so");
                             if(!loggedIn) await login().catch((e) => reject(e));
                              respv = await request.get({
                                 url: unifi_controller + "/api/s/default/stat/voucher",
                                 headers: { Cookie: cookies.join("; ") }
                             }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrv=true; });  
                        if (!testerrv) {
                      dlog("got response " + JSON.stringify(respv));
                      dlog(typeof respv);
                      dlog("--------------------- " + respv);
                      resolve("done");
                        } else {log("reject weil respv ist 00"); reject();}
                      mylog("bin raus a GET vouchers");
                      });
                      }}
                      
                      //-----------------------------------------WORK--VOUCHERS---------------------------------------------------------------
                      function workVouchers() {
                         if (vouchers)  {
                       //  mylog("BIN IN  workvouchers");
                         dlog("got response " + JSON.stringify(respv));
                         dlog(typeof respv);
                         dlog("--------------------- " + respv);
                      respv = JSON.parse(respv);
                      
                      
                         dlog("--------------------- " + respv);
                      dlog(respv.meta);
                      dlog(respv.meta.rc);
                      dlog(respv.data[1].code);
                      dlog(respv.data.length);
                      dlog(JSON.stringify(respv).length.toString());
                      var writeFile;
                      var laengeMessage=JSON.stringify(respv).length;
                      if (laengeMessage==writeFileVar) {writeFile = false;} else {writeFile=true}
                      var writeFileVar=JSON.stringify(respv).length;
                      
                      if (writeFile) {
                      var clientListe = "<tr><td>DAUER&ensp;</td><td>FERTIG&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td>&ensp;&ensp;<td>NOTIZ</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 < respv.data.length; i++) { 
                        var zeit= respv.data[i].create_time*1000
                        let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
                        let notizen;
                       
                        if (respv.data[i].note !== null) { notizen=respv.data[i].note} else {notizen= "&ensp;&ensp; - &ensp;&ensp;&ensp; ";}
                         
                        clientListe = clientListe.concat("<tr><td>"+respv.data[i].duration+"&ensp;</td><td>"+respv.data[i].status_expires+"&ensp;&ensp;&ensp;&ensp;</td><td>"+respv.data[i].code+"&ensp;&ensp;</td><td>" +zeit1 + "&ensp;&ensp;</td><td>"+notizen+"</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, respv.data[i].code );
                            setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", zeit1 );
                            setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", respv.data[i].duration );
                            setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", respv.data[i].status_expires );
                            
                        }}
                      }
                      
                      //Datenpunkteäalt löschen
                      var w = respv.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:"+respv.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", respv.data.length);
                      //mylog("BIN RAUS AUS  workvouchers");
                      
                      }
                      //-----------------------------------------GET--Health---------------------------------------------------------------
                      async function getHealth() {
                          if (vouchers)  {
                           mylog("BIN IN gethealth");
                         return new Promise(async (resolve, reject) => {
                             dlog("nur mal so");
                             if(!loggedIn) await login().catch((e) => reject(e));
                              resph = await request.get({
                                 url: unifi_controller + "/api/s/default/stat/health",
                                 headers: { Cookie: cookies.join("; ") }
                             }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrh=true; });  
                        if (!testerrh) {
                      dlog("got response " + JSON.stringify(resph));
                      dlog(typeof resph);
                      mylog("--------------------- " + resph);
                      resolve("done");
                        } else {log("reject weil resph ist 00"); reject();}
                      mylog("bin raus a GET health");
                      });
                      }}
                      //-----------------------------------------WORK--HEALTH---------------------------------------------------------------
                      function workHealth() {
                         
                         mylog("BIN IN  workhealth");
                         dlog("got response " + JSON.stringify(resph));
                         dlog(typeof resph);
                         dlog("--------------------- " + resph);
                         resph=resph.replace(/-r/g, "_r")
                         resph = JSON.parse(resph);
                         setState(dpPrefix + "WLANUnifi.Health.WLAN.Status",resph.data[0].status );
                         setState(dpPrefix + "WLANUnifi.Health.WLAN.Users",resph.data[0].num_user);
                         setState(dpPrefix + "WLANUnifi.Health.WLAN.Guests",resph.data[0].num_guest );
                         setState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes",resph.data[0].tx_bytes_r );
                         setState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes",resph.data[0].rx_bytes_r );
                         setState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted",resph.data[0].num_adopted );
                         setState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled",resph.data[0].num_disabled );
                         setState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected",resph.data[0].num_disconnected );
                      
                         mylog("bin raus a work health");
                      }
                      //-----------------------------------------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) {
                        if (!clientPause) {
                        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)*/ return testerrws=true; });
                            dlog("setWifi: got response")
                      
                            if (resp != null) {
                                dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                                dlog(resp);
                                        // getclient()  Pause für umschalten
                      
                           
                               if (firstTime>=wifiLength) {       
                                 //   if (true) {       
                                clientPause = true;
                                clientPauseVal=parseInt((new Date().getTime())); 
                                }
                             
                                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);}
                            
                        });
                      } else { log("WLAN wird gerade umgeschaltet"); }
                      }
                      
                      //-----------------------------------------CREATE VOUCHERS----------------------------------------------
                      //Wifi an-/ausschalten
                      //enabled: true = anschalten; false = ausschalten
                      //wifi: wifi object aus der konstanten wifis
                      async function createVoucher (mybody) {
                      
                        mylog(JSON.stringify( mybody ));
                        return new Promise(async (resolve, reject) => {
                            log("createVoucher in aktion");
                            if (!loggedIn) { mylog("need to login"); await login().catch((e) => reject(e)); }
                            mylog("do it !");
                            let respcv = request.post({
                                url: unifi_controller + "/api/s/default/cmd/hotspot/" ,
                                body: JSON.stringify( mybody ),
                                // body: mybody,
                                headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                            }).catch((e) => { log("setWifi: rejected: " + e);  /*reject(e)*/ return testerrcv=true; });
                            log("setWifi: got response")
                            log("------------: "+respcv);
                      
                        });
                      }
                      
                      //-----------------------------------------------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])
                       if (firstTime<wifiLength+1) firstTime++;
                       
                       
                                
                      });
                      //-----------------------------------------------Aliasnamen schalten------------------------------------------------
                      on({id:  dpPrefix + "WLANUnifi.AliasName",  change: "any"}, function (obj) { 
                         
                          (getState(dpPrefix + "WLANUnifi.AliasName").val) ? myname='name' : myname='hostname'
                      
                      });
                      //-----------------------------------------------SCHALTER Create Voucher------------------------------------------------
                      on({id:  dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",  val: true}, function (obj) { 
                        var mybodyVouchers;
                        var expire_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer").val;
                        var n_var      = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl").val ;
                        var quota_var  = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse").val ;
                        var note_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz").val;
                        var up_var     = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload").val ;
                        var down_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download").val;
                        var MBytes_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung").val ;
                      
                          if (expire_var !="must be set" && n_var!="must be set" && quota_var!="must be set" &&  !clientPause)  {
                      
                        
                          //   Orginal JSON Daten
                          /*   mybodyVouchers = {cmd:'create-voucher',expire:expire_var,   
                                                             n:n_var, 
                                                             quota:quota_var,
                                                             note:note_var,
                                                             up:up_var, 
                                                             down:down_var,  
                                                             MBytes:MBytes_var };*/
                      
                           var x = "{cmd:'create-voucher',expire:"+expire_var+", n:"+n_var+", quota:"+quota_var+","
                      
                             if (note_var != "")   x= x.concat('note:\"'+note_var+'\",')
                             if (up_var != "")     x= x.concat("up:"+up_var+",")
                             if (down_var != "")   x= x.concat("down:"+down_var+",")                                                        
                             if (MBytes_var != "") x= x.concat("MBytes:"+MBytes_var+",")  
                      
                           x=x.substr(0, x.length-1);
                           x=x.concat("}");
                           //log (x);
                           eval('var mybodyVouchers='+x);
                           log(mybodyVouchers);
                                                                        
                           createVoucher(mybodyVouchers);
                      
                         } else {log("FEHLER IN createVoucher - sind die 'must be set' Werte gesetzt?","error")}
                      
                        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",false, 4000);
                        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set" , 2000);
                        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set", 2000);
                        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set", 2000);
                        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "", 2000);
                        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "", 2000);
                        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "", 2000);
                        setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", 2000);
                      });
                      
                      
                      //-----------------------------------------------MAIN LOOP------------------------------------------------
                      setInterval(async () => {
                      
                            // for (let suche in wifis) {
                            // if ( getState(dpPrefix + "WLANUnifi."+suche).val == null ) {log("datanpunkt ist null")} else {log("datanpunkt ist geschrieben - nicht null")};}
                      
                      
                          scriptCounter++
                          mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                          mylog(loggedIn.toString())
                              
                          await login().catch(alarm1)  
                      
                        // log("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs + " - "+testerrh);
                      
                      if (loggedIn) {
                          if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                          if (alarmCounter > 0) {alarmCounter=0; }
                          
                          await getClients().catch(alarm3)  ;
                          if (vouchers) await getVouchers().catch(alarm4);
                          if (health)   await getHealth().catch(alarm7);
                          if ( !testerrl && !testerrc && !testerrv && !testerrs && !testerrh ) {
                                 workVouchers();
                                if (!clientPause) workClients();
                                 if (health && scriptCounter==5) {scriptCounter=0;workHealth();}
                                 }
                        
                                 
                         for(let wifi_name in wifis) {
                             if ( firstTime == 3 && getState(dpPrefix + "WLANUnifi."+wifi_name).val !== null ) firstTime = 3;
                             await getStatus(wifis[wifi_name]).catch(alarm6)}   
                      
                      }   else { alarmCounter++; 
                                if (alarmCounter > 5) {log("Unifi Sript hat 'Problem mit Einloggen - Prüfe Unifi Controller, Port, Einlog-Daten","error");
                                                       if  (!testerrv) log("evtl. Vouchers deaktivieren","warn");}}
                      
                                                     
                        if (clientPause) {
                              var interim=parseInt(new Date().getTime());
                              log("Unifi Script ist in Pause wegen WLAN Umschalteung- bis: " + formatDate(clientPauseVal + clientPauseConst, "SS:mm:ss"),"warn");
                              if (interim - clientPauseVal > clientPauseConst) {clientPause=false;log("Unifi Script hat Pause beendet"  );}  }
                      
                                
                       testerrc=false;
                           testerrv=false;
                            testerrs=false;
                             testerrl=false;
                              testerrc=false;
                               testerrh=false;
                      
                      
                      
                         }, abfragezyklus); // wird oben definiert
                      
                      function alarm12() {log("Im Unifi Script stimmte etwas nicht - Alarm12 - Create Voucher","warn");     loggedIn=false; testerrcv=false;cookies=[];}   
                      function alarm11() {log("Im Unifi Script stimmte etwas nicht - Alarm11 - WLAN schalten","warn");      loggedIn=false; testerrws=false;cookies=[];} 
                      
                      function alarm7() {log("Im Unifi Script stimmte etwas nicht - Alarm7 - Health","warn");               loggedIn=false; testerrh=false;cookies=[];}   
                      function alarm6() {log("Im Unifi Script stimmte etwas nicht - Alarm6 - Statusabfrage","warn");        loggedIn=false; testerrs=false;cookies=[];}    
                      function alarm5() {log("Im Unifi Script stimmte etwas nicht - Alarm5 - logout","warn");               loggedIn=false; testerrl=false;cookies=[];}    
                      function alarm4() {log("Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login","warn");    loggedIn=false; testerrv=false;cookies=[];}
                      function alarm3() {log("Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login","warn");      loggedIn=false; testerrc=false;cookies=[];}
                      function alarm1() {log("Im Unifi Script stimmte etwas nicht - Alarm1 - Login fehlgeschlagen","warn"); loggedIn=false; ;alarmSwitch=true }
                      
                      
                      
                      // Beispiel für
                      //setWifi(true, wifis.WLAN_DragonGuest);
                      

                      @Chaot soll ich die mal eine version geben, die noch mehr log daten ausgibt - damit wir mal sehen, wo das script eigentlich hängt ? falls ja, kannst du schon mal die ap sache konfigurieren
                      und falls du kein iqontrol installiert hast (adapter) muss du das auch im script disabeln !!!
                      ich check es nicht, wie das script laufen kann ohne fehlermeldungen ?!? bevor du das neue script ausprobierst, kann es mnötig sein, dass du die javascript instanz des scriptes neu startest - wenn nämlich ein fehler auftritt, kann es sein, dass das alarmsystem einen sog. promise verschickt hat - und wenn dieser promise nicht aufgelöst wird, tut das script nur so, als ob es läuft
                      die constante apName braucht die macadresse des accessponts, der bei die wahrsch. an der decke hängt

                      dslraserD Offline
                      dslraserD Offline
                      dslraser
                      Forum Testing Most Active
                      schrieb am zuletzt editiert von dslraser
                      #339

                      @liv-in-sky sagte in Unifi WLAN Script:

                      damit der ap-name zum client angezeigt wird, muss eine neue konstante (gleich am anfang vom script) definiert werden - ich bekomme nur die mac-addresse des ap's - was nicht schön aussieht - in der const "apname" kannst du einen alias für den ap definieren - dieser alias hat nix mit dem ap alias im controller zu tun - die mac adresse für den ap findest du im controller (für die constante) - ich weiß nicht, wie deine lan geräte reagieren werden - gib mal vorsichtshalber auch den switch mit seiner mac an

                      wo soll der neue const im Script sein....? Ich finde den nicht..

                      Edit: im zweiten Spoiler war es nicht drinn, hatte gleich den genommen

                      1 Antwort Letzte Antwort
                      0
                      • ChaotC Offline
                        ChaotC Offline
                        Chaot
                        schrieb am zuletzt editiert von
                        #340

                        Das ist das Fehlerlog beim Neustart.
                        Die beiden JS Instanzen habe ich auch schon zeitgleich neu gestartet.
                        Ich werde jetzt mal genau folgenden Ablauf machen:
                        Script stoppen
                        Objekte löschen
                        JS Instanzen stopen
                        JS instazen starten
                        Script starten

                        Fällt dir was ein was ich übersehe?

                        ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                        liv-in-skyL 1 Antwort Letzte Antwort
                        0
                        • ChaotC Chaot

                          Das ist das Fehlerlog beim Neustart.
                          Die beiden JS Instanzen habe ich auch schon zeitgleich neu gestartet.
                          Ich werde jetzt mal genau folgenden Ablauf machen:
                          Script stoppen
                          Objekte löschen
                          JS Instanzen stopen
                          JS instazen starten
                          Script starten

                          Fällt dir was ein was ich übersehe?

                          liv-in-skyL Offline
                          liv-in-skyL Offline
                          liv-in-sky
                          schrieb am zuletzt editiert von
                          #341

                          @Chaot nein - sieht gut so aus

                          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 Antwort Letzte Antwort
                          0
                          • ChaotC Offline
                            ChaotC Offline
                            Chaot
                            schrieb am zuletzt editiert von
                            #342

                            Resultat:

                            javascript.0	2019-09-12 21:56:10.366	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm7 - Health
                            javascript.0	2019-09-12 21:56:10.102	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login
                            javascript.0	2019-09-12 21:56:09.819	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login
                            host.ioBroker	2019-09-12 21:55:09.565	info	instance system.adapter.javascript.0 started with pid 7688
                            host.ioBroker	2019-09-12 21:55:09.533	info	object change system.adapter.javascript.0
                            host.ioBroker	2019-09-12 21:55:08.522	info	instance system.adapter.javascript.1 started with pid 7681
                            host.ioBroker	2019-09-12 21:55:08.496	info	object change system.adapter.javascript.1
                            host.ioBroker	2019-09-12 21:55:05.066	info	instance system.adapter.javascript.1 terminated with code 156 ()
                            host.ioBroker	2019-09-12 21:55:05.016	info	stopInstance system.adapter.javascript.1 killing pid 527
                            host.ioBroker	2019-09-12 21:55:05.016	info	stopInstance system.adapter.javascript.1
                            host.ioBroker	2019-09-12 21:55:05.016	info	"system.adapter.javascript.1" disabled
                            host.ioBroker	2019-09-12 21:55:05.016	info	object change system.adapter.javascript.1
                            host.ioBroker	2019-09-12 21:55:04.215	info	instance system.adapter.javascript.0 terminated with code 156 ()
                            host.ioBroker	2019-09-12 21:55:04.164	info	stopInstance system.adapter.javascript.0 killing pid 436
                            host.ioBroker	2019-09-12 21:55:04.164	info	stopInstance system.adapter.javascript.0
                            host.ioBroker	2019-09-12 21:55:04.163	info	"system.adapter.javascript.0" disabled
                            

                            Der UniFi Adapter ist aktuell AUS. Macht das einen Unterschied?

                            ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                            liv-in-skyL 2 Antworten Letzte Antwort
                            0
                            • ChaotC Chaot

                              Resultat:

                              javascript.0	2019-09-12 21:56:10.366	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm7 - Health
                              javascript.0	2019-09-12 21:56:10.102	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login
                              javascript.0	2019-09-12 21:56:09.819	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login
                              host.ioBroker	2019-09-12 21:55:09.565	info	instance system.adapter.javascript.0 started with pid 7688
                              host.ioBroker	2019-09-12 21:55:09.533	info	object change system.adapter.javascript.0
                              host.ioBroker	2019-09-12 21:55:08.522	info	instance system.adapter.javascript.1 started with pid 7681
                              host.ioBroker	2019-09-12 21:55:08.496	info	object change system.adapter.javascript.1
                              host.ioBroker	2019-09-12 21:55:05.066	info	instance system.adapter.javascript.1 terminated with code 156 ()
                              host.ioBroker	2019-09-12 21:55:05.016	info	stopInstance system.adapter.javascript.1 killing pid 527
                              host.ioBroker	2019-09-12 21:55:05.016	info	stopInstance system.adapter.javascript.1
                              host.ioBroker	2019-09-12 21:55:05.016	info	"system.adapter.javascript.1" disabled
                              host.ioBroker	2019-09-12 21:55:05.016	info	object change system.adapter.javascript.1
                              host.ioBroker	2019-09-12 21:55:04.215	info	instance system.adapter.javascript.0 terminated with code 156 ()
                              host.ioBroker	2019-09-12 21:55:04.164	info	stopInstance system.adapter.javascript.0 killing pid 436
                              host.ioBroker	2019-09-12 21:55:04.164	info	stopInstance system.adapter.javascript.0
                              host.ioBroker	2019-09-12 21:55:04.163	info	"system.adapter.javascript.0" disabled
                              

                              Der UniFi Adapter ist aktuell AUS. Macht das einen Unterschied?

                              liv-in-skyL Offline
                              liv-in-skyL Offline
                              liv-in-sky
                              schrieb am zuletzt editiert von
                              #343

                              @Chaot ich nutze den adapter nicht - ist bei mir aus

                              so wie es aussieht, kann ersich einloggen - aber dann beim ersten holen der daten (getClient()) passiert ein fehler

                              ich schau mal oib mir noch was einfällt

                              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 Antwort Letzte Antwort
                              0
                              • ChaotC Chaot

                                Resultat:

                                javascript.0	2019-09-12 21:56:10.366	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm7 - Health
                                javascript.0	2019-09-12 21:56:10.102	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login
                                javascript.0	2019-09-12 21:56:09.819	warn	script.js.Unifi.UnifiNeu: Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login
                                host.ioBroker	2019-09-12 21:55:09.565	info	instance system.adapter.javascript.0 started with pid 7688
                                host.ioBroker	2019-09-12 21:55:09.533	info	object change system.adapter.javascript.0
                                host.ioBroker	2019-09-12 21:55:08.522	info	instance system.adapter.javascript.1 started with pid 7681
                                host.ioBroker	2019-09-12 21:55:08.496	info	object change system.adapter.javascript.1
                                host.ioBroker	2019-09-12 21:55:05.066	info	instance system.adapter.javascript.1 terminated with code 156 ()
                                host.ioBroker	2019-09-12 21:55:05.016	info	stopInstance system.adapter.javascript.1 killing pid 527
                                host.ioBroker	2019-09-12 21:55:05.016	info	stopInstance system.adapter.javascript.1
                                host.ioBroker	2019-09-12 21:55:05.016	info	"system.adapter.javascript.1" disabled
                                host.ioBroker	2019-09-12 21:55:05.016	info	object change system.adapter.javascript.1
                                host.ioBroker	2019-09-12 21:55:04.215	info	instance system.adapter.javascript.0 terminated with code 156 ()
                                host.ioBroker	2019-09-12 21:55:04.164	info	stopInstance system.adapter.javascript.0 killing pid 436
                                host.ioBroker	2019-09-12 21:55:04.164	info	stopInstance system.adapter.javascript.0
                                host.ioBroker	2019-09-12 21:55:04.163	info	"system.adapter.javascript.0" disabled
                                

                                Der UniFi Adapter ist aktuell AUS. Macht das einen Unterschied?

                                liv-in-skyL Offline
                                liv-in-skyL Offline
                                liv-in-sky
                                schrieb am zuletzt editiert von
                                #344

                                @Chaot

                                probier das mal aber bevor du es startest - wieder die instanzen neustarten - hier kommt etwas mehr log)

                                
                                let siteName ="default";   //Site name 
                                
                                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";
                                
                                
                                
                                
                                // Datenpunkte Hauptpfad wählen - WICHTIG muss mit der javascript instanz, ind er das script läuft zusammenpassen
                                const dpPrefix = "javascript.2.";
                                
                                //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen der clients wieder normal
                                const clientPauseConst = 200000;    //1000 bedeutet 1 Sekunde -  das braucht Zeit !!!
                                
                                // Abfragezyklus definieren
                                const abfragezyklus =20000; // es ist nicht zu empfehlen unter 20000 (20 sekunden) zu gehen
                                const abfageoffset = 15000; // zu schnelle Abmeldungen können hier eingestellt weren - > erhöhen (15000 = 15 sek.)
                                
                                //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;
                                let health = true;  // Angaben zum Systemstatus - die Healtdaten werden nur alle 5 Abfragezyklen geholt
                                let aliasname=false; //benutzt alias namen, die im controller hinterlegt sind - anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige des Clients!!!
                                                    // es funktioniren auch die Anwesenheitserkennung nicht !!!!, wenn kein Alias im 
                                
                                // 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);\">";
                                const format3 = "<table style=\"color:#848484; font-family:Helvetica;\">";
                                
                                //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
                                let cookies = [];
                                let loggedIn = false;
                                let debug = false;
                                let mylogs = false;
                                let clientPause = false;
                                let clientPauseVal;
                                let wifiDPs = [];
                                let myname = 'hostname';
                                let respv;
                                let respc;
                                let respw;
                                let resph;
                                let respgv;
                                let statusarr=[];
                                let versuch;
                                let listeDatenpunkte = [];
                                let lastChange=[];
                                let testerrc=false;
                                let testerrl=false;
                                let testerrv=false;
                                let testerrs=false;
                                let testerrh=false;
                                let testerrcv=false;
                                let testerrws=false;
                                var scriptCounter=0;
                                let alarmSwitch =false;
                                let alarmCounter =0;
                                let firstTime=0;
                                let mybodyVouchers;
                                var wifiLength=0;
                                     for(let wifi_name in wifis) {      
                                   wifiLength++; }
                                
                                
                                if (aliasname)  myname="name";
                                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")); 
                                //if (aliasname) realname="name";
                                
                                
                                //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: 'switch',
                                      read: true,
                                      write: true,
                                      type: "boolean",
                                      smartName: {
                                          de: wifis[wifi_name].smart,
                                          smartType: "SWITCH"
                                      } });}
                                
                                
                                
                                createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                                   name: 'Unifi Wifi Clients Table', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                
                                var foo = (aliasname) ? true : false;
                                createState(dpPrefix + "WLANUnifi.AliasName", foo,  {
                                   name: ' AliasName', 
                                   desc:  'schaltet Aliasnamen ein',
                                   role: 'switch',
                                   type: 'boolean',
                                   read:  true, 
                                   write: true,
                                }  , function() {setStateDelayed(dpPrefix + "WLANUnifi.AliasName", foo, 200)});
                                
                                createState(dpPrefix + "WLANUnifi.Aussortiert", {
                                   name: 'Aussortiert', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                
                                if (vouchers) {
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                                   name: 'Unifi Wifi Vouchers_Table', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create", false,  {
                                   name: ' A_New_Voucher_Create', 
                                   role: 'switch',
                                   type: 'boolean',
                                   read:  true, 
                                   write: true,
                                });
                                
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set",{
                                   name: ' A_New_Voucher_Dauer', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set",{
                                   name: ' A_New_Voucher_MultiUse', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set",{
                                   name: ' A_New_Voucher_Anzahl', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "",{
                                   name: ' A_New_Voucher_Notiz', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "",{
                                   name: ' A_New_Voucher_Uplaod', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "",{
                                   name: ' A_New_Voucher_Download', 
                                   role: 'string',
                                   read:  true, 
                                   write: true,
                                });
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", {
                                   name: ' A_New_Voucher_Mb_Begrenzung', 
                                   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 });
                                
                                if (health) {createState(dpPrefix + "WLANUnifi.Health.WLAN.Status", { name: 'Health_Status', desc: 'Health_Status', type: 'string', unit: '',  role: '',read: true, write: true }); 
                                            createState(dpPrefix + "WLANUnifi.Health.WLAN.Users", { name: 'Health_Users', desc: 'Health_Users', type: 'number', unit: '', min: '0', max: '1000', role: '',read: true, write: true }); 
                                            createState(dpPrefix + "WLANUnifi.Health.WLAN.Guests", { name: 'Health_Guests', desc: 'Health_Guests', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                                            createState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes", { name: 'Health_TXBytes', desc: 'Health_TXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true });
                                            createState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes", { name: 'Health_RXBytes', desc: 'Health_RXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true }); 
                                            createState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted", { name: 'Health_Adopted', desc: 'Health_Adopted', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                                            createState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled", { name: 'Health_Disabled', desc: 'Health_Disabled', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                                            createState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected", { name: 'Health_Disconnected', desc: 'Health_Disconnected', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });   }
                                
                                
                                function dlog(message) {
                                  if(debug)
                                      console.log(message);
                                }
                                function mylog(message) {
                                  if(mylogs)
                                      console.log(message);
                                }
                                
                                
                                
                                
                                
                                //-----------------------------------------LOGIN---------------------------------------------------------------
                                async function login() {
                                  return new Promise(async (resolve, reject) => {
                                      cookies=[];
                                      let respl = 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) => { log("login: reject"), reject(e);  loggedIn =false;return respl=[];});
                                      
                                      if(respl != null) {
                                          mylog("login: login war erfolgreich! " + ((respl.headers && respl.headers.hasOwnProperty("set-cookie")) ? "Mit Cookies":"Ohne Cookies"));
                                          if(respl.headers && respl.headers.hasOwnProperty("set-cookie")) {
                                              let set_cookies = respl.headers["set-cookie"];
                                              for(i = 0; i < set_cookies.length; i++) {
                                                  let cookie = set_cookies[i];
                                                  //log(set_cookies[i]);
                                                  cookie = cookie.split(";")[0];
                                                  cookies.push(cookie);
                                              }
                                          } else {
                                              log("login: no cookies to set!")
                                          }
                                          loggedIn = true;
                                                
                                          resolve();
                                      } else {
                                          log("login: rejected")
                                            loggedIn = false;
                                          reject("respl = null");
                                      }
                                  });
                                }
                                
                                 //-----------------------------------------LOGOUT---------------------------------------------------------------  
                                async function logout() {
                                   log("BIN IN LOGOUT");
                                  return new Promise(async (resolve, reject) => {
                                      let respo = await request.get({
                                          url: unifi_controller + "/logout",
                                          headers: { Cookie: cookies.join("; ") }
                                      }).catch((e) => { log("logout fehler" + e)/*reject(e)*/ ;return testerrl=true;} );
                                      if (!testerrl) {
                                      if(respo != null) {
                                          log("Du bist nun ausgedloggt.");
                                          dlog(respo);
                                          log("BIN raus aus LOGOUT");
                                           loggedIn = true;          
                                          resolve();
                                         
                                      } else {
                                          reject("resp = null");
                                      }
                                      } else {log("reject weil resplogin ist 00"); log("BIN raus aus LOGOUT"); reject();}
                                      log("BIN raus aus LOGOUT");
                                  });
                                }
                                //-----------------------------------------STATUS   WIFI  ---------------------------------------------------------
                                //Updatet status vom Wifi
                                //wifi: wifi object aus der konstanten wifis
                                function getStatus(wifi) {
                                     mylog("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/"+siteName+"/rest/wlanconf/" + wifi.id,
                                          headers: { Cookie: cookies.join("; ") }
                                      }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrs=true; });
                                    if (!testerrs) {
                                      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 {
                                          log("nicht ok... getStatusWifi")
                                          reject(JSON.stringify(resp));
                                      }
                                      } else {mylog("reject weil respslogin ist 00"); mylog("BIN raus aus LOGOUT"); reject();}
                                      mylog("BIN aus STATUS raus");
                                  });
                                   
                                }
                                
                                //-----------------------------------------GETCLIENTS---------------------------------------------------------------
                                async function getClients() {
                                    mylog("BIN IN getclients");
                                   
                                   return new Promise(async (resolve, reject) => {
                                       log("getclient nur mal so" + loggedIn);
                                      if(!loggedIn) await login().catch((e) => reject(e));
                                        respc = await request.get({
                                           url: unifi_controller + "/api/s/"+siteName+"/stat/sta",
                                           headers: { Cookie: cookies.join("; ") }
                                       }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrc=true; }); 
                                        
                                  if (!testerrc) {     
                                dlog("got respconse nach log in getclient " + JSON.stringify(respc));
                                dlog(typeof respc);
                                log("--------------------- " + respc);
                                //respc = JSON.parse(respc);
                                
                                //Sortierung Daten und Verwandlung Json
                                
                                var unfiltered = [];
                                unfiltered = JSON.parse(respc).data;
                                dlog("bin da");
                                dlog(unfiltered[5][myname] + unfiltered[2].mac);
                                versuch = [];
                                 let trash="";
                                for(var index in unfiltered) {
                                   let device = unfiltered[index];
                                  
                                   if(device[myname] !== undefined && device.essid !== undefined) {versuch.push(device); } /*else {if (aliasname) {trash = trash+unfiltered[index].hostname+","}
                                                                                                                                 else {trash = trash+device[name]+","}}*/
                                   //if(device[myname] !== undefined) {trash = trash+unfiltered[index].hostname+","}
                                }
                                setState(dpPrefix + "WLANUnifi.Aussortiert", trash);
                                versuch.sort(function (alpha, beta) {
                                   if (alpha[myname].toLowerCase() < beta[myname].toLowerCase())
                                       return -1;
                                   if (alpha[myname].toLowerCase() > beta[myname].toLowerCase())
                                       return 1;
                                   return 0;
                                });
                                
                                resolve();
                                  } else {log("reject weil respc 00"); reject() } mylog("bin raus aus  getclients");
                                }); //new promise
                                
                                } //getclientend
                                //-----------------------------------------workCLIENTS---------------------------------------------------------------
                                function workClients() {
                                    mylog("BIN IN workclients");
                                    dlog("got respconse " + JSON.stringify(respc));
                                    dlog(typeof respc);
                                    dlog("--------------------- " + respc);
                                
                                  
                                
                                let writeFile = true;
                                let  writeFileVar = 0;
                                let writeClientTable = true;
                                let writeAnwesenheit = true;
                                
                                var anzahlClients = versuch.length;
                                setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);
                                
                                var clientListe = "";
                                getExistingClients();
                                
                                
                                mylog("Status1");
                                
                                var listeDatenpunkteNew=[];                                                        //erstelle aktuelles array von controller daten
                                for (var i = 0; i < versuch.length; i++) { 
                                   listeDatenpunkteNew[i] = versuch[i][myname];
                                   }
                                  dlog (listeDatenpunkteNew[3]);
                                
                                
                                let notSeen=[];
                                // sind clients von controller in verzeichnisliste ? 
                                 for (var z = 0; z < listeDatenpunkteNew.length; z++) 
                                  {
                                           if ( listeDatenpunkte.indexOf(listeDatenpunkteNew[z]) == -1 ){   //ist controller-client existent nicht in verzeichnis-list
                                                  mylog("Datenpunktanlegen" + listeDatenpunkteNew[z] +"index:"+ listeDatenpunkte.indexOf(listeDatenpunkteNew[z]).toString());
                                                  var ipWandler= versuch[z].ip;
                                                  var data = dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkteNew[z];
                                
                                                  createState(data, true, {name: ipWandler,  role: 'boolean',read:  true,  write: true, }, function() {mylog("created"); });
                                                  //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z][myname], true);
                                                  mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ; 
                                            } 
                                  }
                                mylog("Status2");
                                
                                //sind datenpunkte noch in controller vorhanden
                                 if (anwesenheit) {
                                 for (var z = 0; z < listeDatenpunkte.length; z++)  {
                                           if ( listeDatenpunkteNew.indexOf(listeDatenpunkte[z]) == -1 ){        //ist datenpunkt-verzeihnis existent und nicht in controller liste
                                                notSeen.push(listeDatenpunkte[z]);//log(listeDatenpunkte[z]);            //array der notSeen datenpunkte sind nicht im controller
                                               if (getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z]).val) {          // setze datenpunkt auf false - nur wenn true war
                                                     setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z], false, 500);
                                                  
                                                     mylog("Datenpunkt ist falsch zu setzen"+listeDatenpunkte[z]);}
                                              } else {dlog("ist noch im controller" + listeDatenpunkte[z]);    }
                                
                                              
                                 } }  
                                
                                 //sind datenpunkte nicht in controller vorhanden
                                
                                
                                mylog("Status3"); 
                                
                                // setze datenpunkte nach last_seen_by_uap - ausnahme: controller-clients sind nicht mehr connectet aber in vereichnis 
                                
                                let lastChangeList;
                                if (anwesenheit) {
                                timeout = setTimeout(function () {  //wegen createstate und zu schnelles setstate
                                
                                
                                
                                for (var z = 0; z < listeDatenpunkteNew.length; z++)  {
                                
                                   var tester = parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000);
                                   dlog(tester.toString() + "laenge : " +listeDatenpunkteNew.length);
                                   if (parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) > abfragezyklus+abfageoffset && getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val) {
                                 //    if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, false, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100)}
                                       setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100);
                                       mylog("abgesetzt: " +listeDatenpunkteNew[z] + " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                                       if (lastChange.length>=10) lastChange.shift()
                                       lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>out</td><td>&ensp;&ensp;vor: "+tester/1000+" Sek</td></tr>");
                                          mylog(lastChange[0]);
                                    
                                   }
                                   if (parseFloat((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) < abfragezyklus && !getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val ==null ) {
                                 // if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, true, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100)}
                                       setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100);
                                       mylog("gesetzt" +listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                                       if (lastChange.length>=10) lastChange.shift()
                                       lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>in</td><td>&ensp;&ensp;vor: " + tester/1000+" Sek</td></tr>");
                                   }  
                                }
                                
                                
                                
                                mylog("Status4");
                                // erstelle htmlclientliste  
                                    
                                     for (var i = 0; i < versuch.length; i++)  {
                                       dlog(versuch[i][myname] + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                                       if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {  
                                           for(let device_name in apName) {                            //Abfrage welcher AP
                                               dlog(versuch[i].ap_mac +" - " + device_name +" - " + apName[device_name].aname); 
                                               if (versuch[i].ap_mac==device_name) var apTransfer = apName[device_name].aname};                    
                                       clientListe = clientListe.concat("<tr><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>"+apTransfer+"</td></tr>");
                                       dlog(clientListe);} 
                                       else {anzahlClients=anzahlClients-1; clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>noConn</td></tr>");}
                                       }
                                     setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
                                
                                      for (var h =0; h<notSeen.length;h++){    
                                             if (notSeen.indexOf(versuch[i]) == -1 ) 
                                             clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+notSeen[h]+
                                             "&ensp;</td><td>noConn&ensp;&ensp;&ensp;&ensp;</td><td>noConn&ensp;&ensp;</td><td>noConn</td></tr>");
                                      }
                                mylog("Status5");
                                
                                if (iqontrol && anwesenheit ) {
                                   
                                   lastChangeList=format3;
                                   for (var g = lastChange.length-1; g >= 0 ; g--)  {
                                       lastChangeList=lastChangeList.concat(lastChange[g]/*+"</table>"*/); 
                                       lastChangeList.concat(lastChange[g]+"</table>");
                                      }
                                
                                   fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:#01A9DB; font-family:Helvetica;\">Geamtanzahl angemeldeter Clients:"+anzahlClients+"<br>Insgesamt Clients registriert: "+ listeDatenpunkte.length+
                                                                                      "</p><p style=\"color:#848484; font-family:Helvetica;\">Letzter Wechsel im Netzwerk:<br>"+lastChangeList+"</p>"
                                   ));
                                   //if (lastChange.length>10) lastChange=[];
                                }
                                dlog("ClientFile schreibt! "+iqontrol.toString()+writeClientTable.toString());
                                if (true) setState(dpPrefix + "WLANUnifi.Wifi_Clients", "<table>"+clientListe.concat("</table>")); //schreibe client table
                                mylog("bin raus aus  workclients");
                                
                                }, 2500);}
                                
                                
                                } //workclientend
                                
                                //-----------------------------------------EXISTING CLIENTS---------------------------------------------------------------
                                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.", "");}
                                });
                                
                                dlog("bin raus a existing clients");
                                }
                                
                                
                                //-----------------------------------------GET--VOUCHERS---------------------------------------------------------------
                                async function getVouchers() {
                                    if (vouchers)  {
                                     mylog("BIN IN getvouchers");
                                   return new Promise(async (resolve, reject) => {
                                       dlog("nur mal so");
                                       if(!loggedIn) await login().catch((e) => reject(e));
                                        respv = await request.get({
                                           url: unifi_controller + "/api/s/"+siteName+"/stat/voucher",
                                           headers: { Cookie: cookies.join("; ") }
                                       }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrv=true; });  
                                  if (!testerrv) {
                                dlog("got response " + JSON.stringify(respv));
                                dlog(typeof respv);
                                dlog("--------------------- " + respv);
                                resolve("done");
                                  } else {log("reject weil respv ist 00"); reject();}
                                mylog("bin raus a GET vouchers");
                                });
                                }}
                                
                                //-----------------------------------------WORK--VOUCHERS---------------------------------------------------------------
                                function workVouchers() {
                                   if (vouchers)  {
                                 //  mylog("BIN IN  workvouchers");
                                   dlog("got response " + JSON.stringify(respv));
                                   dlog(typeof respv);
                                   dlog("--------------------- " + respv);
                                respv = JSON.parse(respv);
                                
                                
                                   dlog("--------------------- " + respv);
                                dlog(respv.meta);
                                dlog(respv.meta.rc);
                                dlog(respv.data[1].code);
                                dlog(respv.data.length);
                                dlog(JSON.stringify(respv).length.toString());
                                var writeFile;
                                var laengeMessage=JSON.stringify(respv).length;
                                if (laengeMessage==writeFileVar) {writeFile = false;} else {writeFile=true}
                                var writeFileVar=JSON.stringify(respv).length;
                                
                                if (writeFile) {
                                var clientListe = "<tr><td>DAUER&ensp;</td><td>FERTIG&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td>&ensp;&ensp;<td>NOTIZ</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 < respv.data.length; i++) { 
                                  var zeit= respv.data[i].create_time*1000
                                  let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
                                  let notizen;
                                 
                                  if (respv.data[i].note !== null) { notizen=respv.data[i].note} else {notizen= "&ensp;&ensp; - &ensp;&ensp;&ensp; ";}
                                   
                                  clientListe = clientListe.concat("<tr><td>"+respv.data[i].duration+"&ensp;</td><td>"+respv.data[i].status_expires+"&ensp;&ensp;&ensp;&ensp;</td><td>"+respv.data[i].code+"&ensp;&ensp;</td><td>" +zeit1 + "&ensp;&ensp;</td><td>"+notizen+"</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, respv.data[i].code );
                                      setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", zeit1 );
                                      setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", respv.data[i].duration );
                                      setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", respv.data[i].status_expires );
                                      
                                  }}
                                }
                                
                                //Datenpunkteäalt löschen
                                var w = respv.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:"+respv.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", respv.data.length);
                                //mylog("BIN RAUS AUS  workvouchers");
                                
                                }
                                //-----------------------------------------GET--Health---------------------------------------------------------------
                                async function getHealth() {
                                    if (vouchers)  {
                                     mylog("BIN IN gethealth");
                                   return new Promise(async (resolve, reject) => {
                                       dlog("nur mal so");
                                       if(!loggedIn) await login().catch((e) => reject(e));
                                        resph = await request.get({
                                           url: unifi_controller + "/api/s/"+siteName+"/stat/health",
                                           headers: { Cookie: cookies.join("; ") }
                                       }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrh=true; });  
                                  if (!testerrh) {
                                dlog("got response " + JSON.stringify(resph));
                                dlog(typeof resph);
                                mylog("--------------------- " + resph);
                                resolve("done");
                                  } else {log("reject weil resph ist 00"); reject();}
                                mylog("bin raus a GET health");
                                });
                                }}
                                //-----------------------------------------WORK--HEALTH---------------------------------------------------------------
                                function workHealth() {
                                   
                                   mylog("BIN IN  workhealth");
                                   dlog("got response " + JSON.stringify(resph));
                                   dlog(typeof resph);
                                   dlog("--------------------- " + resph);
                                   resph=resph.replace(/-r/g, "_r")
                                   resph = JSON.parse(resph);
                                   setState(dpPrefix + "WLANUnifi.Health.WLAN.Status",resph.data[0].status );
                                   setState(dpPrefix + "WLANUnifi.Health.WLAN.Users",resph.data[0].num_user);
                                   setState(dpPrefix + "WLANUnifi.Health.WLAN.Guests",resph.data[0].num_guest );
                                   setState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes",resph.data[0].tx_bytes_r );
                                   setState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes",resph.data[0].rx_bytes_r );
                                   setState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted",resph.data[0].num_adopted );
                                   setState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled",resph.data[0].num_disabled );
                                   setState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected",resph.data[0].num_disconnected );
                                
                                   mylog("bin raus a work health");
                                }
                                //-----------------------------------------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) {
                                  if (!clientPause) {
                                  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/"+siteName+"/upd/wlanconf/" + wifi.id,
                                          body: JSON.stringify({ enabled }),
                                          headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                                      }).catch((e) => { dlog("setWifi: rejected: " + e); /*reject(e)*/ return testerrws=true; });
                                      dlog("setWifi: got response")
                                
                                      if (resp != null) {
                                          dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                                          dlog(resp);
                                                  // getclient()  Pause für umschalten
                                
                                     
                                         if (firstTime>=wifiLength) {       
                                           //   if (true) {       
                                          clientPause = true;
                                          clientPauseVal=parseInt((new Date().getTime())); 
                                          }
                                       
                                          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);}
                                      
                                  });
                                } else { log("WLAN wird gerade umgeschaltet"); }
                                }
                                
                                //-----------------------------------------CREATE VOUCHERS----------------------------------------------
                                //Wifi an-/ausschalten
                                //enabled: true = anschalten; false = ausschalten
                                //wifi: wifi object aus der konstanten wifis
                                async function createVoucher (mybody) {
                                
                                  mylog(JSON.stringify( mybody ));
                                  return new Promise(async (resolve, reject) => {
                                      log("createVoucher in aktion");
                                      if (!loggedIn) { mylog("need to login"); await login().catch((e) => reject(e)); }
                                      mylog("do it !");
                                      let respcv = request.post({
                                          url: unifi_controller + "/api/s/"+siteName+"/cmd/hotspot/" ,
                                          body: JSON.stringify( mybody ),
                                          // body: mybody,
                                          headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                                      }).catch((e) => { log("setWifi: rejected: " + e);  /*reject(e)*/ return testerrcv=true; });
                                      log("setWifi: got response")
                                      log("------------: "+respcv);
                                
                                  });
                                }
                                
                                //-----------------------------------------------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])
                                 if (firstTime<wifiLength+1) firstTime++;
                                 
                                 
                                          
                                });
                                //-----------------------------------------------Aliasnamen schalten------------------------------------------------
                                on({id:  dpPrefix + "WLANUnifi.AliasName",  change: "any"}, function (obj) { 
                                   
                                    (getState(dpPrefix + "WLANUnifi.AliasName").val) ? myname='name' : myname='hostname'
                                
                                });
                                //-----------------------------------------------SCHALTER Create Voucher------------------------------------------------
                                on({id:  dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",  val: true}, function (obj) { 
                                  var mybodyVouchers;
                                  var expire_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer").val;
                                  var n_var      = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl").val ;
                                  var quota_var  = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse").val ;
                                  var note_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz").val;
                                  var up_var     = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload").val ;
                                  var down_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download").val;
                                  var MBytes_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung").val ;
                                
                                    if (expire_var !="must be set" && n_var!="must be set" && quota_var!="must be set" &&  !clientPause)  {
                                
                                  
                                    //   Orginal JSON Daten
                                    /*   mybodyVouchers = {cmd:'create-voucher',expire:expire_var,   
                                                                       n:n_var, 
                                                                       quota:quota_var,
                                                                       note:note_var,
                                                                       up:up_var, 
                                                                       down:down_var,  
                                                                       MBytes:MBytes_var };*/
                                
                                     var x = "{cmd:'create-voucher',expire:"+expire_var+", n:"+n_var+", quota:"+quota_var+","
                                
                                       if (note_var != "")   x= x.concat('note:\"'+note_var+'\",')
                                       if (up_var != "")     x= x.concat("up:"+up_var+",")
                                       if (down_var != "")   x= x.concat("down:"+down_var+",")                                                        
                                       if (MBytes_var != "") x= x.concat("MBytes:"+MBytes_var+",")  
                                
                                     x=x.substr(0, x.length-1);
                                     x=x.concat("}");
                                     //log (x);
                                     eval('var mybodyVouchers='+x);
                                     log(mybodyVouchers);
                                                                                  
                                     createVoucher(mybodyVouchers);
                                
                                   } else {log("FEHLER IN createVoucher - sind die 'must be set' Werte gesetzt?","error")}
                                
                                  setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",false, 4000);
                                  setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set" , 2000);
                                  setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set", 2000);
                                  setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set", 2000);
                                  setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "", 2000);
                                  setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "", 2000);
                                  setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "", 2000);
                                  setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", 2000);
                                });
                                
                                
                                //-----------------------------------------------MAIN LOOP------------------------------------------------
                                setInterval(async () => {
                                
                                      // for (let suche in wifis) {
                                      // if ( getState(dpPrefix + "WLANUnifi."+suche).val == null ) {log("datanpunkt ist null")} else {log("datanpunkt ist geschrieben - nicht null")};}
                                
                                
                                    scriptCounter++
                                    mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                                    mylog(loggedIn.toString())
                                        
                                    await login().catch(alarm1)  
                                
                                  // log("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs + " - "+testerrh);
                                
                                if (loggedIn) {
                                    if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                                    if (alarmCounter > 0) {alarmCounter=0; }
                                    
                                    await getClients().catch(alarm3)  ;
                                    if (vouchers) await getVouchers().catch(alarm4);
                                    if (health)   await getHealth().catch(alarm7);
                                    if ( !testerrl && !testerrc && !testerrv && !testerrs && !testerrh ) {
                                           workVouchers();
                                          if (!clientPause) workClients();
                                           if (health && scriptCounter==5) {scriptCounter=0;workHealth();}
                                           }
                                  
                                           
                                   for(let wifi_name in wifis) {
                                       if ( firstTime == 3 && getState(dpPrefix + "WLANUnifi."+wifi_name).val !== null ) firstTime = 3;
                                       await getStatus(wifis[wifi_name]).catch(alarm6)}   
                                
                                }   else { alarmCounter++; 
                                          if (alarmCounter > 5) {log("Unifi Sript hat 'Problem mit Einloggen - Prüfe Unifi Controller, Port, Einlog-Daten","error");
                                                                 if  (!testerrv) log("evtl. Vouchers deaktivieren","warn");}}
                                
                                                               
                                  if (clientPause) {
                                        var interim=parseInt(new Date().getTime());
                                        log("Unifi Script ist in Pause wegen WLAN Umschalteung- bis: " + formatDate(clientPauseVal + clientPauseConst, "SS:mm:ss"),"warn");
                                        if (interim - clientPauseVal > clientPauseConst) {clientPause=false;log("Unifi Script hat Pause beendet"  );}  }
                                
                                          
                                 testerrc=false;
                                     testerrv=false;
                                      testerrs=false;
                                       testerrl=false;
                                        testerrc=false;
                                         testerrh=false;
                                
                                
                                
                                   }, abfragezyklus); // wird oben definiert
                                
                                function alarm12() {log("Im Unifi Script stimmte etwas nicht - Alarm12 - Create Voucher","warn");     loggedIn=false; testerrcv=false;cookies=[];}   
                                function alarm11() {log("Im Unifi Script stimmte etwas nicht - Alarm11 - WLAN schalten","warn");      loggedIn=false; testerrws=false;cookies=[];} 
                                
                                function alarm7() {log("Im Unifi Script stimmte etwas nicht - Alarm7 - Health","warn");               loggedIn=false; testerrh=false;cookies=[];}   
                                function alarm6() {log("Im Unifi Script stimmte etwas nicht - Alarm6 - Statusabfrage","warn");        loggedIn=false; testerrs=false;cookies=[];}    
                                function alarm5() {log("Im Unifi Script stimmte etwas nicht - Alarm5 - logout","warn");               loggedIn=false; testerrl=false;cookies=[];}    
                                function alarm4() {log("Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login","warn");    loggedIn=false; testerrv=false;cookies=[];}
                                function alarm3() {log("Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login","warn");      loggedIn=false; testerrc=false;cookies=[];}
                                function alarm1() {log("Im Unifi Script stimmte etwas nicht - Alarm1 - Login fehlgeschlagen","warn"); loggedIn=false; ;alarmSwitch=true }
                                
                                
                                
                                // Beispiel für
                                //setWifi(true, wifis.WLAN_DragonGuest);
                                

                                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 Antwort Letzte Antwort
                                0
                                • ChaotC Offline
                                  ChaotC Offline
                                  Chaot
                                  schrieb am zuletzt editiert von
                                  #345

                                  BINGO!

                                  Sitename ist der Fehler!

                                  Nennt sich zwar "Haus" auf der Benutzeroberfläche, der link lautet aber "ka118xps"
                                  Ich habe das bei "let SiteName" eingestellt und der Login scheint zu laufen bzw. die Daten kommen.
                                  Jetzt habe ich zwar eine neue Fehlermeldung:

                                  javascript.0	2019-09-12 22:07:13.943	error	at listOnTimeout (timers.js:263:5)
                                  javascript.0	2019-09-12 22:07:13.943	error	at tryOnTimeout (timers.js:300:5)
                                  javascript.0	2019-09-12 22:07:13.942	error	at ontimeout (timers.js:438:13)
                                  javascript.0	2019-09-12 22:07:13.942	error	at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1888:34)
                                  javascript.0	2019-09-12 22:07:13.942	error	at Object.<anonymous> (script.js.Unifi.UnifiNeu:504:35)
                                  javascript.0	2019-09-12 22:07:13.941	error	Error in callback: ReferenceError: apName is not defined
                                  

                                  aber das wird sich dann auch noch lösen :clap:

                                  ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                                  liv-in-skyL 1 Antwort Letzte Antwort
                                  0
                                  • ChaotC Chaot

                                    BINGO!

                                    Sitename ist der Fehler!

                                    Nennt sich zwar "Haus" auf der Benutzeroberfläche, der link lautet aber "ka118xps"
                                    Ich habe das bei "let SiteName" eingestellt und der Login scheint zu laufen bzw. die Daten kommen.
                                    Jetzt habe ich zwar eine neue Fehlermeldung:

                                    javascript.0	2019-09-12 22:07:13.943	error	at listOnTimeout (timers.js:263:5)
                                    javascript.0	2019-09-12 22:07:13.943	error	at tryOnTimeout (timers.js:300:5)
                                    javascript.0	2019-09-12 22:07:13.942	error	at ontimeout (timers.js:438:13)
                                    javascript.0	2019-09-12 22:07:13.942	error	at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1888:34)
                                    javascript.0	2019-09-12 22:07:13.942	error	at Object.<anonymous> (script.js.Unifi.UnifiNeu:504:35)
                                    javascript.0	2019-09-12 22:07:13.941	error	Error in callback: ReferenceError: apName is not defined
                                    

                                    aber das wird sich dann auch noch lösen :clap:

                                    liv-in-skyL Offline
                                    liv-in-skyL Offline
                                    liv-in-sky
                                    schrieb am zuletzt editiert von liv-in-sky
                                    #346

                                    @Chaot schaut doch viel besse raus - du mußt noch die aps definieren

                                    hier mal das ganze script constante "apName" fehlt im moment bei dir 3ter block von oben
                                    ich habe 2 ap's - du musst deine eintragen

                                    // September 2019 @liv-in-sky durch viel vorarbeit von @thewhobox (api verbindung)
                                    
                                    // Definition Login
                                    const unifi_username = "username";
                                    const unifi_password = "passowort!";
                                    const unifi_controller = "https://192.168.xxx.xxx:8443";
                                    
                                    
                                    // DEFINITION der zu anzeigenden Netzwerke am besten bis auf id und smart alle gleich setzen
                                    const wifis = {
                                      "WLAN_Dragon1": { name: "WLAN_Dragon1", id: "5cadcaxxxxxxxxxdd7e5381", desc: "WLAN_Dragon1", smart: "WLAN_DragonRoot1" } ,
                                     
                                      "WLAN_DragonGuest": { name: "WLAN_DragonGuest", id: "5d6512a8xxxxxxxedd761", desc: "WLAN_DragonGuest", smart: "WLAN_DragonGuest" }
                                    }
                                    
                                    const apName = {  "b4:yy:yy:yy:96:63" : { aname: "AP-LongR"},
                                                     "18:yy:29:yy:40:yy" : { aname: "AP-Light"}
                                    }
                                    
                                    let siteName ="default";   //Site name 
                                    
                                    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";
                                    
                                    
                                    
                                    
                                    // Datenpunkte Hauptpfad wählen - WICHTIG muss mit der javascript instanz, ind er das script läuft zusammenpassen
                                    const dpPrefix = "javascript.2.";
                                    
                                    //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen der clients wieder normal
                                    const clientPauseConst = 200000;    //1000 bedeutet 1 Sekunde -  das braucht Zeit !!!
                                    
                                    // Abfragezyklus definieren
                                    const abfragezyklus =20000; // es ist nicht zu empfehlen unter 20000 (20 sekunden) zu gehen
                                    const abfageoffset = 15000; // zu schnelle Abmeldungen können hier eingestellt weren - > erhöhen (15000 = 15 sek.)
                                    
                                    //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;
                                    let health = true;  // Angaben zum Systemstatus - die Healtdaten werden nur alle 5 Abfragezyklen geholt
                                    let aliasname=false; //benutzt alias namen, die im controller hinterlegt sind - anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige des Clients!!!
                                                        // es funktioniren auch die Anwesenheitserkennung nicht !!!!, wenn kein Alias im 
                                    
                                    // 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);\">";
                                    const format3 = "<table style=\"color:#848484; font-family:Helvetica;\">";
                                    
                                    //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
                                    let cookies = [];
                                    let loggedIn = false;
                                    let debug = false;
                                    let mylogs = false;
                                    let clientPause = false;
                                    let clientPauseVal;
                                    let wifiDPs = [];
                                    let myname = 'hostname';
                                    let respv;
                                    let respc;
                                    let respw;
                                    let resph;
                                    let respgv;
                                    let statusarr=[];
                                    let versuch;
                                    let listeDatenpunkte = [];
                                    let lastChange=[];
                                    let testerrc=false;
                                    let testerrl=false;
                                    let testerrv=false;
                                    let testerrs=false;
                                    let testerrh=false;
                                    let testerrcv=false;
                                    let testerrws=false;
                                    var scriptCounter=0;
                                    let alarmSwitch =false;
                                    let alarmCounter =0;
                                    let firstTime=0;
                                    let mybodyVouchers;
                                    var wifiLength=0;
                                         for(let wifi_name in wifis) {      
                                       wifiLength++; }
                                    
                                    
                                    if (aliasname)  myname="name";
                                    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")); 
                                    //if (aliasname) realname="name";
                                    
                                    
                                    //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: 'switch',
                                          read: true,
                                          write: true,
                                          type: "boolean",
                                          smartName: {
                                              de: wifis[wifi_name].smart,
                                              smartType: "SWITCH"
                                          } });}
                                    
                                    
                                    
                                    createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                                       name: 'Unifi Wifi Clients Table', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    
                                    var foo = (aliasname) ? true : false;
                                    createState(dpPrefix + "WLANUnifi.AliasName", foo,  {
                                       name: ' AliasName', 
                                       desc:  'schaltet Aliasnamen ein',
                                       role: 'switch',
                                       type: 'boolean',
                                       read:  true, 
                                       write: true,
                                    }  , function() {setStateDelayed(dpPrefix + "WLANUnifi.AliasName", foo, 200)});
                                    
                                    createState(dpPrefix + "WLANUnifi.Aussortiert", {
                                       name: 'Aussortiert', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    
                                    if (vouchers) {
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                                       name: 'Unifi Wifi Vouchers_Table', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create", false,  {
                                       name: ' A_New_Voucher_Create', 
                                       role: 'switch',
                                       type: 'boolean',
                                       read:  true, 
                                       write: true,
                                    });
                                    
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set",{
                                       name: ' A_New_Voucher_Dauer', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set",{
                                       name: ' A_New_Voucher_MultiUse', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set",{
                                       name: ' A_New_Voucher_Anzahl', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "",{
                                       name: ' A_New_Voucher_Notiz', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "",{
                                       name: ' A_New_Voucher_Uplaod', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "",{
                                       name: ' A_New_Voucher_Download', 
                                       role: 'string',
                                       read:  true, 
                                       write: true,
                                    });
                                    createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", {
                                       name: ' A_New_Voucher_Mb_Begrenzung', 
                                       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 });
                                    
                                    if (health) {createState(dpPrefix + "WLANUnifi.Health.WLAN.Status", { name: 'Health_Status', desc: 'Health_Status', type: 'string', unit: '',  role: '',read: true, write: true }); 
                                                createState(dpPrefix + "WLANUnifi.Health.WLAN.Users", { name: 'Health_Users', desc: 'Health_Users', type: 'number', unit: '', min: '0', max: '1000', role: '',read: true, write: true }); 
                                                createState(dpPrefix + "WLANUnifi.Health.WLAN.Guests", { name: 'Health_Guests', desc: 'Health_Guests', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                                                createState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes", { name: 'Health_TXBytes', desc: 'Health_TXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true });
                                                createState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes", { name: 'Health_RXBytes', desc: 'Health_RXBytes', type: 'number', unit: '', min: '0', max: '9999999', role: '',read: true, write: true }); 
                                                createState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted", { name: 'Health_Adopted', desc: 'Health_Adopted', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                                                createState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled", { name: 'Health_Disabled', desc: 'Health_Disabled', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                                                createState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected", { name: 'Health_Disconnected', desc: 'Health_Disconnected', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });   }
                                    
                                    
                                    function dlog(message) {
                                      if(debug)
                                          console.log(message);
                                    }
                                    function mylog(message) {
                                      if(mylogs)
                                          console.log(message);
                                    }
                                    
                                    
                                    
                                    
                                    
                                    //-----------------------------------------LOGIN---------------------------------------------------------------
                                    async function login() {
                                      return new Promise(async (resolve, reject) => {
                                          cookies=[];
                                          let respl = 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) => { log("login: reject"), reject(e);  loggedIn =false;return respl=[];});
                                          
                                          if(respl != null) {
                                              mylog("login: login war erfolgreich! " + ((respl.headers && respl.headers.hasOwnProperty("set-cookie")) ? "Mit Cookies":"Ohne Cookies"));
                                              if(respl.headers && respl.headers.hasOwnProperty("set-cookie")) {
                                                  let set_cookies = respl.headers["set-cookie"];
                                                  for(i = 0; i < set_cookies.length; i++) {
                                                      let cookie = set_cookies[i];
                                                      //log(set_cookies[i]);
                                                      cookie = cookie.split(";")[0];
                                                      cookies.push(cookie);
                                                  }
                                              } else {
                                                  log("login: no cookies to set!")
                                              }
                                              loggedIn = true;
                                                    
                                              resolve();
                                          } else {
                                              log("login: rejected")
                                                loggedIn = false;
                                              reject("respl = null");
                                          }
                                      });
                                    }
                                    
                                     //-----------------------------------------LOGOUT---------------------------------------------------------------  
                                    async function logout() {
                                       log("BIN IN LOGOUT");
                                      return new Promise(async (resolve, reject) => {
                                          let respo = await request.get({
                                              url: unifi_controller + "/logout",
                                              headers: { Cookie: cookies.join("; ") }
                                          }).catch((e) => { log("logout fehler" + e)/*reject(e)*/ ;return testerrl=true;} );
                                          if (!testerrl) {
                                          if(respo != null) {
                                              log("Du bist nun ausgedloggt.");
                                              dlog(respo);
                                              log("BIN raus aus LOGOUT");
                                               loggedIn = true;          
                                              resolve();
                                             
                                          } else {
                                              reject("resp = null");
                                          }
                                          } else {log("reject weil resplogin ist 00"); log("BIN raus aus LOGOUT"); reject();}
                                          log("BIN raus aus LOGOUT");
                                      });
                                    }
                                    //-----------------------------------------STATUS   WIFI  ---------------------------------------------------------
                                    //Updatet status vom Wifi
                                    //wifi: wifi object aus der konstanten wifis
                                    function getStatus(wifi) {
                                         mylog("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/"+siteName+"/rest/wlanconf/" + wifi.id,
                                              headers: { Cookie: cookies.join("; ") }
                                          }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrs=true; });
                                        if (!testerrs) {
                                          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 {
                                              log("nicht ok... getStatusWifi")
                                              reject(JSON.stringify(resp));
                                          }
                                          } else {mylog("reject weil respslogin ist 00"); mylog("BIN raus aus LOGOUT"); reject();}
                                          mylog("BIN aus STATUS raus");
                                      });
                                       
                                    }
                                    
                                    //-----------------------------------------GETCLIENTS---------------------------------------------------------------
                                    async function getClients() {
                                        mylog("BIN IN getclients");
                                       
                                       return new Promise(async (resolve, reject) => {
                                           dlog("getclient nur mal so" + loggedIn);
                                          if(!loggedIn) await login().catch((e) => reject(e));
                                            respc = await request.get({
                                               url: unifi_controller + "/api/s/"+siteName+"/stat/sta",
                                               headers: { Cookie: cookies.join("; ") }
                                           }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrc=true; }); 
                                            
                                      if (!testerrc) {     
                                    dlog("got respconse nach log in getclient " + JSON.stringify(respc));
                                    dlog(typeof respc);
                                    dlog("--------------------- " + respc);
                                    //respc = JSON.parse(respc);
                                    
                                    //Sortierung Daten und Verwandlung Json
                                    
                                    var unfiltered = [];
                                    unfiltered = JSON.parse(respc).data;
                                    dlog("bin da");
                                    dlog(unfiltered[5][myname] + unfiltered[2].mac);
                                    versuch = [];
                                     let trash="";
                                    for(var index in unfiltered) {
                                       let device = unfiltered[index];
                                      
                                       if(device[myname] !== undefined && device.essid !== undefined) {versuch.push(device); } /*else {if (aliasname) {trash = trash+unfiltered[index].hostname+","}
                                                                                                                                     else {trash = trash+device[name]+","}}*/
                                       //if(device[myname] !== undefined) {trash = trash+unfiltered[index].hostname+","}
                                    }
                                    setState(dpPrefix + "WLANUnifi.Aussortiert", trash);
                                    versuch.sort(function (alpha, beta) {
                                       if (alpha[myname].toLowerCase() < beta[myname].toLowerCase())
                                           return -1;
                                       if (alpha[myname].toLowerCase() > beta[myname].toLowerCase())
                                           return 1;
                                       return 0;
                                    });
                                    
                                    resolve();
                                      } else {log("reject weil respc 00"); reject() } mylog("bin raus aus  getclients");
                                    }); //new promise
                                    
                                    } //getclientend
                                    //-----------------------------------------workCLIENTS---------------------------------------------------------------
                                    function workClients() {
                                        mylog("BIN IN workclients");
                                        dlog("got respconse " + JSON.stringify(respc));
                                        dlog(typeof respc);
                                        dlog("--------------------- " + respc);
                                    
                                      
                                    
                                    let writeFile = true;
                                    let  writeFileVar = 0;
                                    let writeClientTable = true;
                                    let writeAnwesenheit = true;
                                    
                                    var anzahlClients = versuch.length;
                                    setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);
                                    
                                    var clientListe = "";
                                    getExistingClients();
                                    
                                    
                                    mylog("Status1");
                                    
                                    var listeDatenpunkteNew=[];                                                        //erstelle aktuelles array von controller daten
                                    for (var i = 0; i < versuch.length; i++) { 
                                       listeDatenpunkteNew[i] = versuch[i][myname];
                                       }
                                      dlog (listeDatenpunkteNew[3]);
                                    
                                    
                                    let notSeen=[];
                                    // sind clients von controller in verzeichnisliste ? 
                                     for (var z = 0; z < listeDatenpunkteNew.length; z++) 
                                      {
                                               if ( listeDatenpunkte.indexOf(listeDatenpunkteNew[z]) == -1 ){   //ist controller-client existent nicht in verzeichnis-list
                                                      mylog("Datenpunktanlegen" + listeDatenpunkteNew[z] +"index:"+ listeDatenpunkte.indexOf(listeDatenpunkteNew[z]).toString());
                                                      var ipWandler= versuch[z].ip;
                                                      var data = dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkteNew[z];
                                    
                                                      createState(data, true, {name: ipWandler,  role: 'boolean',read:  true,  write: true, }, function() {mylog("created"); });
                                                      //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z][myname], true);
                                                      mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ; 
                                                } 
                                      }
                                    mylog("Status2");
                                    
                                    //sind datenpunkte noch in controller vorhanden
                                     if (anwesenheit) {
                                     for (var z = 0; z < listeDatenpunkte.length; z++)  {
                                               if ( listeDatenpunkteNew.indexOf(listeDatenpunkte[z]) == -1 ){        //ist datenpunkt-verzeihnis existent und nicht in controller liste
                                                    notSeen.push(listeDatenpunkte[z]);//log(listeDatenpunkte[z]);            //array der notSeen datenpunkte sind nicht im controller
                                                   if (getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z]).val) {          // setze datenpunkt auf false - nur wenn true war
                                                         setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+listeDatenpunkte[z], false, 500);
                                                      
                                                         mylog("Datenpunkt ist falsch zu setzen"+listeDatenpunkte[z]);}
                                                  } else {dlog("ist noch im controller" + listeDatenpunkte[z]);    }
                                    
                                                  
                                     } }  
                                    
                                     //sind datenpunkte nicht in controller vorhanden
                                    
                                    
                                    mylog("Status3"); 
                                    
                                    // setze datenpunkte nach last_seen_by_uap - ausnahme: controller-clients sind nicht mehr connectet aber in vereichnis 
                                    
                                    let lastChangeList;
                                    if (anwesenheit) {
                                    timeout = setTimeout(function () {  //wegen createstate und zu schnelles setstate
                                    
                                    
                                    
                                    for (var z = 0; z < listeDatenpunkteNew.length; z++)  {
                                    
                                       var tester = parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000);
                                       dlog(tester.toString() + "laenge : " +listeDatenpunkteNew.length);
                                       if (parseInt((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) > abfragezyklus+abfageoffset && getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val) {
                                     //    if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, false, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100)}
                                           setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], false, 100);
                                           mylog("abgesetzt: " +listeDatenpunkteNew[z] + " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                                           if (lastChange.length>=10) lastChange.shift()
                                           lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>out</td><td>&ensp;&ensp;vor: "+tester/1000+" Sek</td></tr>");
                                              mylog(lastChange[0]);
                                        
                                       }
                                       if (parseFloat((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) < abfragezyklus && !getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname]).val ==null ) {
                                     // if (!aliasname) {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[i].name, true, 100);} else {setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100)}
                                           setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z][myname], true, 100);
                                           mylog("gesetzt" +listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                                           if (lastChange.length>=10) lastChange.shift()
                                           lastChange.push("<tr><td>"+listeDatenpunkteNew[z]+"&ensp;&ensp;</td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"&ensp;&ensp;&ensp;&ensp;</td><td>in</td><td>&ensp;&ensp;vor: " + tester/1000+" Sek</td></tr>");
                                       }  
                                    }
                                    
                                    
                                    
                                    mylog("Status4");
                                    // erstelle htmlclientliste  
                                        
                                         for (var i = 0; i < versuch.length; i++)  {
                                           dlog(versuch[i][myname] + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                                           if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {  
                                               for(let device_name in apName) {                            //Abfrage welcher AP
                                                   dlog(versuch[i].ap_mac +" - " + device_name +" - " + apName[device_name].aname); 
                                                   if (versuch[i].ap_mac==device_name) var apTransfer = apName[device_name].aname};                    
                                           clientListe = clientListe.concat("<tr><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>"+apTransfer+"</td></tr>");
                                           dlog(clientListe);} 
                                           else {anzahlClients=anzahlClients-1; clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+versuch[i][myname]+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"&ensp;&ensp;</td><td>noConn</td></tr>");}
                                           }
                                         setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
                                    
                                          for (var h =0; h<notSeen.length;h++){    
                                                 if (notSeen.indexOf(versuch[i]) == -1 ) 
                                                 clientListe = clientListe.concat("<tr style=\"color:#01A9DB; font-family:Helvetica;font-style: italic;\" ><td>"+notSeen[h]+
                                                 "&ensp;</td><td>noConn&ensp;&ensp;&ensp;&ensp;</td><td>noConn&ensp;&ensp;</td><td>noConn</td></tr>");
                                          }
                                    mylog("Status5");
                                    
                                    if (iqontrol && anwesenheit ) {
                                       
                                       lastChangeList=format3;
                                       for (var g = lastChange.length-1; g >= 0 ; g--)  {
                                           lastChangeList=lastChangeList.concat(lastChange[g]/*+"</table>"*/); 
                                           lastChangeList.concat(lastChange[g]+"</table>");
                                          }
                                    
                                       fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:#01A9DB; font-family:Helvetica;\">Geamtanzahl angemeldeter Clients:"+anzahlClients+"<br>Insgesamt Clients registriert: "+ listeDatenpunkte.length+
                                                                                          "</p><p style=\"color:#848484; font-family:Helvetica;\">Letzter Wechsel im Netzwerk:<br>"+lastChangeList+"</p>"
                                       ));
                                       //if (lastChange.length>10) lastChange=[];
                                    }
                                    dlog("ClientFile schreibt! "+iqontrol.toString()+writeClientTable.toString());
                                    if (true) setState(dpPrefix + "WLANUnifi.Wifi_Clients", "<table>"+clientListe.concat("</table>")); //schreibe client table
                                    mylog("bin raus aus  workclients");
                                    
                                    }, 2500);}
                                    
                                    
                                    } //workclientend
                                    
                                    //-----------------------------------------EXISTING CLIENTS---------------------------------------------------------------
                                    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.", "");}
                                    });
                                    
                                    dlog("bin raus a existing clients");
                                    }
                                    
                                    
                                    //-----------------------------------------GET--VOUCHERS---------------------------------------------------------------
                                    async function getVouchers() {
                                        if (vouchers)  {
                                         mylog("BIN IN getvouchers");
                                       return new Promise(async (resolve, reject) => {
                                           dlog("nur mal so");
                                           if(!loggedIn) await login().catch((e) => reject(e));
                                            respv = await request.get({
                                               url: unifi_controller + "/api/s/"+siteName+"/stat/voucher",
                                               headers: { Cookie: cookies.join("; ") }
                                           }).catch((e) => { dlog("getStatus reject " + e); /*reject(e)*/ return testerrv=true; });  
                                      if (!testerrv) {
                                    dlog("got response " + JSON.stringify(respv));
                                    dlog(typeof respv);
                                    dlog("--------------------- " + respv);
                                    resolve("done");
                                      } else {log("reject weil respv ist 00"); reject();}
                                    mylog("bin raus a GET vouchers");
                                    });
                                    }}
                                    
                                    //-----------------------------------------WORK--VOUCHERS---------------------------------------------------------------
                                    function workVouchers() {
                                       if (vouchers)  {
                                     //  mylog("BIN IN  workvouchers");
                                       dlog("got response " + JSON.stringify(respv));
                                       dlog(typeof respv);
                                       dlog("--------------------- " + respv);
                                    respv = JSON.parse(respv);
                                    
                                    
                                       dlog("--------------------- " + respv);
                                    dlog(respv.meta);
                                    dlog(respv.meta.rc);
                                    dlog(respv.data[1].code);
                                    dlog(respv.data.length);
                                    dlog(JSON.stringify(respv).length.toString());
                                    var writeFile;
                                    var laengeMessage=JSON.stringify(respv).length;
                                    if (laengeMessage==writeFileVar) {writeFile = false;} else {writeFile=true}
                                    var writeFileVar=JSON.stringify(respv).length;
                                    
                                    if (writeFile) {
                                    var clientListe = "<tr><td>DAUER&ensp;</td><td>FERTIG&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td>&ensp;&ensp;<td>NOTIZ</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 < respv.data.length; i++) { 
                                      var zeit= respv.data[i].create_time*1000
                                      let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
                                      let notizen;
                                     
                                      if (respv.data[i].note !== null) { notizen=respv.data[i].note} else {notizen= "&ensp;&ensp; - &ensp;&ensp;&ensp; ";}
                                       
                                      clientListe = clientListe.concat("<tr><td>"+respv.data[i].duration+"&ensp;</td><td>"+respv.data[i].status_expires+"&ensp;&ensp;&ensp;&ensp;</td><td>"+respv.data[i].code+"&ensp;&ensp;</td><td>" +zeit1 + "&ensp;&ensp;</td><td>"+notizen+"</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, respv.data[i].code );
                                          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", zeit1 );
                                          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", respv.data[i].duration );
                                          setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", respv.data[i].status_expires );
                                          
                                      }}
                                    }
                                    
                                    //Datenpunkteäalt löschen
                                    var w = respv.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:"+respv.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", respv.data.length);
                                    //mylog("BIN RAUS AUS  workvouchers");
                                    
                                    }
                                    //-----------------------------------------GET--Health---------------------------------------------------------------
                                    async function getHealth() {
                                        if (vouchers)  {
                                         mylog("BIN IN gethealth");
                                       return new Promise(async (resolve, reject) => {
                                           dlog("nur mal so");
                                           if(!loggedIn) await login().catch((e) => reject(e));
                                            resph = await request.get({
                                               url: unifi_controller + "/api/s/"+siteName+"/stat/health",
                                               headers: { Cookie: cookies.join("; ") }
                                           }).catch((e) => { log("getStatus reject " + e); /*reject(e)*/ return testerrh=true; });  
                                      if (!testerrh) {
                                    dlog("got response " + JSON.stringify(resph));
                                    dlog(typeof resph);
                                    mylog("--------------------- " + resph);
                                    resolve("done");
                                      } else {log("reject weil resph ist 00"); reject();}
                                    mylog("bin raus a GET health");
                                    });
                                    }}
                                    //-----------------------------------------WORK--HEALTH---------------------------------------------------------------
                                    function workHealth() {
                                       
                                       mylog("BIN IN  workhealth");
                                       dlog("got response " + JSON.stringify(resph));
                                       dlog(typeof resph);
                                       dlog("--------------------- " + resph);
                                       resph=resph.replace(/-r/g, "_r")
                                       resph = JSON.parse(resph);
                                       setState(dpPrefix + "WLANUnifi.Health.WLAN.Status",resph.data[0].status );
                                       setState(dpPrefix + "WLANUnifi.Health.WLAN.Users",resph.data[0].num_user);
                                       setState(dpPrefix + "WLANUnifi.Health.WLAN.Guests",resph.data[0].num_guest );
                                       setState(dpPrefix + "WLANUnifi.Health.WLAN.TXBytes",resph.data[0].tx_bytes_r );
                                       setState(dpPrefix + "WLANUnifi.Health.WLAN.RXBytes",resph.data[0].rx_bytes_r );
                                       setState(dpPrefix + "WLANUnifi.Health.WLAN.Adopted",resph.data[0].num_adopted );
                                       setState(dpPrefix + "WLANUnifi.Health.WLAN.Disabled",resph.data[0].num_disabled );
                                       setState(dpPrefix + "WLANUnifi.Health.WLAN.Disconnected",resph.data[0].num_disconnected );
                                    
                                       mylog("bin raus a work health");
                                    }
                                    //-----------------------------------------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) {
                                      if (!clientPause) {
                                      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/"+siteName+"/upd/wlanconf/" + wifi.id,
                                              body: JSON.stringify({ enabled }),
                                              headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                                          }).catch((e) => { dlog("setWifi: rejected: " + e); /*reject(e)*/ return testerrws=true; });
                                          dlog("setWifi: got response")
                                    
                                          if (resp != null) {
                                              dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                                              dlog(resp);
                                                      // getclient()  Pause für umschalten
                                    
                                         
                                             if (firstTime>=wifiLength) {       
                                               //   if (true) {       
                                              clientPause = true;
                                              clientPauseVal=parseInt((new Date().getTime())); 
                                              }
                                           
                                              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);}
                                          
                                      });
                                    } else { log("WLAN wird gerade umgeschaltet"); }
                                    }
                                    
                                    //-----------------------------------------CREATE VOUCHERS----------------------------------------------
                                    //Wifi an-/ausschalten
                                    //enabled: true = anschalten; false = ausschalten
                                    //wifi: wifi object aus der konstanten wifis
                                    async function createVoucher (mybody) {
                                    
                                      mylog(JSON.stringify( mybody ));
                                      return new Promise(async (resolve, reject) => {
                                          log("createVoucher in aktion");
                                          if (!loggedIn) { mylog("need to login"); await login().catch((e) => reject(e)); }
                                          mylog("do it !");
                                          let respcv = request.post({
                                              url: unifi_controller + "/api/s/"+siteName+"/cmd/hotspot/" ,
                                              body: JSON.stringify( mybody ),
                                              // body: mybody,
                                              headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                                          }).catch((e) => { log("setWifi: rejected: " + e);  /*reject(e)*/ return testerrcv=true; });
                                          log("setWifi: got response")
                                          log("------------: "+respcv);
                                    
                                      });
                                    }
                                    
                                    //-----------------------------------------------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])
                                     if (firstTime<wifiLength+1) firstTime++;
                                     
                                     
                                              
                                    });
                                    //-----------------------------------------------Aliasnamen schalten------------------------------------------------
                                    on({id:  dpPrefix + "WLANUnifi.AliasName",  change: "any"}, function (obj) { 
                                       
                                        (getState(dpPrefix + "WLANUnifi.AliasName").val) ? myname='name' : myname='hostname'
                                    
                                    });
                                    //-----------------------------------------------SCHALTER Create Voucher------------------------------------------------
                                    on({id:  dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",  val: true}, function (obj) { 
                                      var mybodyVouchers;
                                      var expire_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer").val;
                                      var n_var      = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl").val ;
                                      var quota_var  = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse").val ;
                                      var note_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz").val;
                                      var up_var     = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload").val ;
                                      var down_var   = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download").val;
                                      var MBytes_var = getState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung").val ;
                                    
                                        if (expire_var !="must be set" && n_var!="must be set" && quota_var!="must be set" &&  !clientPause)  {
                                    
                                      
                                        //   Orginal JSON Daten
                                        /*   mybodyVouchers = {cmd:'create-voucher',expire:expire_var,   
                                                                           n:n_var, 
                                                                           quota:quota_var,
                                                                           note:note_var,
                                                                           up:up_var, 
                                                                           down:down_var,  
                                                                           MBytes:MBytes_var };*/
                                    
                                         var x = "{cmd:'create-voucher',expire:"+expire_var+", n:"+n_var+", quota:"+quota_var+","
                                    
                                           if (note_var != "")   x= x.concat('note:\"'+note_var+'\",')
                                           if (up_var != "")     x= x.concat("up:"+up_var+",")
                                           if (down_var != "")   x= x.concat("down:"+down_var+",")                                                        
                                           if (MBytes_var != "") x= x.concat("MBytes:"+MBytes_var+",")  
                                    
                                         x=x.substr(0, x.length-1);
                                         x=x.concat("}");
                                         //log (x);
                                         eval('var mybodyVouchers='+x);
                                         log(mybodyVouchers);
                                                                                      
                                         createVoucher(mybodyVouchers);
                                    
                                       } else {log("FEHLER IN createVoucher - sind die 'must be set' Werte gesetzt?","error")}
                                    
                                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Create",false, 4000);
                                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Dauer", "must be set" , 2000);
                                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Anzahl", "must be set", 2000);
                                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.MultiUse", "must be set", 2000);
                                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Notiz", "", 2000);
                                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Upload", "", 2000);
                                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Download", "", 2000);
                                      setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.A_New_Voucher.Mb_Begrenzung", "", 2000);
                                    });
                                    
                                    
                                    //-----------------------------------------------MAIN LOOP------------------------------------------------
                                    setInterval(async () => {
                                    
                                          // for (let suche in wifis) {
                                          // if ( getState(dpPrefix + "WLANUnifi."+suche).val == null ) {log("datanpunkt ist null")} else {log("datanpunkt ist geschrieben - nicht null")};}
                                    
                                    
                                        scriptCounter++
                                        mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                                        mylog(loggedIn.toString())
                                            
                                        await login().catch(alarm1)  
                                    
                                      // log("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs + " - "+testerrh);
                                    
                                    if (loggedIn) {
                                        if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                                        if (alarmCounter > 0) {alarmCounter=0; }
                                        
                                        await getClients().catch(alarm3)  ;
                                        if (vouchers) await getVouchers().catch(alarm4);
                                        if (health)   await getHealth().catch(alarm7);
                                        if ( !testerrl && !testerrc && !testerrv && !testerrs && !testerrh ) {
                                               workVouchers();
                                              if (!clientPause) workClients();
                                               if (health && scriptCounter==5) {scriptCounter=0;workHealth();}
                                               }
                                      
                                               
                                       for(let wifi_name in wifis) {
                                           if ( firstTime == 3 && getState(dpPrefix + "WLANUnifi."+wifi_name).val !== null ) firstTime = 3;
                                           await getStatus(wifis[wifi_name]).catch(alarm6)}   
                                    
                                    }   else { alarmCounter++; 
                                              if (alarmCounter > 5) {log("Unifi Sript hat 'Problem mit Einloggen - Prüfe Unifi Controller, Port, Einlog-Daten","error");
                                                                     if  (!testerrv) log("evtl. Vouchers deaktivieren","warn");}}
                                    
                                                                   
                                      if (clientPause) {
                                            var interim=parseInt(new Date().getTime());
                                            log("Unifi Script ist in Pause wegen WLAN Umschalteung- bis: " + formatDate(clientPauseVal + clientPauseConst, "SS:mm:ss"),"warn");
                                            if (interim - clientPauseVal > clientPauseConst) {clientPause=false;log("Unifi Script hat Pause beendet"  );}  }
                                    
                                              
                                     testerrc=false;
                                         testerrv=false;
                                          testerrs=false;
                                           testerrl=false;
                                            testerrc=false;
                                             testerrh=false;
                                    
                                    
                                    
                                       }, abfragezyklus); // wird oben definiert
                                    
                                    function alarm12() {log("Im Unifi Script stimmte etwas nicht - Alarm12 - Create Voucher","warn");     loggedIn=false; testerrcv=false;cookies=[];}   
                                    function alarm11() {log("Im Unifi Script stimmte etwas nicht - Alarm11 - WLAN schalten","warn");      loggedIn=false; testerrws=false;cookies=[];} 
                                    
                                    function alarm7() {log("Im Unifi Script stimmte etwas nicht - Alarm7 - Health","warn");               loggedIn=false; testerrh=false;cookies=[];}   
                                    function alarm6() {log("Im Unifi Script stimmte etwas nicht - Alarm6 - Statusabfrage","warn");        loggedIn=false; testerrs=false;cookies=[];}    
                                    function alarm5() {log("Im Unifi Script stimmte etwas nicht - Alarm5 - logout","warn");               loggedIn=false; testerrl=false;cookies=[];}    
                                    function alarm4() {log("Im Unifi Script stimmte etwas nicht - Alarm4 - getVouchers-Login","warn");    loggedIn=false; testerrv=false;cookies=[];}
                                    function alarm3() {log("Im Unifi Script stimmte etwas nicht - Alarm3 - getClient-Login","warn");      loggedIn=false; testerrc=false;cookies=[];}
                                    function alarm1() {log("Im Unifi Script stimmte etwas nicht - Alarm1 - Login fehlgeschlagen","warn"); loggedIn=false; ;alarmSwitch=true }
                                    
                                    
                                    
                                    // Beispiel für
                                    //setWifi(true, wifis.WLAN_DragonGuest);
                                    
                                    

                                    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 Antwort Letzte Antwort
                                    0
                                    • dslraserD Offline
                                      dslraserD Offline
                                      dslraser
                                      Forum Testing Most Active
                                      schrieb am zuletzt editiert von
                                      #347

                                      @liv-in-sky
                                      bei mir läuft es, inklusive Sitname (ist aber default bei mir)
                                      Name anstatt Hostname funktioniert auch.
                                      Meinen Switch habe ich eingetragen, da kommen aber keine Geräte. Es kommen nur WLAN Geräte von den AP. Die iQontrol Liste klappt auch, inklusive AP Namen, wo welches Gerätes angemeldet ist.
                                      Hier mal die Liste (damit kann ja sonst keiner was anfangen, sind ja nur interne IP)

                                      Bildschirmfoto 2019-09-12 um 22.11.13.png

                                      liv-in-skyL 1 Antwort Letzte Antwort
                                      0
                                      • ChaotC Offline
                                        ChaotC Offline
                                        Chaot
                                        schrieb am zuletzt editiert von
                                        #348

                                        Ja!
                                        Die Zeile habe ich scheinbar versehentlich überschrieben.
                                        Die ersten Daten sind da. Voucher sind auch da. Health fehlt noch, aber ich denke mal das wird auch noch kommen.
                                        Create Voucher werde ich auch morgen versuchen.
                                        Ganz herzlichen Dank für deine Hilfe :clap: :clap: :clap:

                                        ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                                        1 Antwort Letzte Antwort
                                        0
                                        • dslraserD dslraser

                                          @liv-in-sky
                                          bei mir läuft es, inklusive Sitname (ist aber default bei mir)
                                          Name anstatt Hostname funktioniert auch.
                                          Meinen Switch habe ich eingetragen, da kommen aber keine Geräte. Es kommen nur WLAN Geräte von den AP. Die iQontrol Liste klappt auch, inklusive AP Namen, wo welches Gerätes angemeldet ist.
                                          Hier mal die Liste (damit kann ja sonst keiner was anfangen, sind ja nur interne IP)

                                          Bildschirmfoto 2019-09-12 um 22.11.13.png

                                          liv-in-skyL Offline
                                          liv-in-skyL Offline
                                          liv-in-sky
                                          schrieb am zuletzt editiert von
                                          #349

                                          @dslraser

                                          ok - machst du wieder einen dauertest ?

                                          @Chaot - klasse - dann probier mal etwas rum mit handy enloggen und so

                                          du weißt: die daten sichtbar machen entweder mit iqontrol oder in der vis mit einem htmlwidget und mit einem binding
                                          Image 1.png

                                          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 liv-in-skyL 2 Antworten Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          629

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe