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

  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.3k

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

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

Unifi WLAN Script

Geplant Angeheftet Gesperrt Verschoben JavaScript
380 Beiträge 13 Kommentatoren 57.1k 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.
  • dslraserD dslraser

    @liv-in-sky

    okay

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

    @dslraser nee - glaube das funktioniert so nicht

    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 vor dem umschalten - bitte datenpunkte löschen

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

      @liv-in-sky
      also, die Umschaltung funktioniert nicht. Ich habe alle DP gelöscht und dann alias auf true gestellt. Funktioniert nicht. Es werden die gleichen DP wie vorher angelegt, also als hostname.
      Zusätzlich kommt dann das hier, ohne das ich ein WLAN an oder aus gestellt habe.

      6.9.2019, 20:05:33.420	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
      6.9.2019, 20:05:53.419	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
      6.9.2019, 20:06:13.433	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
      6.9.2019, 20:06:33.427	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
      6.9.2019, 20:06:53.440	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
      
      liv-in-skyL 2 Antworten Letzte Antwort
      0
      • dslraserD dslraser

        @liv-in-sky
        also, die Umschaltung funktioniert nicht. Ich habe alle DP gelöscht und dann alias auf true gestellt. Funktioniert nicht. Es werden die gleichen DP wie vorher angelegt, also als hostname.
        Zusätzlich kommt dann das hier, ohne das ich ein WLAN an oder aus gestellt habe.

        6.9.2019, 20:05:33.420	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
        6.9.2019, 20:05:53.419	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
        6.9.2019, 20:06:13.433	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
        6.9.2019, 20:06:33.427	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
        6.9.2019, 20:06:53.440	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
        
        liv-in-skyL Offline
        liv-in-skyL Offline
        liv-in-sky
        schrieb am zuletzt editiert von
        #283

        @dslraser ok - muss ich nochmal checken - wird erst morgen gehen - aber danke fürs testen

        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

          @tempestas hast du evtl beim ändern der variablen ganz oben etwas vergessen oder zuviel gemacht - dadurch kann ein ganzer "rattenschwanz" an fehlern kommen - bitte nochmal prüfen evtl neu kopieren

          T Offline
          T Offline
          tempestas
          schrieb am zuletzt editiert von
          #284

          @liv-in-sky

          Hi - da ich das Forum einfach nicht verstehe in seiner neuen Form, hier nur die Rückmeldung, dass ich das Skript, dass du freundlicherweise als txt gepostet hattest, für mich so kürzen konnte, dass ich das Gäste Wlan ein und ausschalten kann. Mehr will und brauche ich gar nicht.

          Vielen lieben Dank

          <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

          1 Antwort Letzte Antwort
          0
          • dslraserD dslraser

            @liv-in-sky
            also, die Umschaltung funktioniert nicht. Ich habe alle DP gelöscht und dann alias auf true gestellt. Funktioniert nicht. Es werden die gleichen DP wie vorher angelegt, also als hostname.
            Zusätzlich kommt dann das hier, ohne das ich ein WLAN an oder aus gestellt habe.

            6.9.2019, 20:05:33.420	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
            6.9.2019, 20:05:53.419	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
            6.9.2019, 20:06:13.433	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
            6.9.2019, 20:06:33.427	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
            6.9.2019, 20:06:53.440	[warn ]: javascript.0 script.js.Heiko.16Unifi.Unifi-Final5: Unifi Script ist in Pause um auf WLAN zu warten
            
            liv-in-skyL Offline
            liv-in-skyL Offline
            liv-in-sky
            schrieb am zuletzt editiert von
            #285

            @dslraser

            hallo - langes WE - bräuchte bitte nochmal test - bitte datenpunkte wieder löschen und scriptinstanz einstellen

            • alles unter der netzwerkkonstanten bitte ersetzen
            • vorallem ein langzeittest - habe bemerkt, dass sich das script nach einiger zeit verrennt - liegt an dem cookie, welches abläuft nach dieser zeit oder wenn ein controller restart war - konnte die version ohne cookie nicht ans laufen bringen - also nach einer stunde oder so wieder testen ob anwesenheit noch erkannt wird
            • bitte auch testen, ob script wieder kommt, wenn du controller abschaltest !! (log file beachten) - es verhält sich unterschiedlich, wenn du nach der ersten warnung im log wieder einschaltest oder auf 6 warnungen wartest - in beiden fällen sollte sich das script wieder fangen nach dem einschalten des controllers und die anwesenheit wieder funktionieren
            • alias ist noch nicht drin
            • möchtest du etwas mehr sehen im log, kannst du die variable mylog auf true setzen
            • bitte auch vouchers testen - und client anzahl ...
            • wenn du mal das gästenetzwerk abschaltest kommt eine pause im script (log) - habe bemerkt, dass vorallem die sonoffs ewig brauchen, bis sie wieder online sind (weil das hauptnetzwerk doch auch gestartet wird!) - in iqontrol kannst du dir dann ansehen, wer am längsten gebraucht hat (unter den clients) - in der pause (länge kann man einstellen) werden keine clients upgedatet

            ich hoffe der test fällt diemal positiv aus

            // September 2019 @liv-in-sky durch viel vorarbeit von @thewhobox (api verbindung)
            
            // Definition Login
            const unifi_username = "x";
            const unifi_password = "xxxxxx";
            const unifi_controller = "https://192.xxx.xxx.xxx:8443";
            
            
            // DEFINITION der zu anzeigenden Netzwerke am besten bis auf id und smart alle gleich setzen: beispiel:
            const wifis = {
             "WLAN_Dragon1": { name: "WLAN_Dragon1", id: "yyyyyyyyyyyyyyyyyyyyy", desc: "WLAN_Dragon1", smart: "WLAN_Dragon1" } ,
             "WLAN_DragonGuest": { name: "WLAN_DragonGuest", id: "yyyyyyyyyyyyyyyyyyyy", desc: "WLAN_DragonGuest", smart: "WLAN_DragonGuest" }
            }
            
            
            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, inder das script läuft zusammenpassen
            const dpPrefix = "javascript.2.";
            
            //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen 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
            
            //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 aliasname=false; //benutzt alias namen im controller hinterlegt anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige dess Clients
            
            // Hier Definition iqontrol-Style für Popup
            const format = "<!DOCTYPE html><html><head><title>Voucher</title></head><body><table style=\"color:black;text-align:center; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
            const format2 = "<!DOCTYPE html><html><head><title>Clients</title></head><body><table style=\"color:black; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
            
            
            //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
            let cookies = [];
            let loggedIn = false;
            let debug = false;
            let mylogs = false;
            let clientPause = false;
            let clientPauseVal;
            let wifiDPs = [];
            let realname="hostname";
            let respv;
            let respc;
            let respw;
            let statusarr=[];
            let versuch;
            let listeDatenpunkte = [];
            let lastChange=[];
            let testerrc=false;
            let testerrl=false;
            let testerrv=false;
            let testerrs=false;
            let firstTime=0;
            var wifiLength=0;
                 for(let wifi_name in wifis) {      
               wifiLength++; }
            
            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: 'state',
                  read: true,
                  write: true,
                  type: "boolean",
                  smartName: {
                      de: wifis[wifi_name].smart,
                      smartType: "SWITCH"
                  } });}
            
            
            if (true) {
            createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
               name: 'Unifi Wifi Clients Table', 
               role: 'string',
               read:  true, 
               write: true,
            });}
            
            
            
            if (vouchers) {
            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
               name: 'Unifi Wifi Vouchers_Table', 
               role: 'string',
               read:  true, 
               write: true,
            });
            
            for (var i = 1; i < 21; i++) { 
               var x=i.toString();
               if (i<10) x="0"+x;
              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
               name: 'Unifi Voucher_Code'+x, 
               role: 'string',
               read:  true, 
               write: true,
               });
            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
               name: 'Unifi Voucher_Code_code'+x, 
               role: 'string',
               read:  true, 
               write: true,
               });    
            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
               name: 'Unifi Voucher_Code_erstellt'+x, 
               role: 'string',
               read:  true, 
               write: true,
               });
            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
               name: 'Unifi Voucher_Code_duration'+x, 
               role: 'string',
               read:  true, 
               write: true,
               });
            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
               name: 'Unifi Voucher_Code_expires'+x, 
               role: 'string',
               read:  true, 
               write: true,
               });
            }}
            
            createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
            if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
            
            function dlog(message) {
              if(debug)
                  console.log(message);
            }
            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(unfiltered[2].hostname + unfiltered[2].mac);
            versuch = [];
            for(var index in unfiltered) {
               let device = unfiltered[index];
               if(device.hostname !== undefined && device.essid !== undefined)
                   versuch.push(device);
            }
            versuch.sort(function (alpha, beta) {
               if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                   return -1;
               if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                   return 1;
               return 0;
            });
            
            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].hostname;}
              dlog (listeDatenpunkteNew[3]);
            
            // 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."+versuch[z].hostname;
                              createState(data, true, {
                              name: ipWandler, 
                              role: 'boolean',
                              read:  true, 
                              write: true,
                             }, function() {mylog("created");
                              });
                              //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z].hostname, true);
            
                           //  {setState(data, true);
                              mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ;
                          } else {dlog("ist in verzeichnis"+ listeDatenpunkteNew[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
                           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]);}
            
                          
             } }  
            
            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+15000 && getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val) {
                   setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, false, 100);
                   mylog("abgesetzt: " +listeDatenpunkteNew[z] + " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                   lastChange.push("abwesend: "+listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");   
                      mylog(lastChange[0]);
                
               }
               if (parseFloat((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) < abfragezyklus && !getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val ==null ) {
                   setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, true, 100);
                   mylog("gesetzt" +listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                   lastChange.push("anwesend: "+ listeDatenpunkteNew[z]+ " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                
               }  
            }
            
            
            
            mylog("Status4");
            // erstelle htmlclientliste wenn listenDaten verändert  
                
                 for (var i = 0; i < versuch.length; i++)  {
                   dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                   if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {                      
                   clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
                   dlog(clientListe);}  
                   else {anzahlClients=anzahlClients-1;}
                   }
                 setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
            
            mylog("Status5");
            
            if (iqontrol && anwesenheit ) {
               
               lastChangeList="";
               for (var g = 0; g < lastChange.length; g++)  {
                   lastChangeList=lastChangeList.concat(lastChange[g]+"</br>"); lastChangeList.concat(lastChange[g]+"</br>");}
            
               fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl angemeldeter Clients:"+anzahlClients+"</p><p style=\"color:black; 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>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
            
            for (var i = 1; i < 21; i++) { 
               var x=i.toString();
               if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
               
            for (var i = 0; i < respv.data.length; i++) { 
              var zeit= respv.data[i].create_time*1000
              let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
            
              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 + "</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");
            
            }
            
            
            //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
            //Wifi an-/ausschalten
            //enabled: true = anschalten; false = ausschalten
            //wifi: wifi object aus der konstanten wifis
            async function setWifi(enabled, wifi) {
              return new Promise(async (resolve, reject) => {
                  dlog("setWifi: start set Wifi_haupt");
                  if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
                  dlog("setWifi: now setting Wifi_haupt");
                  let resp = request.post({
                      url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
                      body: JSON.stringify({ enabled }),
                      headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                  }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
                  dlog("setWifi: got response")
            
                  if (resp != null) {
                      dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                      dlog(resp);
                              // getclient()  Pause für umschalten
            
                      if (firstTime>=wifiLength) {       
                      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);
                  }
              });
            }
            
            
            
            //-----------------------------------------------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++;
             
             
                      
            });
            
            let scriptCounter=0;
            let alarmSwitch =false;
            let alarmCounter =0;
            
            //-----------------------------------------------MAIN LOOP------------------------------------------------
            setInterval(async () => {
            
                scriptCounter++
                mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                mylog(loggedIn.toString())
                    
                await login().catch(alarm1)  
            
               mylog("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs);
            
            if (loggedIn) {
                if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                if (alarmCounter > 0) {alarmCounter=0; }
                
                await getClients().catch(alarm3)  ;
                await getVouchers().catch(alarm4)
            
                if ( !testerrl && !testerrc && !testerrv && !testerrs  ) {
                       workVouchers();
                       workClients();}
                       
               for(let wifi_name in wifis) {
                   
                   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;
            
            
            
               }, abfragezyklus); // wird oben definiert
            
            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

            dslraserD 2 Antworten Letzte Antwort
            1
            • liv-in-skyL liv-in-sky

              @dslraser

              hallo - langes WE - bräuchte bitte nochmal test - bitte datenpunkte wieder löschen und scriptinstanz einstellen

              • alles unter der netzwerkkonstanten bitte ersetzen
              • vorallem ein langzeittest - habe bemerkt, dass sich das script nach einiger zeit verrennt - liegt an dem cookie, welches abläuft nach dieser zeit oder wenn ein controller restart war - konnte die version ohne cookie nicht ans laufen bringen - also nach einer stunde oder so wieder testen ob anwesenheit noch erkannt wird
              • bitte auch testen, ob script wieder kommt, wenn du controller abschaltest !! (log file beachten) - es verhält sich unterschiedlich, wenn du nach der ersten warnung im log wieder einschaltest oder auf 6 warnungen wartest - in beiden fällen sollte sich das script wieder fangen nach dem einschalten des controllers und die anwesenheit wieder funktionieren
              • alias ist noch nicht drin
              • möchtest du etwas mehr sehen im log, kannst du die variable mylog auf true setzen
              • bitte auch vouchers testen - und client anzahl ...
              • wenn du mal das gästenetzwerk abschaltest kommt eine pause im script (log) - habe bemerkt, dass vorallem die sonoffs ewig brauchen, bis sie wieder online sind (weil das hauptnetzwerk doch auch gestartet wird!) - in iqontrol kannst du dir dann ansehen, wer am längsten gebraucht hat (unter den clients) - in der pause (länge kann man einstellen) werden keine clients upgedatet

              ich hoffe der test fällt diemal positiv aus

              // September 2019 @liv-in-sky durch viel vorarbeit von @thewhobox (api verbindung)
              
              // Definition Login
              const unifi_username = "x";
              const unifi_password = "xxxxxx";
              const unifi_controller = "https://192.xxx.xxx.xxx:8443";
              
              
              // DEFINITION der zu anzeigenden Netzwerke am besten bis auf id und smart alle gleich setzen: beispiel:
              const wifis = {
               "WLAN_Dragon1": { name: "WLAN_Dragon1", id: "yyyyyyyyyyyyyyyyyyyyy", desc: "WLAN_Dragon1", smart: "WLAN_Dragon1" } ,
               "WLAN_DragonGuest": { name: "WLAN_DragonGuest", id: "yyyyyyyyyyyyyyyyyyyy", desc: "WLAN_DragonGuest", smart: "WLAN_DragonGuest" }
              }
              
              
              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, inder das script läuft zusammenpassen
              const dpPrefix = "javascript.2.";
              
              //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen 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
              
              //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 aliasname=false; //benutzt alias namen im controller hinterlegt anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige dess Clients
              
              // Hier Definition iqontrol-Style für Popup
              const format = "<!DOCTYPE html><html><head><title>Voucher</title></head><body><table style=\"color:black;text-align:center; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
              const format2 = "<!DOCTYPE html><html><head><title>Clients</title></head><body><table style=\"color:black; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
              
              
              //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
              let cookies = [];
              let loggedIn = false;
              let debug = false;
              let mylogs = false;
              let clientPause = false;
              let clientPauseVal;
              let wifiDPs = [];
              let realname="hostname";
              let respv;
              let respc;
              let respw;
              let statusarr=[];
              let versuch;
              let listeDatenpunkte = [];
              let lastChange=[];
              let testerrc=false;
              let testerrl=false;
              let testerrv=false;
              let testerrs=false;
              let firstTime=0;
              var wifiLength=0;
                   for(let wifi_name in wifis) {      
                 wifiLength++; }
              
              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: 'state',
                    read: true,
                    write: true,
                    type: "boolean",
                    smartName: {
                        de: wifis[wifi_name].smart,
                        smartType: "SWITCH"
                    } });}
              
              
              if (true) {
              createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                 name: 'Unifi Wifi Clients Table', 
                 role: 'string',
                 read:  true, 
                 write: true,
              });}
              
              
              
              if (vouchers) {
              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                 name: 'Unifi Wifi Vouchers_Table', 
                 role: 'string',
                 read:  true, 
                 write: true,
              });
              
              for (var i = 1; i < 21; i++) { 
                 var x=i.toString();
                 if (i<10) x="0"+x;
                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
                 name: 'Unifi Voucher_Code'+x, 
                 role: 'string',
                 read:  true, 
                 write: true,
                 });
              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
                 name: 'Unifi Voucher_Code_code'+x, 
                 role: 'string',
                 read:  true, 
                 write: true,
                 });    
              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
                 name: 'Unifi Voucher_Code_erstellt'+x, 
                 role: 'string',
                 read:  true, 
                 write: true,
                 });
              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
                 name: 'Unifi Voucher_Code_duration'+x, 
                 role: 'string',
                 read:  true, 
                 write: true,
                 });
              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
                 name: 'Unifi Voucher_Code_expires'+x, 
                 role: 'string',
                 read:  true, 
                 write: true,
                 });
              }}
              
              createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
              if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
              
              function dlog(message) {
                if(debug)
                    console.log(message);
              }
              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(unfiltered[2].hostname + unfiltered[2].mac);
              versuch = [];
              for(var index in unfiltered) {
                 let device = unfiltered[index];
                 if(device.hostname !== undefined && device.essid !== undefined)
                     versuch.push(device);
              }
              versuch.sort(function (alpha, beta) {
                 if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                     return -1;
                 if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                     return 1;
                 return 0;
              });
              
              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].hostname;}
                dlog (listeDatenpunkteNew[3]);
              
              // 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."+versuch[z].hostname;
                                createState(data, true, {
                                name: ipWandler, 
                                role: 'boolean',
                                read:  true, 
                                write: true,
                               }, function() {mylog("created");
                                });
                                //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z].hostname, true);
              
                             //  {setState(data, true);
                                mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ;
                            } else {dlog("ist in verzeichnis"+ listeDatenpunkteNew[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
                             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]);}
              
                            
               } }  
              
              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+15000 && getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val) {
                     setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, false, 100);
                     mylog("abgesetzt: " +listeDatenpunkteNew[z] + " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                     lastChange.push("abwesend: "+listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");   
                        mylog(lastChange[0]);
                  
                 }
                 if (parseFloat((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) < abfragezyklus && !getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val ==null ) {
                     setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, true, 100);
                     mylog("gesetzt" +listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                     lastChange.push("anwesend: "+ listeDatenpunkteNew[z]+ " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                  
                 }  
              }
              
              
              
              mylog("Status4");
              // erstelle htmlclientliste wenn listenDaten verändert  
                  
                   for (var i = 0; i < versuch.length; i++)  {
                     dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                     if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {                      
                     clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
                     dlog(clientListe);}  
                     else {anzahlClients=anzahlClients-1;}
                     }
                   setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
              
              mylog("Status5");
              
              if (iqontrol && anwesenheit ) {
                 
                 lastChangeList="";
                 for (var g = 0; g < lastChange.length; g++)  {
                     lastChangeList=lastChangeList.concat(lastChange[g]+"</br>"); lastChangeList.concat(lastChange[g]+"</br>");}
              
                 fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl angemeldeter Clients:"+anzahlClients+"</p><p style=\"color:black; 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>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
              
              for (var i = 1; i < 21; i++) { 
                 var x=i.toString();
                 if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
                 
              for (var i = 0; i < respv.data.length; i++) { 
                var zeit= respv.data[i].create_time*1000
                let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
              
                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 + "</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");
              
              }
              
              
              //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
              //Wifi an-/ausschalten
              //enabled: true = anschalten; false = ausschalten
              //wifi: wifi object aus der konstanten wifis
              async function setWifi(enabled, wifi) {
                return new Promise(async (resolve, reject) => {
                    dlog("setWifi: start set Wifi_haupt");
                    if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
                    dlog("setWifi: now setting Wifi_haupt");
                    let resp = request.post({
                        url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
                        body: JSON.stringify({ enabled }),
                        headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                    }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
                    dlog("setWifi: got response")
              
                    if (resp != null) {
                        dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                        dlog(resp);
                                // getclient()  Pause für umschalten
              
                        if (firstTime>=wifiLength) {       
                        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);
                    }
                });
              }
              
              
              
              //-----------------------------------------------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++;
               
               
                        
              });
              
              let scriptCounter=0;
              let alarmSwitch =false;
              let alarmCounter =0;
              
              //-----------------------------------------------MAIN LOOP------------------------------------------------
              setInterval(async () => {
              
                  scriptCounter++
                  mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                  mylog(loggedIn.toString())
                      
                  await login().catch(alarm1)  
              
                 mylog("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs);
              
              if (loggedIn) {
                  if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                  if (alarmCounter > 0) {alarmCounter=0; }
                  
                  await getClients().catch(alarm3)  ;
                  await getVouchers().catch(alarm4)
              
                  if ( !testerrl && !testerrc && !testerrv && !testerrs  ) {
                         workVouchers();
                         workClients();}
                         
                 for(let wifi_name in wifis) {
                     
                     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;
              
              
              
                 }, abfragezyklus); // wird oben definiert
              
              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);
              
              

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

              @liv-in-sky
              Also, sieht bisher alles gut aus. Auch die Log Einträge bzw. nach dem WLAN schalten kommen brav die Einträge bis wann das Script wartet. Wenn die Zeit um ist läuft es wieder brav an.
              Voucher habe ich mal einen gelöscht, das funktioniert auch. Anzeige passt.
              Auch die Anzahl der Clients und die Liste passt. (interessant auch die iQontrol Liste bzw. die "zwei" Listen)

              Das einzige was ich ändern musste, ist das hier

              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"
                    } });}
              

              Da habe ich aus dem role: 'state' einen switch gemacht, sonst konnte ich in iQontrol den Schalter nicht bedienen.

              Bildschirmfoto 2019-09-09 um 18.05.01.png

              Alles in Allem scheint es gut zu laufen. Ich lasse es jetzt mal ne Weile unverändert laufen.

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

                @dslraser

                hallo - langes WE - bräuchte bitte nochmal test - bitte datenpunkte wieder löschen und scriptinstanz einstellen

                • alles unter der netzwerkkonstanten bitte ersetzen
                • vorallem ein langzeittest - habe bemerkt, dass sich das script nach einiger zeit verrennt - liegt an dem cookie, welches abläuft nach dieser zeit oder wenn ein controller restart war - konnte die version ohne cookie nicht ans laufen bringen - also nach einer stunde oder so wieder testen ob anwesenheit noch erkannt wird
                • bitte auch testen, ob script wieder kommt, wenn du controller abschaltest !! (log file beachten) - es verhält sich unterschiedlich, wenn du nach der ersten warnung im log wieder einschaltest oder auf 6 warnungen wartest - in beiden fällen sollte sich das script wieder fangen nach dem einschalten des controllers und die anwesenheit wieder funktionieren
                • alias ist noch nicht drin
                • möchtest du etwas mehr sehen im log, kannst du die variable mylog auf true setzen
                • bitte auch vouchers testen - und client anzahl ...
                • wenn du mal das gästenetzwerk abschaltest kommt eine pause im script (log) - habe bemerkt, dass vorallem die sonoffs ewig brauchen, bis sie wieder online sind (weil das hauptnetzwerk doch auch gestartet wird!) - in iqontrol kannst du dir dann ansehen, wer am längsten gebraucht hat (unter den clients) - in der pause (länge kann man einstellen) werden keine clients upgedatet

                ich hoffe der test fällt diemal positiv aus

                // September 2019 @liv-in-sky durch viel vorarbeit von @thewhobox (api verbindung)
                
                // Definition Login
                const unifi_username = "x";
                const unifi_password = "xxxxxx";
                const unifi_controller = "https://192.xxx.xxx.xxx:8443";
                
                
                // DEFINITION der zu anzeigenden Netzwerke am besten bis auf id und smart alle gleich setzen: beispiel:
                const wifis = {
                 "WLAN_Dragon1": { name: "WLAN_Dragon1", id: "yyyyyyyyyyyyyyyyyyyyy", desc: "WLAN_Dragon1", smart: "WLAN_Dragon1" } ,
                 "WLAN_DragonGuest": { name: "WLAN_DragonGuest", id: "yyyyyyyyyyyyyyyyyyyy", desc: "WLAN_DragonGuest", smart: "WLAN_DragonGuest" }
                }
                
                
                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, inder das script läuft zusammenpassen
                const dpPrefix = "javascript.2.";
                
                //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen 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
                
                //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 aliasname=false; //benutzt alias namen im controller hinterlegt anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige dess Clients
                
                // Hier Definition iqontrol-Style für Popup
                const format = "<!DOCTYPE html><html><head><title>Voucher</title></head><body><table style=\"color:black;text-align:center; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
                const format2 = "<!DOCTYPE html><html><head><title>Clients</title></head><body><table style=\"color:black; font-family:Helvetica;background-image: linear-gradient(42deg,transparent, lightblue);\">";
                
                
                //-----------------AB HIER NICHTS MEHR ÄNDERN------------------------
                let cookies = [];
                let loggedIn = false;
                let debug = false;
                let mylogs = false;
                let clientPause = false;
                let clientPauseVal;
                let wifiDPs = [];
                let realname="hostname";
                let respv;
                let respc;
                let respw;
                let statusarr=[];
                let versuch;
                let listeDatenpunkte = [];
                let lastChange=[];
                let testerrc=false;
                let testerrl=false;
                let testerrv=false;
                let testerrs=false;
                let firstTime=0;
                var wifiLength=0;
                     for(let wifi_name in wifis) {      
                   wifiLength++; }
                
                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: 'state',
                      read: true,
                      write: true,
                      type: "boolean",
                      smartName: {
                          de: wifis[wifi_name].smart,
                          smartType: "SWITCH"
                      } });}
                
                
                if (true) {
                createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                   name: 'Unifi Wifi Clients Table', 
                   role: 'string',
                   read:  true, 
                   write: true,
                });}
                
                
                
                if (vouchers) {
                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                   name: 'Unifi Wifi Vouchers_Table', 
                   role: 'string',
                   read:  true, 
                   write: true,
                });
                
                for (var i = 1; i < 21; i++) { 
                   var x=i.toString();
                   if (i<10) x="0"+x;
                  createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
                   name: 'Unifi Voucher_Code'+x, 
                   role: 'string',
                   read:  true, 
                   write: true,
                   });
                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
                   name: 'Unifi Voucher_Code_code'+x, 
                   role: 'string',
                   read:  true, 
                   write: true,
                   });    
                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
                   name: 'Unifi Voucher_Code_erstellt'+x, 
                   role: 'string',
                   read:  true, 
                   write: true,
                   });
                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
                   name: 'Unifi Voucher_Code_duration'+x, 
                   role: 'string',
                   read:  true, 
                   write: true,
                   });
                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
                   name: 'Unifi Voucher_Code_expires'+x, 
                   role: 'string',
                   read:  true, 
                   write: true,
                   });
                }}
                
                createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                
                function dlog(message) {
                  if(debug)
                      console.log(message);
                }
                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(unfiltered[2].hostname + unfiltered[2].mac);
                versuch = [];
                for(var index in unfiltered) {
                   let device = unfiltered[index];
                   if(device.hostname !== undefined && device.essid !== undefined)
                       versuch.push(device);
                }
                versuch.sort(function (alpha, beta) {
                   if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                       return -1;
                   if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                       return 1;
                   return 0;
                });
                
                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].hostname;}
                  dlog (listeDatenpunkteNew[3]);
                
                // 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."+versuch[z].hostname;
                                  createState(data, true, {
                                  name: ipWandler, 
                                  role: 'boolean',
                                  read:  true, 
                                  write: true,
                                 }, function() {mylog("created");
                                  });
                                  //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z].hostname, true);
                
                               //  {setState(data, true);
                                  mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ;
                              } else {dlog("ist in verzeichnis"+ listeDatenpunkteNew[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
                               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]);}
                
                              
                 } }  
                
                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+15000 && getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val) {
                       setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, false, 100);
                       mylog("abgesetzt: " +listeDatenpunkteNew[z] + " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                       lastChange.push("abwesend: "+listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");   
                          mylog(lastChange[0]);
                    
                   }
                   if (parseFloat((new Date().getTime())) - (versuch[z]._last_seen_by_uap*1000) < abfragezyklus && !getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val ==null ) {
                       setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, true, 100);
                       mylog("gesetzt" +listeDatenpunkteNew[z]+" " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                       lastChange.push("anwesend: "+ listeDatenpunkteNew[z]+ " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                    
                   }  
                }
                
                
                
                mylog("Status4");
                // erstelle htmlclientliste wenn listenDaten verändert  
                    
                     for (var i = 0; i < versuch.length; i++)  {
                       dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                       if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {                      
                       clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
                       dlog(clientListe);}  
                       else {anzahlClients=anzahlClients-1;}
                       }
                     setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
                
                mylog("Status5");
                
                if (iqontrol && anwesenheit ) {
                   
                   lastChangeList="";
                   for (var g = 0; g < lastChange.length; g++)  {
                       lastChangeList=lastChangeList.concat(lastChange[g]+"</br>"); lastChangeList.concat(lastChange[g]+"</br>");}
                
                   fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl angemeldeter Clients:"+anzahlClients+"</p><p style=\"color:black; 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>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
                
                for (var i = 1; i < 21; i++) { 
                   var x=i.toString();
                   if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
                   
                for (var i = 0; i < respv.data.length; i++) { 
                  var zeit= respv.data[i].create_time*1000
                  let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
                
                  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 + "</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");
                
                }
                
                
                //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
                //Wifi an-/ausschalten
                //enabled: true = anschalten; false = ausschalten
                //wifi: wifi object aus der konstanten wifis
                async function setWifi(enabled, wifi) {
                  return new Promise(async (resolve, reject) => {
                      dlog("setWifi: start set Wifi_haupt");
                      if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
                      dlog("setWifi: now setting Wifi_haupt");
                      let resp = request.post({
                          url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
                          body: JSON.stringify({ enabled }),
                          headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                      }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
                      dlog("setWifi: got response")
                
                      if (resp != null) {
                          dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                          dlog(resp);
                                  // getclient()  Pause für umschalten
                
                          if (firstTime>=wifiLength) {       
                          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);
                      }
                  });
                }
                
                
                
                //-----------------------------------------------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++;
                 
                 
                          
                });
                
                let scriptCounter=0;
                let alarmSwitch =false;
                let alarmCounter =0;
                
                //-----------------------------------------------MAIN LOOP------------------------------------------------
                setInterval(async () => {
                
                    scriptCounter++
                    mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                    mylog(loggedIn.toString())
                        
                    await login().catch(alarm1)  
                
                   mylog("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs);
                
                if (loggedIn) {
                    if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                    if (alarmCounter > 0) {alarmCounter=0; }
                    
                    await getClients().catch(alarm3)  ;
                    await getVouchers().catch(alarm4)
                
                    if ( !testerrl && !testerrc && !testerrv && !testerrs  ) {
                           workVouchers();
                           workClients();}
                           
                   for(let wifi_name in wifis) {
                       
                       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;
                
                
                
                   }, abfragezyklus); // wird oben definiert
                
                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);
                
                

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

                @liv-in-sky
                Mein Android Handy wird sehr schnell erkannt. Ich habe das WLAN mehrfach an und aus geschaltet. WLAN am Android einschalten, Erkennung max 30 Sekunden. Ausschalten war bisher max 40 Sekunden.
                Das iPhone meiner Frau ist erst morgen wieder da. (Meine Frau ist bei einer Weiterbildung und hat das Handy mit, das kann ich dann erst morgen testen)

                1 Antwort Letzte Antwort
                0
                • dslraserD dslraser

                  @liv-in-sky
                  Also, sieht bisher alles gut aus. Auch die Log Einträge bzw. nach dem WLAN schalten kommen brav die Einträge bis wann das Script wartet. Wenn die Zeit um ist läuft es wieder brav an.
                  Voucher habe ich mal einen gelöscht, das funktioniert auch. Anzeige passt.
                  Auch die Anzahl der Clients und die Liste passt. (interessant auch die iQontrol Liste bzw. die "zwei" Listen)

                  Das einzige was ich ändern musste, ist das hier

                  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"
                        } });}
                  

                  Da habe ich aus dem role: 'state' einen switch gemacht, sonst konnte ich in iQontrol den Schalter nicht bedienen.

                  Bildschirmfoto 2019-09-09 um 18.05.01.png

                  Alles in Allem scheint es gut zu laufen. Ich lasse es jetzt mal ne Weile unverändert laufen.

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

                  @dslraser dann bin ich erstmal froh

                  den switch im datenpunkt habe ich mitaufgenommen - dann mußt du das nicht ändern

                  • hast du schon mal den controller abgeschalten - so dass kein login möglich 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

                  dslraserD 2 Antworten Letzte Antwort
                  0
                  • liv-in-skyL liv-in-sky

                    @dslraser dann bin ich erstmal froh

                    den switch im datenpunkt habe ich mitaufgenommen - dann mußt du das nicht ändern

                    • hast du schon mal den controller abgeschalten - so dass kein login möglich ist?
                    dslraserD Offline
                    dslraserD Offline
                    dslraser
                    Forum Testing Most Active
                    schrieb am zuletzt editiert von
                    #289

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

                    hast du schon mal den controller abgeschalten - so dass kein login möglich ist?

                    Nein, wollte ich eigentlich auch nicht :face_with_cowboy_hat: der läuft 24/7

                    1 Antwort Letzte Antwort
                    0
                    • dslraserD Offline
                      dslraserD Offline
                      dslraser
                      Forum Testing Most Active
                      schrieb am zuletzt editiert von dslraser
                      #290

                      @liv-in-sky
                      irgendetwas passt noch nicht.
                      Mein Handy (Android Note 8 ) war im Standby, das scheint genau das Aktualisierungsintervall zu sein ?

                      Edit: auch wenn das Handy nicht im Standby ist kommt die An und Abmeldung alle 20 Minuten.

                      Screenshot_20190909-202620_Telegram.jpg

                      Und noch eine Vermutung !? Kann es sein das wenn ich mit dem Handy im Haus rum laufe und es den AP wechselt ein "Netzwechsel" ausgelöst wird ? Sieht jedenfalls in der iQontrol Clientliste so aus ?

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

                        @dslraser dann bin ich erstmal froh

                        den switch im datenpunkt habe ich mitaufgenommen - dann mußt du das nicht ändern

                        • hast du schon mal den controller abgeschalten - so dass kein login möglich ist?
                        dslraserD Offline
                        dslraserD Offline
                        dslraser
                        Forum Testing Most Active
                        schrieb am zuletzt editiert von
                        #291

                        @liv-in-sky

                        Edit: auch wenn das Handy nicht im Standby ist kommt die An und Abmeldung alle 20 Minuten.

                        liv-in-skyL 1 Antwort Letzte Antwort
                        0
                        • dslraserD dslraser

                          @liv-in-sky

                          Edit: auch wenn das Handy nicht im Standby ist kommt die An und Abmeldung alle 20 Minuten.

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

                          @dslraser sagte in Unifi WLAN Script:

                          @liv-in-sky

                          Edit: auch wenn das Handy nicht im Standby ist kommt die An und Abmeldung alle 20 Minuten.

                          die an-abmelde funktion im script wird auf 2 wegen ermittelt: wenn ein handy nicht angemeldet ist, verschwindet es aus der auflistung (kommende daten) des controllers - das dauert auch mal bis zu 5 minuten - dann wird es auf faslch gesetzt.
                          und zum anderen über die last_seen_by_uap

                          mit dieser version des scripts siehst du in iqontrol die last_seen zeit in sekunden unter der clienten liste - vielleicht fällt was auf

                          • was ich nicht verstehe ist, warum auch ohne standby das handy ab und anmeldet - habe auch samsung gerät - da passiert das nicht
                          • bei wechsel des ap - evtl die constante "abfrageoffset" ändern - vergrößern in diesem script kannst du das machen einfach mal 10 sekunden dazu (auf 25000)

                          script instanz prüfen - datenpunkte löschen (habe auch den gewünschten datenpunkt in switch geändert - bitte prüfen)

                          
                          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, inder das script läuft zusammenpassen
                          const dpPrefix = "javascript.2.";
                          
                          //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen 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 aliasname=false; //benutzt alias namen im controller hinterlegt anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige dess Clients
                          
                          // 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 realname="hostname";
                          let respv;
                          let respc;
                          let respw;
                          let statusarr=[];
                          let versuch;
                          let listeDatenpunkte = [];
                          let lastChange=[];
                          let testerrc=false;
                          let testerrl=false;
                          let testerrv=false;
                          let testerrs=false;
                          let firstTime=0;
                          var wifiLength=0;
                               for(let wifi_name in wifis) {      
                             wifiLength++; }
                          
                          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"
                                } });}
                          
                          
                          if (true) {
                          createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                             name: 'Unifi Wifi Clients Table', 
                             role: 'string',
                             read:  true, 
                             write: true,
                          });}
                          
                          
                          
                          if (vouchers) {
                          createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                             name: 'Unifi Wifi Vouchers_Table', 
                             role: 'string',
                             read:  true, 
                             write: true,
                          });
                          
                          for (var i = 1; i < 21; i++) { 
                             var x=i.toString();
                             if (i<10) x="0"+x;
                            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
                             name: 'Unifi Voucher_Code'+x, 
                             role: 'string',
                             read:  true, 
                             write: true,
                             });
                          createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
                             name: 'Unifi Voucher_Code_code'+x, 
                             role: 'string',
                             read:  true, 
                             write: true,
                             });    
                          createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
                             name: 'Unifi Voucher_Code_erstellt'+x, 
                             role: 'string',
                             read:  true, 
                             write: true,
                             });
                          createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
                             name: 'Unifi Voucher_Code_duration'+x, 
                             role: 'string',
                             read:  true, 
                             write: true,
                             });
                          createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
                             name: 'Unifi Voucher_Code_expires'+x, 
                             role: 'string',
                             read:  true, 
                             write: true,
                             });
                          }}
                          
                          createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                          if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                          
                          function dlog(message) {
                            if(debug)
                                console.log(message);
                          }
                          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(unfiltered[2].hostname + unfiltered[2].mac);
                          versuch = [];
                          for(var index in unfiltered) {
                             let device = unfiltered[index];
                             if(device.hostname !== undefined && device.essid !== undefined)
                                 versuch.push(device);
                          }
                          versuch.sort(function (alpha, beta) {
                             if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                                 return -1;
                             if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                                 return 1;
                             return 0;
                          });
                          
                          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].hostname;}
                            dlog (listeDatenpunkteNew[3]);
                          
                          // 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."+versuch[z].hostname;
                                            createState(data, true, {
                                            name: ipWandler, 
                                            role: 'boolean',
                                            read:  true, 
                                            write: true,
                                           }, function() {mylog("created");
                                            });
                                            //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z].hostname, true);
                          
                                         //  {setState(data, true);
                                            mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ;
                                        } else {dlog("ist in verzeichnis"+ listeDatenpunkteNew[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
                                         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]);}
                          
                                        
                           } }  
                          
                          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].hostname).val) {
                                 setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, 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("abwesend: "+listeDatenpunkteNew[z]+" um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");   
                                 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].hostname).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val ==null ) {
                                 setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, 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("anwesend: "+ listeDatenpunkteNew[z]+ " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                                 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 wenn listenDaten verändert  
                              
                               for (var i = 0; i < versuch.length; i++)  {
                                 dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                                 if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {                      
                                 clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
                                 dlog(clientListe);}  
                                 else {anzahlClients=anzahlClients-1;}
                                 }
                               setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
                          
                          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+"</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>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
                          
                          for (var i = 1; i < 21; i++) { 
                             var x=i.toString();
                             if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
                             
                          for (var i = 0; i < respv.data.length; i++) { 
                            var zeit= respv.data[i].create_time*1000
                            let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
                          
                            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 + "</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");
                          
                          }
                          
                          
                          //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
                          //Wifi an-/ausschalten
                          //enabled: true = anschalten; false = ausschalten
                          //wifi: wifi object aus der konstanten wifis
                          async function setWifi(enabled, wifi) {
                            return new Promise(async (resolve, reject) => {
                                dlog("setWifi: start set Wifi_haupt");
                                if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
                                dlog("setWifi: now setting Wifi_haupt");
                                let resp = request.post({
                                    url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
                                    body: JSON.stringify({ enabled }),
                                    headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                                }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
                                dlog("setWifi: got response")
                          
                                if (resp != null) {
                                    dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                                    dlog(resp);
                                            // getclient()  Pause für umschalten
                          
                                    if (firstTime>=wifiLength) {       
                                    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);
                                }
                            });
                          }
                          
                          
                          
                          //-----------------------------------------------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++;
                           
                           
                                    
                          });
                          
                          let scriptCounter=0;
                          let alarmSwitch =false;
                          let alarmCounter =0;
                          
                          //-----------------------------------------------MAIN LOOP------------------------------------------------
                          setInterval(async () => {
                          
                              scriptCounter++
                              mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                              mylog(loggedIn.toString())
                                  
                              await login().catch(alarm1)  
                          
                             mylog("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs);
                          
                          if (loggedIn) {
                              if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                              if (alarmCounter > 0) {alarmCounter=0; }
                              
                              await getClients().catch(alarm3)  ;
                              await getVouchers().catch(alarm4)
                          
                              if ( !testerrl && !testerrc && !testerrv && !testerrs  ) {
                                     workVouchers();
                                     workClients();}
                                     
                             for(let wifi_name in wifis) {
                                 
                                 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;
                          
                          
                          
                             }, abfragezyklus); // wird oben definiert
                          
                          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);
                          
                          

                          Image 2.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 HiltexH 3 Antworten Letzte Antwort
                          0
                          • liv-in-skyL liv-in-sky

                            @dslraser sagte in Unifi WLAN Script:

                            @liv-in-sky

                            Edit: auch wenn das Handy nicht im Standby ist kommt die An und Abmeldung alle 20 Minuten.

                            die an-abmelde funktion im script wird auf 2 wegen ermittelt: wenn ein handy nicht angemeldet ist, verschwindet es aus der auflistung (kommende daten) des controllers - das dauert auch mal bis zu 5 minuten - dann wird es auf faslch gesetzt.
                            und zum anderen über die last_seen_by_uap

                            mit dieser version des scripts siehst du in iqontrol die last_seen zeit in sekunden unter der clienten liste - vielleicht fällt was auf

                            • was ich nicht verstehe ist, warum auch ohne standby das handy ab und anmeldet - habe auch samsung gerät - da passiert das nicht
                            • bei wechsel des ap - evtl die constante "abfrageoffset" ändern - vergrößern in diesem script kannst du das machen einfach mal 10 sekunden dazu (auf 25000)

                            script instanz prüfen - datenpunkte löschen (habe auch den gewünschten datenpunkt in switch geändert - bitte prüfen)

                            
                            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, inder das script läuft zusammenpassen
                            const dpPrefix = "javascript.2.";
                            
                            //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen 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 aliasname=false; //benutzt alias namen im controller hinterlegt anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige dess Clients
                            
                            // 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 realname="hostname";
                            let respv;
                            let respc;
                            let respw;
                            let statusarr=[];
                            let versuch;
                            let listeDatenpunkte = [];
                            let lastChange=[];
                            let testerrc=false;
                            let testerrl=false;
                            let testerrv=false;
                            let testerrs=false;
                            let firstTime=0;
                            var wifiLength=0;
                                 for(let wifi_name in wifis) {      
                               wifiLength++; }
                            
                            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"
                                  } });}
                            
                            
                            if (true) {
                            createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                               name: 'Unifi Wifi Clients Table', 
                               role: 'string',
                               read:  true, 
                               write: true,
                            });}
                            
                            
                            
                            if (vouchers) {
                            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                               name: 'Unifi Wifi Vouchers_Table', 
                               role: 'string',
                               read:  true, 
                               write: true,
                            });
                            
                            for (var i = 1; i < 21; i++) { 
                               var x=i.toString();
                               if (i<10) x="0"+x;
                              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
                               name: 'Unifi Voucher_Code'+x, 
                               role: 'string',
                               read:  true, 
                               write: true,
                               });
                            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
                               name: 'Unifi Voucher_Code_code'+x, 
                               role: 'string',
                               read:  true, 
                               write: true,
                               });    
                            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
                               name: 'Unifi Voucher_Code_erstellt'+x, 
                               role: 'string',
                               read:  true, 
                               write: true,
                               });
                            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
                               name: 'Unifi Voucher_Code_duration'+x, 
                               role: 'string',
                               read:  true, 
                               write: true,
                               });
                            createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
                               name: 'Unifi Voucher_Code_expires'+x, 
                               role: 'string',
                               read:  true, 
                               write: true,
                               });
                            }}
                            
                            createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                            if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                            
                            function dlog(message) {
                              if(debug)
                                  console.log(message);
                            }
                            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(unfiltered[2].hostname + unfiltered[2].mac);
                            versuch = [];
                            for(var index in unfiltered) {
                               let device = unfiltered[index];
                               if(device.hostname !== undefined && device.essid !== undefined)
                                   versuch.push(device);
                            }
                            versuch.sort(function (alpha, beta) {
                               if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                                   return -1;
                               if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                                   return 1;
                               return 0;
                            });
                            
                            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].hostname;}
                              dlog (listeDatenpunkteNew[3]);
                            
                            // 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."+versuch[z].hostname;
                                              createState(data, true, {
                                              name: ipWandler, 
                                              role: 'boolean',
                                              read:  true, 
                                              write: true,
                                             }, function() {mylog("created");
                                              });
                                              //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z].hostname, true);
                            
                                           //  {setState(data, true);
                                              mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ;
                                          } else {dlog("ist in verzeichnis"+ listeDatenpunkteNew[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
                                           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]);}
                            
                                          
                             } }  
                            
                            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].hostname).val) {
                                   setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, 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("abwesend: "+listeDatenpunkteNew[z]+" um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");   
                                   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].hostname).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val ==null ) {
                                   setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, 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("anwesend: "+ listeDatenpunkteNew[z]+ " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                                   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 wenn listenDaten verändert  
                                
                                 for (var i = 0; i < versuch.length; i++)  {
                                   dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                                   if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {                      
                                   clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
                                   dlog(clientListe);}  
                                   else {anzahlClients=anzahlClients-1;}
                                   }
                                 setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
                            
                            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+"</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>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
                            
                            for (var i = 1; i < 21; i++) { 
                               var x=i.toString();
                               if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
                               
                            for (var i = 0; i < respv.data.length; i++) { 
                              var zeit= respv.data[i].create_time*1000
                              let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
                            
                              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 + "</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");
                            
                            }
                            
                            
                            //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
                            //Wifi an-/ausschalten
                            //enabled: true = anschalten; false = ausschalten
                            //wifi: wifi object aus der konstanten wifis
                            async function setWifi(enabled, wifi) {
                              return new Promise(async (resolve, reject) => {
                                  dlog("setWifi: start set Wifi_haupt");
                                  if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
                                  dlog("setWifi: now setting Wifi_haupt");
                                  let resp = request.post({
                                      url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
                                      body: JSON.stringify({ enabled }),
                                      headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                                  }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
                                  dlog("setWifi: got response")
                            
                                  if (resp != null) {
                                      dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                                      dlog(resp);
                                              // getclient()  Pause für umschalten
                            
                                      if (firstTime>=wifiLength) {       
                                      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);
                                  }
                              });
                            }
                            
                            
                            
                            //-----------------------------------------------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++;
                             
                             
                                      
                            });
                            
                            let scriptCounter=0;
                            let alarmSwitch =false;
                            let alarmCounter =0;
                            
                            //-----------------------------------------------MAIN LOOP------------------------------------------------
                            setInterval(async () => {
                            
                                scriptCounter++
                                mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                                mylog(loggedIn.toString())
                                    
                                await login().catch(alarm1)  
                            
                               mylog("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs);
                            
                            if (loggedIn) {
                                if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                                if (alarmCounter > 0) {alarmCounter=0; }
                                
                                await getClients().catch(alarm3)  ;
                                await getVouchers().catch(alarm4)
                            
                                if ( !testerrl && !testerrc && !testerrv && !testerrs  ) {
                                       workVouchers();
                                       workClients();}
                                       
                               for(let wifi_name in wifis) {
                                   
                                   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;
                            
                            
                            
                               }, abfragezyklus); // wird oben definiert
                            
                            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);
                            
                            

                            Image 2.png

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

                            @liv-in-sky
                            habe ich mal so gemacht....(lasse es jetzt mal wieder laufen)

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

                              @dslraser sagte in Unifi WLAN Script:

                              @liv-in-sky

                              Edit: auch wenn das Handy nicht im Standby ist kommt die An und Abmeldung alle 20 Minuten.

                              die an-abmelde funktion im script wird auf 2 wegen ermittelt: wenn ein handy nicht angemeldet ist, verschwindet es aus der auflistung (kommende daten) des controllers - das dauert auch mal bis zu 5 minuten - dann wird es auf faslch gesetzt.
                              und zum anderen über die last_seen_by_uap

                              mit dieser version des scripts siehst du in iqontrol die last_seen zeit in sekunden unter der clienten liste - vielleicht fällt was auf

                              • was ich nicht verstehe ist, warum auch ohne standby das handy ab und anmeldet - habe auch samsung gerät - da passiert das nicht
                              • bei wechsel des ap - evtl die constante "abfrageoffset" ändern - vergrößern in diesem script kannst du das machen einfach mal 10 sekunden dazu (auf 25000)

                              script instanz prüfen - datenpunkte löschen (habe auch den gewünschten datenpunkt in switch geändert - bitte prüfen)

                              
                              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, inder das script läuft zusammenpassen
                              const dpPrefix = "javascript.2.";
                              
                              //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen 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 aliasname=false; //benutzt alias namen im controller hinterlegt anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige dess Clients
                              
                              // 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 realname="hostname";
                              let respv;
                              let respc;
                              let respw;
                              let statusarr=[];
                              let versuch;
                              let listeDatenpunkte = [];
                              let lastChange=[];
                              let testerrc=false;
                              let testerrl=false;
                              let testerrv=false;
                              let testerrs=false;
                              let firstTime=0;
                              var wifiLength=0;
                                   for(let wifi_name in wifis) {      
                                 wifiLength++; }
                              
                              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"
                                    } });}
                              
                              
                              if (true) {
                              createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                                 name: 'Unifi Wifi Clients Table', 
                                 role: 'string',
                                 read:  true, 
                                 write: true,
                              });}
                              
                              
                              
                              if (vouchers) {
                              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                                 name: 'Unifi Wifi Vouchers_Table', 
                                 role: 'string',
                                 read:  true, 
                                 write: true,
                              });
                              
                              for (var i = 1; i < 21; i++) { 
                                 var x=i.toString();
                                 if (i<10) x="0"+x;
                                createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
                                 name: 'Unifi Voucher_Code'+x, 
                                 role: 'string',
                                 read:  true, 
                                 write: true,
                                 });
                              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
                                 name: 'Unifi Voucher_Code_code'+x, 
                                 role: 'string',
                                 read:  true, 
                                 write: true,
                                 });    
                              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
                                 name: 'Unifi Voucher_Code_erstellt'+x, 
                                 role: 'string',
                                 read:  true, 
                                 write: true,
                                 });
                              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
                                 name: 'Unifi Voucher_Code_duration'+x, 
                                 role: 'string',
                                 read:  true, 
                                 write: true,
                                 });
                              createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
                                 name: 'Unifi Voucher_Code_expires'+x, 
                                 role: 'string',
                                 read:  true, 
                                 write: true,
                                 });
                              }}
                              
                              createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                              if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                              
                              function dlog(message) {
                                if(debug)
                                    console.log(message);
                              }
                              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(unfiltered[2].hostname + unfiltered[2].mac);
                              versuch = [];
                              for(var index in unfiltered) {
                                 let device = unfiltered[index];
                                 if(device.hostname !== undefined && device.essid !== undefined)
                                     versuch.push(device);
                              }
                              versuch.sort(function (alpha, beta) {
                                 if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                                     return -1;
                                 if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                                     return 1;
                                 return 0;
                              });
                              
                              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].hostname;}
                                dlog (listeDatenpunkteNew[3]);
                              
                              // 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."+versuch[z].hostname;
                                                createState(data, true, {
                                                name: ipWandler, 
                                                role: 'boolean',
                                                read:  true, 
                                                write: true,
                                               }, function() {mylog("created");
                                                });
                                                //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z].hostname, true);
                              
                                             //  {setState(data, true);
                                                mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ;
                                            } else {dlog("ist in verzeichnis"+ listeDatenpunkteNew[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
                                             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]);}
                              
                                            
                               } }  
                              
                              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].hostname).val) {
                                     setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, 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("abwesend: "+listeDatenpunkteNew[z]+" um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");   
                                     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].hostname).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val ==null ) {
                                     setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, 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("anwesend: "+ listeDatenpunkteNew[z]+ " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                                     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 wenn listenDaten verändert  
                                  
                                   for (var i = 0; i < versuch.length; i++)  {
                                     dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                                     if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {                      
                                     clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
                                     dlog(clientListe);}  
                                     else {anzahlClients=anzahlClients-1;}
                                     }
                                   setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
                              
                              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+"</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>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
                              
                              for (var i = 1; i < 21; i++) { 
                                 var x=i.toString();
                                 if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
                                 
                              for (var i = 0; i < respv.data.length; i++) { 
                                var zeit= respv.data[i].create_time*1000
                                let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
                              
                                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 + "</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");
                              
                              }
                              
                              
                              //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
                              //Wifi an-/ausschalten
                              //enabled: true = anschalten; false = ausschalten
                              //wifi: wifi object aus der konstanten wifis
                              async function setWifi(enabled, wifi) {
                                return new Promise(async (resolve, reject) => {
                                    dlog("setWifi: start set Wifi_haupt");
                                    if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
                                    dlog("setWifi: now setting Wifi_haupt");
                                    let resp = request.post({
                                        url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
                                        body: JSON.stringify({ enabled }),
                                        headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                                    }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
                                    dlog("setWifi: got response")
                              
                                    if (resp != null) {
                                        dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                                        dlog(resp);
                                                // getclient()  Pause für umschalten
                              
                                        if (firstTime>=wifiLength) {       
                                        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);
                                    }
                                });
                              }
                              
                              
                              
                              //-----------------------------------------------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++;
                               
                               
                                        
                              });
                              
                              let scriptCounter=0;
                              let alarmSwitch =false;
                              let alarmCounter =0;
                              
                              //-----------------------------------------------MAIN LOOP------------------------------------------------
                              setInterval(async () => {
                              
                                  scriptCounter++
                                  mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                                  mylog(loggedIn.toString())
                                      
                                  await login().catch(alarm1)  
                              
                                 mylog("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs);
                              
                              if (loggedIn) {
                                  if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                                  if (alarmCounter > 0) {alarmCounter=0; }
                                  
                                  await getClients().catch(alarm3)  ;
                                  await getVouchers().catch(alarm4)
                              
                                  if ( !testerrl && !testerrc && !testerrv && !testerrs  ) {
                                         workVouchers();
                                         workClients();}
                                         
                                 for(let wifi_name in wifis) {
                                     
                                     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;
                              
                              
                              
                                 }, abfragezyklus); // wird oben definiert
                              
                              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);
                              
                              

                              Image 2.png

                              HiltexH Offline
                              HiltexH Offline
                              Hiltex
                              schrieb am zuletzt editiert von Hiltex
                              #294

                              @liv-in-sky den Parameter ‚last_seen‘ nutze ich schon seit Beginn an zur Anwesenheitserkennung in einem Blockly-Script. Anfangs habe ich mir den Verlauf des Datenpunktes ins History schreiben lassen und mir dann mit Flot angeschaut, welcher Wert zuverlässig funktioniert (mit dem UniFi-Adapter).

                              Bei einem Abfrageintervall von 1 Minute sind 2 Minuten Last-Seen absolut zuverlässig. Bei einem Abfrageintervall von 30 Sekunden funktionieren 60 Sekunden absolut zuverlässig.

                              Man muss berücksichtigen, dass die Handys ja nicht permanent (ununterbrochen) Daten senden. Insofern wird zum Zeitpunkt der Abfrage die Zeit wahrscheinlich nie 0 sein. Meiner Meinung nach dürfte Abwesenheit erst nach der Zeit Abfrageintervall+30s oder später ausgelöst werden.

                              Blog: indibit.de

                              liv-in-skyL 1 Antwort Letzte Antwort
                              0
                              • HiltexH Hiltex

                                @liv-in-sky den Parameter ‚last_seen‘ nutze ich schon seit Beginn an zur Anwesenheitserkennung in einem Blockly-Script. Anfangs habe ich mir den Verlauf des Datenpunktes ins History schreiben lassen und mir dann mit Flot angeschaut, welcher Wert zuverlässig funktioniert (mit dem UniFi-Adapter).

                                Bei einem Abfrageintervall von 1 Minute sind 2 Minuten Last-Seen absolut zuverlässig. Bei einem Abfrageintervall von 30 Sekunden funktionieren 60 Sekunden absolut zuverlässig.

                                Man muss berücksichtigen, dass die Handys ja nicht permanent (ununterbrochen) Daten senden. Insofern wird zum Zeitpunkt der Abfrage die Zeit wahrscheinlich nie 0 sein. Meiner Meinung nach dürfte Abwesenheit erst nach der Zeit Abfrageintervall+30s oder später ausgelöst werden.

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

                                @Hiltex
                                danke dir - das ist genau das, was wir machen - bei mir ist es das abfrageinterval (mom. 20 sec) plus 15 sek - und das funktioniert

                                bei wechsel des ap kann es natürlich größer sein - daher die 20 sek plus evtl 25 oder 30 sek - mal sehen, was für @dslraser paßt

                                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 dslraser

                                  @liv-in-sky
                                  habe ich mal so gemacht....(lasse es jetzt mal wieder laufen)

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

                                  @dslraser

                                  habe gerade meinen ersten voucher mit dem script erzeugt ! ist das für dich auch interessant

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

                                    @dslraser

                                    habe gerade meinen ersten voucher mit dem script erzeugt ! ist das für dich auch interessant

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

                                    @liv-in-sky
                                    klar. (ich bin aktuell aber nicht am Rechner, bin unterwegs)

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

                                      @dslraser

                                      habe gerade meinen ersten voucher mit dem script erzeugt ! ist das für dich auch interessant

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

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

                                      @dslraser

                                      habe gerade meinen ersten voucher mit dem script erzeugt ! ist das für dich auch interessant

                                      Ja, das wäre wirklich interessant.

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

                                        @dslraser sagte in Unifi WLAN Script:

                                        @liv-in-sky

                                        Edit: auch wenn das Handy nicht im Standby ist kommt die An und Abmeldung alle 20 Minuten.

                                        die an-abmelde funktion im script wird auf 2 wegen ermittelt: wenn ein handy nicht angemeldet ist, verschwindet es aus der auflistung (kommende daten) des controllers - das dauert auch mal bis zu 5 minuten - dann wird es auf faslch gesetzt.
                                        und zum anderen über die last_seen_by_uap

                                        mit dieser version des scripts siehst du in iqontrol die last_seen zeit in sekunden unter der clienten liste - vielleicht fällt was auf

                                        • was ich nicht verstehe ist, warum auch ohne standby das handy ab und anmeldet - habe auch samsung gerät - da passiert das nicht
                                        • bei wechsel des ap - evtl die constante "abfrageoffset" ändern - vergrößern in diesem script kannst du das machen einfach mal 10 sekunden dazu (auf 25000)

                                        script instanz prüfen - datenpunkte löschen (habe auch den gewünschten datenpunkt in switch geändert - bitte prüfen)

                                        
                                        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, inder das script läuft zusammenpassen
                                        const dpPrefix = "javascript.2.";
                                        
                                        //Pause bei Umschalten der WLANnetze, damit Netzanmeldungen 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 aliasname=false; //benutzt alias namen im controller hinterlegt anstatt hostname - VORSICHT kein ALIAS definiert - keine Anzeige dess Clients
                                        
                                        // 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 realname="hostname";
                                        let respv;
                                        let respc;
                                        let respw;
                                        let statusarr=[];
                                        let versuch;
                                        let listeDatenpunkte = [];
                                        let lastChange=[];
                                        let testerrc=false;
                                        let testerrl=false;
                                        let testerrv=false;
                                        let testerrs=false;
                                        let firstTime=0;
                                        var wifiLength=0;
                                             for(let wifi_name in wifis) {      
                                           wifiLength++; }
                                        
                                        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"
                                              } });}
                                        
                                        
                                        if (true) {
                                        createState(dpPrefix + "WLANUnifi.Wifi_Clients", {
                                           name: 'Unifi Wifi Clients Table', 
                                           role: 'string',
                                           read:  true, 
                                           write: true,
                                        });}
                                        
                                        
                                        
                                        if (vouchers) {
                                        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers", {
                                           name: 'Unifi Wifi Vouchers_Table', 
                                           role: 'string',
                                           read:  true, 
                                           write: true,
                                        });
                                        
                                        for (var i = 1; i < 21; i++) { 
                                           var x=i.toString();
                                           if (i<10) x="0"+x;
                                          createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x, {
                                           name: 'Unifi Voucher_Code'+x, 
                                           role: 'string',
                                           read:  true, 
                                           write: true,
                                           });
                                        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".code"+x, {
                                           name: 'Unifi Voucher_Code_code'+x, 
                                           role: 'string',
                                           read:  true, 
                                           write: true,
                                           });    
                                        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".erstellt", {
                                           name: 'Unifi Voucher_Code_erstellt'+x, 
                                           role: 'string',
                                           read:  true, 
                                           write: true,
                                           });
                                        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".dauer", {
                                           name: 'Unifi Voucher_Code_duration'+x, 
                                           role: 'string',
                                           read:  true, 
                                           write: true,
                                           });
                                        createState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+x+".abgelaufen", {
                                           name: 'Unifi Voucher_Code_expires'+x, 
                                           role: 'string',
                                           read:  true, 
                                           write: true,
                                           });
                                        }}
                                        
                                        createState(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",  { name: 'Wifi_Clients_Anzahl', desc: 'Wifi_Clients_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true });
                                        if (vouchers) createState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", { name: 'Wifi_Vouchers_Anzahl', desc: 'Wifi_Vouchers_Anzahl', type: 'number', unit: '', min: '0', max: '100', role: '',read: true, write: true }); 
                                        
                                        function dlog(message) {
                                          if(debug)
                                              console.log(message);
                                        }
                                        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(unfiltered[2].hostname + unfiltered[2].mac);
                                        versuch = [];
                                        for(var index in unfiltered) {
                                           let device = unfiltered[index];
                                           if(device.hostname !== undefined && device.essid !== undefined)
                                               versuch.push(device);
                                        }
                                        versuch.sort(function (alpha, beta) {
                                           if (alpha.hostname.toLowerCase() < beta.hostname.toLowerCase())
                                               return -1;
                                           if (alpha.hostname.toLowerCase() > beta.hostname.toLowerCase())
                                               return 1;
                                           return 0;
                                        });
                                        
                                        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].hostname;}
                                          dlog (listeDatenpunkteNew[3]);
                                        
                                        // 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."+versuch[z].hostname;
                                                          createState(data, true, {
                                                          name: ipWandler, 
                                                          role: 'boolean',
                                                          read:  true, 
                                                          write: true,
                                                         }, function() {mylog("created");
                                                          });
                                                          //setState(dpPrefix + "WLANUnifi.Wifi_Client_States."+ versuch[z].hostname, true);
                                        
                                                       //  {setState(data, true);
                                                          mylog("Datenpunktanlegen fertig" + listeDatenpunkteNew[z] + listeDatenpunkte[z]) ;
                                                      } else {dlog("ist in verzeichnis"+ listeDatenpunkteNew[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
                                                       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]);}
                                        
                                                      
                                         } }  
                                        
                                        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].hostname).val) {
                                               setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, 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("abwesend: "+listeDatenpunkteNew[z]+" um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");   
                                               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].hostname).val || getState(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname).val ==null ) {
                                               setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Client_States."+versuch[z].hostname, 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("anwesend: "+ listeDatenpunkteNew[z]+ " um " +formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss") + " Uhr");
                                               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 wenn listenDaten verändert  
                                            
                                             for (var i = 0; i < versuch.length; i++)  {
                                               dlog(versuch[i].hostname + " --- " + versuch[i].essid + " --- " + versuch[i].ip);
                                               if  (parseInt((new Date().getTime())) - (versuch[i]._last_seen_by_uap*1000) < abfragezyklus+15000) {                      
                                               clientListe = clientListe.concat("<tr><td>"+versuch[i].hostname+"&ensp;</td><td>"+versuch[i].essid+"&ensp;&ensp;&ensp;&ensp;</td><td>"+versuch[i].ip+"</td></tr>");
                                               dlog(clientListe);}  
                                               else {anzahlClients=anzahlClients-1;}
                                               }
                                             setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100);   //korrigiert
                                        
                                        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+"</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>STATUS-ABGELAUFEN&ensp;&ensp;&ensp;&ensp;</td><td>CODE</td>&ensp;&ensp;</td><td>ERSTELLT</td></tr> ";
                                        
                                        for (var i = 1; i < 21; i++) { 
                                           var x=i.toString();
                                           if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);}
                                           
                                        for (var i = 0; i < respv.data.length; i++) { 
                                          var zeit= respv.data[i].create_time*1000
                                          let zeit1 =  formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString();
                                        
                                          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 + "</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");
                                        
                                        }
                                        
                                        
                                        //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN----------------------------------------------
                                        //Wifi an-/ausschalten
                                        //enabled: true = anschalten; false = ausschalten
                                        //wifi: wifi object aus der konstanten wifis
                                        async function setWifi(enabled, wifi) {
                                          return new Promise(async (resolve, reject) => {
                                              dlog("setWifi: start set Wifi_haupt");
                                              if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); }
                                              dlog("setWifi: now setting Wifi_haupt");
                                              let resp = request.post({
                                                  url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id,
                                                  body: JSON.stringify({ enabled }),
                                                  headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") }
                                              }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) });
                                              dlog("setWifi: got response")
                                        
                                              if (resp != null) {
                                                  dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet"));
                                                  dlog(resp);
                                                          // getclient()  Pause für umschalten
                                        
                                                  if (firstTime>=wifiLength) {       
                                                  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);
                                              }
                                          });
                                        }
                                        
                                        
                                        
                                        //-----------------------------------------------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++;
                                         
                                         
                                                  
                                        });
                                        
                                        let scriptCounter=0;
                                        let alarmSwitch =false;
                                        let alarmCounter =0;
                                        
                                        //-----------------------------------------------MAIN LOOP------------------------------------------------
                                        setInterval(async () => {
                                        
                                            scriptCounter++
                                            mylog("-----------------------SCRIPTCOUNTER------------------ ist : " + scriptCounter );
                                            mylog(loggedIn.toString())
                                                
                                            await login().catch(alarm1)  
                                        
                                           mylog("------------------------------------------------Werte Alarme: " + testerrl + " - " + testerrc+ " - " +testerrv + " - "+testerrs);
                                        
                                        if (loggedIn) {
                                            if (alarmCounter > 5) {log("Unifi Sript funktioniert wieder - Verbindung wieder hergestellt","error");}
                                            if (alarmCounter > 0) {alarmCounter=0; }
                                            
                                            await getClients().catch(alarm3)  ;
                                            await getVouchers().catch(alarm4)
                                        
                                            if ( !testerrl && !testerrc && !testerrv && !testerrs  ) {
                                                   workVouchers();
                                                   workClients();}
                                                   
                                           for(let wifi_name in wifis) {
                                               
                                               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;
                                        
                                        
                                        
                                           }, abfragezyklus); // wird oben definiert
                                        
                                        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);
                                        
                                        

                                        Image 2.png

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

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

                                        bei wechsel des ap - evtl die constante "abfrageoffset" ändern - vergrößern in diesem script kannst du das machen einfach mal 10 sekunden dazu (auf 25000)

                                        20000 hat nicht gereicht, ich bin jetzt mal auf

                                        const abfageoffset = 30000; // zu schnelle Abmeldungen können hier eingestellt weren - > erhöhen (15000 = 15 sek.)
                                        
                                        liv-in-skyL 1 Antwort Letzte Antwort
                                        0
                                        • dslraserD dslraser

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

                                          bei wechsel des ap - evtl die constante "abfrageoffset" ändern - vergrößern in diesem script kannst du das machen einfach mal 10 sekunden dazu (auf 25000)

                                          20000 hat nicht gereicht, ich bin jetzt mal auf

                                          const abfageoffset = 30000; // zu schnelle Abmeldungen können hier eingestellt weren - > erhöhen (15000 = 15 sek.)
                                          
                                          liv-in-skyL Offline
                                          liv-in-skyL Offline
                                          liv-in-sky
                                          schrieb am zuletzt editiert von
                                          #300

                                          @dslraser kann man vielleicht im controller noch was einstellen - irgendein update interval

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          365

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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