// 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 // Maximale Anzahl der User mit Anwesenheitsueberwachung // die Deviceliste aus TR064, die ueberwacht werden soll muss hier eingetragen werden var User = { "Datenpunkt 1": "Bezeichnung Endgerät 1", "Datenpunkt 2": "Bezeichnung Endgerät 2"}; // 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 //----------------------------------------------------------------------------------------------------- for (var key in User){ createState(path + 'Userlist.' + User[key], false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit '+User[key], desc: 'Anwesenheit '+User[key]}); createState(path + 'Userlist.KommtGeht.' + User[key]+"Geht", CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen aus FB', desc: 'Zeit Verlassen '+User[key]}); createState(path + 'Userlist.KommtGeht.' + User[key]+"Kommt", CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheit Zeit ausloggen in FB', desc: 'Zeit kommen '+User[key]}); } var CreationTime = " "; var fs = require('fs'); // enable write fuer externes log // Datenpunkte erzeugen createState(path + 'Userlist.' + UserString, "Niemand", {read: true, write: true, type: 'string', name: 'Anwesenheit Userliste', desc: 'Anwesenheit Userliste'}); createState(path + 'Userlist.' + UserAllText, false, {read: true, write: true, type: 'boolean', name: 'Anwesenheit alle User', desc: 'Anwesenheit alle User'}); createState(path + 'Userlist.KommtGeht.' + "AnwesenheitJson", CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheitsstatus Json Liste', desc: 'UserListe als Json'}); createState(path + 'Userlist.KommtGeht.' + "AnwesenheitHTML", CreationTime, {read: true, write: true, type: 'string', name: 'Anwesenheitsstatus HTML String', desc: 'UserListe als HTML String'}); if (AWSCheckAktiv === true){ createState(IDAWSAktiv,false); } // Funktion synchronisiert Status mit TR064 beim Aufruf des Programmes anwesenheit("ProgramInitialisierung",0); for (var key in User){ on({id: StateTR064Device + key, valNe: 0 }, function(obj) { if (obj.state.ack) { anwesenheit('UserKommtGeht',obj.id.split(".").pop(-1)); } }); } //----------------------------------------------------------------------------------------------------- // Funktion Erstellung der Anwesenheitsliste //----------------------------------------------------------------------------------------------------- function anwesenheit (Ausloeser, Userkey) { log ("Ausloeser: " + Ausloeser,"info"); CreationTime = formatDate(new Date(),"TT.MM.JJJJ SS:mm:ss"); var CurrentUserList = ""; var StatusCurrentUser = false; var StatusAllUser = false; var JsonString = "["; var HTMLString = ""; var kommttime = ""; var gehttime = ""; for (var key in User){ StatusCurrentUser = getState(StateTR064Device + key).val; // Lesen des status des users setState(path + 'Userlist.' + User[key], StatusCurrentUser); // Den Status aus TR64 setzen kommttime = getState(path + 'Userlist.KommtGeht.' + User[key]+"Kommt").val; gehttime = getState(path + 'Userlist.KommtGeht.' + User[key]+"Geht").val; if (key === Userkey) { setState(path + 'Userlist.KommtGeht.' + User[key]+(StatusCurrentUser ? "Kommt": "Geht"),CreationTime); // Schreibe den Zeitstempel für den user der grerade gegangen ist if(StatusCurrentUser) kommttime = CreationTime; else gehttime = CreationTime; writelog(User[key] + ";" + (StatusCurrentUser ? "Kommt": "Geht")); } 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 false gesetzt if (StatusCurrentUser) { // Wenn der user der gerade gecheckt wird anwesend ist CurrentUserList += User[key] + " "; // user in der userlist aufnehmen StatusAllUser = true; } // Ende Anwesenheit auf true gesetzt log("Anwesenheit " + User[key] +" " + StatusCurrentUser,"info"); JsonString += JsonCreate ("Name", User[key], "Status", StatusCurrentUser, "Kommt", kommttime, "Geht", gehttime) + ","; HTMLString+=""; HTMLString+="" HTMLString+="" HTMLString+="" HTMLString+="" HTMLString+=""; } // ende for JsonString += "]"; HTMLString += "
NameStatusKommtGeht
"+User[key]+""+(StatusCurrentUser ? '
anwesend
' : '
abwesend
')+"
"+kommttime+""+gehttime+"
"; setState(path + 'Userlist.KommtGeht.' + "AnwesenheitJson", JsonString); setState(path + 'Userlist.KommtGeht.' + "AnwesenheitHTML", HTMLString); if (!StatusAllUser) { CurrentUserList = "Niemand"; // es ist niemand da } setState(path + 'Userlist.' + UserAllText,StatusAllUser); // Setzen des All Status setState(path + 'Userlist.' + UserString,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 json strings zur Tabellendarstellung //----------------------------------------------------------------------------------------------------- function JsonCreate (Desc1, Wert1, Desc2, Wert2, Desc3,Wert3, Desc4,Wert4,anzahlzeilen,aktuellezeile) { var buildzeile = "{"; buildzeile += '"' + Desc1+ '":'; buildzeile += '"' + Wert1 + '"' + ","; buildzeile += '"' + Desc2 + '"' + ":"; buildzeile += '"' + Wert2 + '"' + ","; buildzeile += '"' + Desc3 + '"' + ":"; buildzeile += '"' + Wert3 + '"' + ","; buildzeile += '"' + Desc4 + '"' + ":"; 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