// Anwesenheitsliste aus TR064 bauen // Autor Looxer01 01.01.2017 // Das Programm basiert auf den Adapter TR064 der die WLAN verfügbarkeit von allen Geräten überwacht // Die States fuer USER1 - USERx müssen aus dem Adapter TR064 entnommen werden // Funktionen: // Ermittlung ob irgendwer anwesend ist // Speichern von kommt und gehtzeiten // Speichern der Anwesenheitsliste mit kommt und geht als Json // Log schreiben für jede Atkualisierung der Anwesenheit //----------------------------------------------------------------------------------------------------- // Einstellbereich //----------------------------------------------------------------------------------------------------- // Hier ist der State für den die Deviceermittlung der durch den TR064 ermittelt wird var StateTR064Device = "tr-064.0.devices."; // Hier ist der State für den die Anwesenheitssimulation. Bei True wird die AWS (separates Programm) gestartet var IDAWSAktiv = "javascript.0.Anwesenheitssteuerung.AWSAktiv"; // ID AWS flag // Falls die Anwesenheitssimulation verknüpft werden soll dann hier TRUE eintragen und dann die Zeit in Sekunden nach Abwesenheit, die vergehen soll bis die Simulation aktiviert wird var AWSCheckAktiv = false; // auf true setzen, wenn die Anwesenheitssimulation genutzt wird var AWSZeit = 600; // nach diesen Sekunden verzoegerung wird die Simulation aktiviert // die Variable anzahluser muss mit den folgenden variablen zusammenpassen: user1-userN, User1Text - userNtext, StateUser1 - StateUserN // vorgegeben ist 6, wenn mehr verwendet werden sollen, dann muss das coding leicht angepasst werden var anzahluser = 5; // Maximale Anzahl der User mit Anwesenheitsueberwachung // die Deviceliste aus TR064, die ueberwacht werden soll muss hier eingetragen werden var User1 = StateTR064Device + "Iphone-Daisy"; var User2 = StateTR064Device + "Micky-iPhone"; var User3 = StateTR064Device + "Tick"; var User4 = StateTR064Device + "Trick"; var User5 = StateTR064Device + "Track-Phone"; var User6 = StateTR064Device + "initial"; // userliste in Klartext - hier koennen beliebige Namen vergeben werden var User1Text = "Daisy"; var User2Text = "Micky"; var User3Text = "Tick"; var User4Text = "Trick"; var User5Text = "Track"; var User6Text = "initial"; // Allgemeine Anwesenheiten. Die Namen koennen geändert werden var UserAllText = "JemandDa"; var UserString = "Liste"; // Pfad für die userliste nach .0. kann der Name frei vergeben werden und wird entsprechend in die Objektliste geschrieben var path = 'javascript.0.Anwesenheitssteuerung.'; // Pfad für create states //Logging var logflag = false; // logging enabled var LogPath = "/opt/iobroker/iobroker-data/Anwesenheiten.csv"; // Pfad und Dateiname des externen Logs //----------------------------------------------------------------------------------------------------- // Ende Einstellbereich //----------------------------------------------------------------------------------------------------- // states für die Userlist Anpassung muss nur vorgenommen wenn mehr oder Weniger Benutzer ausgewertet werden. Hier auch die Variable anzahluser anpassen var StateUser1 = path + 'Userlist.' + User1Text; var StateUser2 = path + 'Userlist.' + User2Text; var StateUser3 = path + 'Userlist.' + User3Text; var StateUser4 = path + 'Userlist.' + User4Text; var StateUser5 = path + 'Userlist.' + User5Text; var StateUser6 = path + 'Userlist.' + User6Text; var StateUserString = path + 'Userlist.' + UserString; var StateUserAll = path + 'Userlist.' + UserAllText; var StateUser1Geht = path + 'Userlist.1KommtGeht.' + User1Text+"Geht"; var StateUser1Kommt = path + 'Userlist.1KommtGeht.' + User1Text+"Kommt"; var StateUser2Geht = path + 'Userlist.1KommtGeht.' + User2Text+"Geht"; var StateUser2Kommt = path + 'Userlist.1KommtGeht.' + User2Text+"Kommt"; var StateUser3Geht = path + 'Userlist.1KommtGeht.' + User3Text+"Geht"; var StateUser3Kommt = path + 'Userlist.1KommtGeht.' + User3Text+"Kommt"; var StateUser4Geht = path + 'Userlist.1KommtGeht.' + User4Text+"Geht"; var StateUser4Kommt = path + 'Userlist.1KommtGeht.' + User4Text+"Kommt"; var StateUser5Geht = path + 'Userlist.1KommtGeht.' + User5Text+"Geht"; var StateUser5Kommt = path + 'Userlist.1KommtGeht.' + User5Text+"Kommt"; var StateUser6Geht = path + 'Userlist.1KommtGeht.' + User6Text+"Geht"; var StateUser6Kommt = path + 'Userlist.1KommtGeht.' + User6Text+"Kommt"; var StateUserListeJason = path + 'Userlist.1KommtGeht.' + "AnwesenheitJason"; var CreationTime = " "; var fs = require('fs'); // enable write fuer externes log // Datenpunkte erzeugen createState(StateUser1, false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit User1', desc: 'Anwesenheit User1'}); createState(StateUser2, false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit User2', desc: 'Anwesenheit User2'}); createState(StateUser3, false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit User3', desc: 'Anwesenheit User3'}); createState(StateUser4, false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit User4', desc: 'Anwesenheit User4'}); createState(StateUser5, false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit User5', desc: 'Anwesenheit User5'}); createState(StateUser6, false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit User6', desc: 'Anwesenheit User6'}); createState(StateUserString , "Niemand", {read: true, write: true, type: 'string', name: 'Anwesenheit Userliste', desc: 'Anwesenheit Userliste'}); createState(StateUserAll , false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit alle User', desc: 'Anwesenheit alle User'}); createState(StateUser1Geht , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen aus FB', desc: 'Zeit Verlassen User1'}); createState(StateUser1Kommt , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen in FB', desc: 'Zeit kommen User1'}); createState(StateUser2Geht , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen aus FB', desc: 'Zeit Verlassen User2'}); createState(StateUser2Kommt , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen in FB', desc: 'Zeit kommen User2'}); createState(StateUser3Geht , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen aus FB', desc: 'Zeit Verlassen User3'}); createState(StateUser3Kommt , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen in FB', desc: 'Zeit kommen User3'}); createState(StateUser4Geht , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen aus FB', desc: 'Zeit Verlassen User4'}); createState(StateUser4Kommt , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen in FB', desc: 'Zeit kommen User4'}); createState(StateUser5Geht , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen aus FB', desc: 'Zeit Verlassen User5'}); createState(StateUser5Kommt , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen in FB', desc: 'Zeit kommen User5'}); createState(StateUser6Geht , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen aus FB', desc: 'Zeit Verlassen User6'}); createState(StateUser6Kommt , CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen in FB', desc: 'Zeit kommen User6'}); createState(StateUserListeJason, CreationTime,{read: true, write: true, type: 'string', name: 'Anwesenheitsstatus Jason Liste', desc: 'UserListe als Jason'}); if (AWSCheckAktiv === true){ createState(IDAWSAktiv,false); } // Variable zum Ueberpruefen des Anwesenheitsstatus var CurrentUser ="User"; var UserName =""; // Funktion synchronisiert Status mit TR064 beim Aufruf des Programmes anwesenheit("ProgramInitialisierung",0); on({id: User1, valNe: 0 }, function(obj) { if (obj.state.ack) { anwesenheit(User1Text,1); } }); // ende on on({id: User2, valNe: 0 }, function(obj) { if (obj.state.ack) { anwesenheit(User2Text,2); } }); // ende on on({id: User3, valNe: 0 }, function(obj) { if (obj.state.ack) { anwesenheit(User3Text,3); } }); // ende on on({id: User4, valNe: 0 }, function(obj) { if (obj.state.ack) { anwesenheit(User4Text,4); } }); // ende on on({id: User5, valNe: 0 }, function(obj) { if (obj.state.ack) { anwesenheit(User5Text,5); } }); // ende on on({id: User6, valNe: 0 }, function(obj) { if (obj.state.ack) { anwesenheit(User6Text,6); } }); // ende on //----------------------------------------------------------------------------------------------------- // Funktion Erstellung der Anwesenheitsliste //----------------------------------------------------------------------------------------------------- function anwesenheit (Ausloeser,UserNummer) { var CurrentUserList = ""; var StatusCurrentUser = false; var StatusAllUser = false; var StatusSetUser = ""; var JasonString =""; log ("Ausloeser: " + Ausloeser,"info"); CreationTime = formatDate(new Date(),"TT.MM.JJJJ SS:mm:ss"); var LogString = ""; var kommttime = ""; var gehttime = ""; var OldStatusAllUser = getState(StateUserAll).val; for (i = 1; i <= anzahluser; i++) { // für 6 User ueberprüfen LogString = " "; CurrentUser = "User" + i; // Username zusammenbauen StatusSetUser = "StateUser" + i; UserName = eval(CurrentUser + "Text"); // username in Klartext StatusCurrentUser = getState(eval(CurrentUser)).val; // Lesen des status des users setState(eval(StatusSetUser),StatusCurrentUser); // Den Status aus TR64 setzen kommttime = getState(eval("StateUser"+i+"Kommt")).val; gehttime = getState(eval("StateUser"+i+"Geht")).val; if (StatusCurrentUser === false) { // User geht und es ist noch jemand da if (i === UserNummer) { setState(eval("StateUser"+i+"Geht"),CreationTime); // Schreibe den Zeitstempel für den user der grerade gegangen ist gehttime = CreationTime; LogString = UserName + ";" + "Geht"; writelog(LogString); } } if (StatusCurrentUser === false && StatusAllUser !== true) { // user geht mmt es ist niemand mehr da StatusAllUser = false; // jetzt wird der Status "niemand mehr da" gesetzt } // Ende Anwesenheit auf fasle gesetzt if (StatusCurrentUser === true ) { // Wenn der user der gerade gecheckt wird anwesend ist CurrentUserList = CurrentUserList + UserName + " "; // user in der userlist aufnehmen StatusAllUser = true; // es ist jemand da setzen if (i === UserNummer) { setState(eval("StateUser"+i+"Kommt"),CreationTime); // Schreibe den Zeitstempel für den user der grerade gekommen ist LogString = UserName + ";"+ "Kommt"; kommttime = CreationTime; writelog(LogString); } // Ende if - das ist der ausslösende User } // Ende Anwesenheit auf true gesetzt log("Anwesenheit " + UserName +" " + StatusCurrentUser,"info"); // jetzt Jason füllen // Jason (Descr1, Wert1, Deesc2, Wert2, Deesc3, Wer3, Deesc4, Wert4, if ( i === 1 ) { // Eroeffnung der Json Tabelle JasonString = "["; } JasonString = JasonString +JasonCreate ("Name", UserName, "Status", StatusCurrentUser, "Kommt", kommttime, "Geht", gehttime); if ( i === anzahluser ) { JasonString = JasonString + "]"; // Schliessen der Json Tabelle } else { JasonString = JasonString + ","; // Schliessen einer einzelnen Zeile - nur die letzte nicht } } // ende for setState(StateUserListeJason, JasonString); if ( StatusAllUser === false ) { CurrentUserList = "Niemand"; // es ist niemand da } setState(StateUserAll,StatusAllUser); // Setzen des All Status setState(StateUserString,CurrentUserList); // userlist speichern log("Anwesenheit genereller Status " + StatusAllUser,"info"); log("Anwesenheitsliste " + CurrentUserList,"info"); // Anwesenheitssimulation ein-oder ausschalten if (AWSCheckAktiv === true){ if (StatusAllUser === true) { setState(IDAWSAktiv,false); } else { if (getState(IDAWSAktiv).val === false) { // prüfe status AWS flag setStateDelayed(IDAWSAktiv,true,AWSZeit*1000); log("EVENT Anwesenheit ist auf false gesetzt - AWSFlag wird aktiviert in " + AWSZeit + " Sekunden","info"); } // endif AWS aktiv } // endif StatusAllUser } // AWSCheckAktiv } // Ende Funktion Anwesenheit //----------------------------------------------------------------------------------------------------- // Erstellung von jason strings zur Tabellendarstellung //----------------------------------------------------------------------------------------------------- function JasonCreate (Desc1, Wert1, Desc2, Wert2, Desc3,Wert3, Desc4,Wert4,anzahlzeilen,aktuellezeile) { var buildzeile = "{"; buildzeile = buildzeile + '"' + Desc1+ '":'; buildzeile = buildzeile + '"' + Wert1 + '"' + ","; buildzeile = buildzeile + '"' + Desc2 + '"' + ":"; buildzeile = buildzeile + '"' + Wert2 + '"' + ","; buildzeile = buildzeile + '"' + Desc3 + '"' + ":"; buildzeile = buildzeile + '"' + Wert3 + '"' + ","; buildzeile = buildzeile + '"' + Desc4 + '"' + ":"; buildzeile = buildzeile + '"' + Wert4 + '"' + "}"; return buildzeile; } // Ende Funktion //----------------------------------------------------------------------------------------------------- // Funktion schreibt einen Logeintrag in das Filesystem und auch in das interne Log-System //----------------------------------------------------------------------------------------------------- function writelog(string) { if (logflag === true) { var logdate = formatDate(new Date(),"TT.MM.JJJJ"); var logtime = formatDate(new Date(),"SS:mm:ss"); if (fs.existsSync(LogPath)) { fs.appendFileSync(LogPath, logdate+" ;"+logtime+" ;"+string + "\n"); // Füge Satz in Datei ein } else { log("Logfile nicht gefunden - wird angelegt"), "info"; var headerLine= "Datum;Uhrzeit;Name;Kommt-Geht"; fs.appendFileSync(LogPath, headerLine + "\n"); // Füge Satz in Datei ein fs.appendFileSync(LogPath, logdate+" ;"+logtime+" ;"+string + "\n"); // Füge Satz in Datei ein } // endif Filecheck } // Ende check on logflag } // Ende Funktion