- Home
- Deutsch
- Skripten / Logik
- JavaScript
- Unifi WLAN Script
Unifi WLAN Script
-
@dslraser ok - kommt gleich
-
ersetze alles unter der constanten wifis (netzwerke) - über dem neuen teil sthet nur die netzwerk constante und die anmeldeinfos
und lass mal laufen - bitta auch auf javascript instanz achten
lass erstmal so laufen - und wenn es gut aussieht - setze die variable aliasname auf true
der scriptteil - es gibt keine konfiguration mehr führ die zu überwachenden geräte !!! - wird alles gleichbehandelt
const request = require('request-promise-native').defaults({ rejectUnauthorized: false }); var fs = require('fs') const datei = "/opt/iobroker/iobroker-data/files/iqontrol/htmlvoucher.html"; const datei2 = "/opt/iobroker/iobroker-data/files/iqontrol/htmlclients.html"; let writeFile = true; let writeFileVar = 0; let writeClientTable = true; let writeAnwesenheit = true; let listeDatenpunkte = []; let listeDatenpunkteNew = []; let listeDatenpunkteAlt = []; // Datenpunkte Hauptpfad wählen - WICHTIG muss mit der javascript instanz, inder das script läuft zusammenpassen const dpPrefix = "javascript.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 = true; let clientPause = false; let clientPauseVal; let wifiDPs = []; let alias="hostname"; 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) alias="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) => { let resp = await request.post({ resolveWithFullResponse: true, url: unifi_controller + "/api/login", body: JSON.stringify({ username: unifi_username, password: unifi_password }), headers: { 'Content-Type': 'application/json' } }).catch((e) => { dlog("login: reject"), reject(e) }); if(resp != null) { dlog("login: login war erfolgreich! " + ((resp.headers && resp.headers.hasOwnProperty("set-cookie")) ? "Mit Cookies":"Ohne Cookies")); if(resp.headers && resp.headers.hasOwnProperty("set-cookie")) { let set_cookies = resp.headers["set-cookie"]; for(i = 0; i < set_cookies.length; i++) { let cookie = set_cookies[i]; cookie = cookie.split(";")[0]; cookies.push(cookie); } } else { dlog("login: no cookies to set!") } loggedIn = true; resolve(); } else { dlog("login: rejected") reject("resp = null"); } }); } async function dlogout() { return new Promise(async (resolve, reject) => { let resp = await request.get({ url: unifi_controller + "/dlogout", headers: { Cookie: cookies.join("; ") } }).catch((e) => reject(e)); if(resp != null) { dlog("Du bist nun ausgedloggt."); dlog(resp); resolve(); } else { reject("resp = null"); } }); } //-----------------------------------------STATUS WIFI --------------------------------------------------------- //Updatet status vom Wifi //wifi: wifi object aus der konstanten wifis async function getStatus(wifi) { dlog("BIN IN STATUS"); return new Promise(async (resolve, reject) => { dlog("nur mal so"); if (!loggedIn) await login().catch((e) => reject(e)); let resp = await request.get({ url: unifi_controller + "/api/s/default/rest/wlanconf/" + wifi.id, headers: { Cookie: cookies.join("; ") } }).catch((e) => { dlog("getStatus reject " + e); reject(e) }); dlog("got response " + JSON.stringify(resp)); resp = JSON.parse(resp); let wlanOn = resp.data[0].enabled; dlog("WLAN " + wifi.name + " ist: " + (wlanOn ? "an" : "aus")); if (resp != null && resp.meta && resp.meta.rc == "ok") { dlog("Status erfolgreich geholt!"); dlog(resp); let wlanOn = resp.data[0].enabled; dlog("WLAN ist: " + (wlanOn ? "an" : "aus")); setStateDelayed(dpPrefix + "WLANUnifi." + wifi.name, wlanOn, 200); resolve(wlanOn); } else { dlog("nicht ok...") reject(JSON.stringify(resp)); }dlog("BIN aus STATUS raus"); }); } //-----------------------------------------GETCLIENTS--------------------------------------------------------------- async function getClients() { mylog("BIN IN CLIENTS"); return new Promise(async (resolve, reject) => { dlog("nur mal so"); if(!loggedIn) await login().catch((e) => reject(e)); let resp = await request.get({ url: unifi_controller + "/api/s/default/stat/sta/", headers: { Cookie: cookies.join("; ") } }).catch((e) => { dlog("getStatus reject " + e); reject(e) }); dlog("got response " + JSON.stringify(resp)); dlog(typeof resp); dlog("--------------------- " + resp); //resp = JSON.parse(resp); //Sortierung Daten und Verwandlung Json var unfiltered = []; unfiltered = JSON.parse(resp).data; dlog(unfiltered[2].hostname + unfiltered[2].mac); let 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; }); var anzahlClients = versuch.length; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Clients_Anzahl",anzahlClients,100); var clientListe = ""; getExistingClients(); mylog("Status1"); 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 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" +versuch[z].hostname+listeDatenpunkteNew[z]); mylog(tester.toString()); } 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" +versuch[z].hostname+listeDatenpunkteNew[z]); mylog(tester.toString()); } } }, 2500);} 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+" </td><td>"+versuch[i].essid+"    </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 ) fs.writeFileSync(datei2, format2+clientListe.concat("</table><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl angemeldeter Geräte:"+anzahlClients+"</p>")); 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 clients"); }); //new promise } //getclientend //-----------------------------------------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() { dlog("BIN IN VOUCHERS"); return new Promise(async (resolve, reject) => { dlog("nur mal so"); if(!loggedIn) await login().catch((e) => reject(e)); let resp = await request.get({ url: unifi_controller + "/api/s/default/stat/voucher", headers: { Cookie: cookies.join("; ") } }).catch((e) => { dlog("getStatus reject " + e); reject(e) }); dlog("got response " + JSON.stringify(resp)); dlog(typeof resp); dlog("--------------------- " + resp); resp = JSON.parse(resp); dlog(resp.meta); dlog(resp.meta.rc); dlog(resp.data[1].code); dlog(resp.data.length); dlog(JSON.stringify(resp).length.toString()); var laengeMessage=JSON.stringify(resp).length; if (laengeMessage==writeFileVar) {writeFile = false;} else {writeFile=true} writeFileVar=JSON.stringify(resp).length; if (writeFile) { var clientListe = "<tr><td>DAUER </td><td>STATUS-ABGELAUFEN    </td><td>CODE</td>  </td><td>ERSTELLT</td></tr> "; for (var i = 1; i < 21; i++) { var x=i.toString(); if ( i < 10) { var yyy="0"+x;} else {yyy=x}; setStateDelayed(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yyy, "", 100);} for (var i = 0; i < resp.data.length; i++) { var zeit= resp.data[i].create_time*1000 let zeit1 = formatDate(getDateObject(zeit), "TT.MM.JJJJ SS:mm").toString(); clientListe = clientListe.concat("<tr><td>"+resp.data[i].duration+" </td><td>"+resp.data[i].status_expires+"    </td><td>"+resp.data[i].code+"  </td><td>" +zeit1 + "</td></tr>"); var y=i+1; var yy=y.toString(); if (y<10 ) yy="0"+yy; if (i<20 ) { dlog(zeit1); setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".code"+yy, resp.data[i].code ); setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", zeit1 ); setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", resp.data[i].duration ); setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", resp.data[i].status_expires ); }} //Datenpunkteäalt löschen var w = resp.data.length; for (i = w; i < 20; i++) { var y=i+1; var yy=y.toString(); if (y<10 ) yy="0"+yy; setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".code"+yy, " na " ); setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".erstellt", " na " ); setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".dauer", " na " ); setState(dpPrefix + "WLANUnifi.Wifi_Vouchers-CODES.CODE"+yy+".abgelaufen", " na " ); } } if (iqontrol && writeFile) {fs.writeFileSync(datei, format + clientListe.concat("</table></style></body></html><p style=\"color:blue; font-family:Helvetica;\">Geamtanzahl Vouchers:"+resp.data.length+"</p>"));} if (writeFile) setState(dpPrefix + "WLANUnifi.Wifi_Vouchers", "<table>"+clientListe.concat("</table></style></body></html>")); if (writeFile) setState(dpPrefix + "WLANUnifi.Wifi_Vouchers_Anzahl", resp.data.length); dlog("bin raus a existing vouchers"); }); } //-----------------------------------------SET WIFIS - WIFI EIN-AUSSCHALTEN---------------------------------------------- //Wifi an-/ausschalten //enabled: true = anschalten; false = ausschalten //wifi: wifi object aus der konstanten wifis async function setWifi(enabled, wifi) { return new Promise(async (resolve, reject) => { dlog("setWifi: start set Wifi_haupt"); if (!loggedIn) { dlog("need to login"); await login().catch((e) => reject(e)); } dlog("setWifi: now setting Wifi_haupt"); let resp = request.post({ url: unifi_controller + "/api/s/default/upd/wlanconf/" + wifi.id, body: JSON.stringify({ enabled }), headers: { 'Content-Type': 'application/json', Cookie: cookies.join("; ") } }).catch((e) => { dlog("setWifi: rejected: " + e); reject(e) }); dlog("setWifi: got response") if (resp != null) { dlog("setWifi: Wifi wurde erfolgreich " + (enabled ? "eingeschaltet" : "ausgeschaltet")); dlog(resp); // getclient() Pause für umschalten 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]) }); //-----------------------------------------------MAIN LOOP------------------------------------------------ setInterval(async () => { for(let wifi_name in wifis) { await getStatus(wifis[wifi_name]);} if (vouchers) getVouchers(); if (!clientPause) { await getClients(); } else { var interim=parseInt(new Date().getTime()); log("Unifi Script ist in Pause um auf WLAN zu warten","warn"); if (interim - clientPauseVal > clientPauseConst) {clientPause=false;log("Unifi Script hat Pause beendet");} } }, abfragezyklus); // wird oben definiert clientPauseVal=parseInt((new Date().getTime())); log(clientPauseVal.toString()) // Beispiel für //setWifi(true, wifis.WLAN_DragonGuest);
du könntest auch mal das gästenetzwerk umschalten und im log beobachten, was für warnungen kommen - ich schalte nämlich die getclient() für eine zeit ab, wenn das netzwerk restartet - bei mir brauchen die sonoffs so lang, bis sie wieder angemeldet sind
-
@dslraser vor dem umschalten - bitte datenpunkte löschen
-
okay
-
@dslraser nee - glaube das funktioniert so nicht
-
@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
-
@dslraser ok - muss ich nochmal checken - wird erst morgen gehen - aber danke fürs testen
-
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
-
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+" </td><td>"+versuch[i].essid+"    </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 </td><td>STATUS-ABGELAUFEN    </td><td>CODE</td>  </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+" </td><td>"+respv.data[i].status_expires+"    </td><td>"+respv.data[i].code+"  </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);
-
@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.
Alles in Allem scheint es gut zu laufen. Ich lasse es jetzt mal ne Weile unverändert laufen.
-
@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) -
@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?
-
@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 der läuft 24/7
-
@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.
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 ?
-
Edit: auch wenn das Handy nicht im Standby ist kommt die An und Abmeldung alle 20 Minuten.
-
@dslraser sagte in Unifi WLAN Script:
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_uapmit 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]+"  </td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"    </td><td>out</td><td>  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]+"  </td><td>"+formatDate(getDateObject((parseFloat((new Date().getTime())) - tester)), "SS:mm:ss")+"    </td><td>in</td><td>  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+" </td><td>"+versuch[i].essid+"    </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 </td><td>STATUS-ABGELAUFEN    </td><td>CODE</td>  </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+" </td><td>"+respv.data[i].status_expires+"    </td><td>"+respv.data[i].code+"  </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);
-
@liv-in-sky
habe ich mal so gemacht....(lasse es jetzt mal wieder laufen) -
@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.
-
-
habe gerade meinen ersten voucher mit dem script erzeugt ! ist das für dich auch interessant