[{"id":"18c0caa.fe73f35","type":"tcp in","server":"client","host":"172.16.130.254","port":"1012","datamode":"stream","datatype":"buffer","newline":" \\n","topic":"FritzBox Telnet Calls","name":"tcp: ### IP ADRESSE FritzBox ANPASSEN ###","base64":false,"x":262,"y":250,"z":"64b98f40.9b467","wires":[["a777682f.588898"]]},{"id":"a9d14156.562ec","type":"comment","name":"FRITZ!box Anrufernummer, RING, Anruferliste (doppelklick für mehr Infos)","info":"To work first you need to activate tcp port 1012 on your Fritz!Box by dialing #96*5*\n\nChange TCP node to point at IP address of router\n\n-----------------------------------------------------------------------------------------\n\nFür jede Call ID werden auf Wunsch (siehe KONFIGURATION) folgende Variablen angelegt:\n\n// [0] callid\t\t\t\t// eindeutige ID des aktuellen Rufes\n// [1] date\t\t\t\t\t// Datum Uhrzeit der Meldung in der Form: yy-mm-tt hh:mm:ss\n// [2] calltype\t\t\t\t// CALL, RING, CONNECT, DISCONNECT \n// [3] callingNumber\t\t// die anrufende Nummer\n// [4] calledNumber\t\t\t// die angerufene Nummer\n// [5] connectedNumber\t\t// Nummer mit der die Verbindung zustande gekommen ist\n// [6] intNumber\t\t\t// interne Nebenstelle\n// [7] line\t\t\t\t\t// Leitung: POTS, SIP0, ...\n// [8] connect\t\t\t\t// verbunden: true/false\n// [9] direction\t\t\t// Richtung: \"gehend\", \"kommend\"\n// [10] duration\t\t\t// Dauer der Verbindung in Sekunden\n// [11] dateStart\t\t\t// Datum Start Verbindungsaufbau\n// [12] dateConnect\t\t\t// Datum Verbindung\n// [13] dateEnd\t\t\t\t// Datum aufgelegt\n// [14] rufdauer\t\t\t//\n\nMit einem DISCONNECT ist ein Ruf/Gespräch vorbei.\nDie DISCONECT Variablen enthalten alle notwendigen Informationen für das Gespräch,\nda diese mit den vorherigen Zuständen ergänzt wurden.\n\n\n","x":332.1588134765625,"y":154.3294439315796,"z":"64b98f40.9b467","wires":[]},{"id":"eb0052b6.14ffb","type":"function","name":"Telnet: parse alle Meldungen","func":"//Name: Parse FritzBox Telnet\n//\n//Requirements:\n//- must be able to reach tcp port 1012 on your FB\n//- activate call monitor on FB by dialing #96*5*\n\ncontext.buff = context.buff || \"\"; // wenn es context.buff nicht gibt, anlegen mit \"\"\ncontext.buff = context.buff + msg.payload; // \n\nmsg.payload = context.buff;\ncontext.buff = \"\";\n\nreturn msg;\n","outputs":1,"valid":true,"x":1606.1668701171875,"y":1336.8333740234375,"z":"64b98f40.9b467","wires":[["fd012eba.02fed","b00b1c6e.4ff4e"]]},{"id":"fd606c94.029f9","type":"inject","name":"10.05.15 20:06:58;CALL;1;11;021147110815;08925006881;POTS;","topic":"","payload":"10.05.15 20:06:58;CALL;1;11;08947110815;021125006881;POTS;","payloadType":"string","repeat":"","crontab":"","once":false,"x":328.0001220703125,"y":1754.8335347175598,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"5fe6f75c.a01908","type":"inject","name":"10.05.15 20:07:00;CONNECT;1;11;08925006881;","topic":"","payload":"10.05.15 20:07:00;CONNECT;1;11;08925006881;","payloadType":"string","repeat":"","crontab":"","once":false,"x":298.0001220703125,"y":1792.83349609375,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"5e8971fb.a1769","type":"inject","name":"10.05.15 20:07:07;DISCONNECT;1;2;","topic":"","payload":"10.05.15 20:07:07;DISCONNECT;1;2;","payloadType":"string","repeat":"","crontab":"","once":false,"x":242.0001220703125,"y":1830.83349609375,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"2f407b7c.d0bf84","type":"comment","name":"gehendes Gespräch Küche mit Verbindung","info":"","x":228.0001220703125,"y":1712.8335347175598,"z":"64b98f40.9b467","wires":[]},{"id":"12dbec10.ed2414","type":"inject","name":"10.05.15 19:06:58;RING;0;08913211545;022143238456;SIP0;","topic":"","payload":"10.05.15 19:06:58;RING;0;08913211545;022143238456;SIP0;","payloadType":"string","repeat":"","crontab":"","once":false,"x":319.0001220703125,"y":1948.83349609375,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"3bcb304a.c434d","type":"comment","name":"kommendes Gespr. 089 zur Sipgate 0201, Nebenstelle 10 geht dran","info":"","x":311.00011444091797,"y":1910.8335347175598,"z":"64b98f40.9b467","wires":[]},{"id":"6ba5b8c5.945a48","type":"comment","name":"### todo ###","info":"Fehler:\n- Test Calls Sekunden tlw. Mehrstellig (>2)\n-\n\nPrio 1:\n- Konfig: soll der Zähler verpasste Anrufe Nachts gelöscht werden?\n- Liste aktive Ring (über ein Array mit RING ID) \n- Liste aktive Gespräche (über ein Array mit CONECTION ID)\n- Email, verpasster Anruf\n- Pushover verpasster Anruf\n- Rufe nach einstellbarer Zeit aufräumen\n- aktuelle Gespräche mit den bisher bekannten Infos darstellen.\n- Konfigpunkte, die einen Neustart/Deployment überleben\n- Anzahl verpasst \"Komfortzähler\" (spätere Gespräche abziehen, d.h. Liste der verpassten Anrufe führen -> JSON)\n- Trigger, um eine Anruferliste zu löschen, Variablen und aktueller Strin\n- html, txt, json parallelausgeben\n- \n\n\nPrio 2:\n- Bluefox Tabellen Widget einbauen, bzw. bedienen\n- Gesprächsdauer in Sekunden aller aktiven Calls\n- verpasste Anrufer mit Zähler, Anrufe gleicher Tag (Anrufer als ARRAY, Löschen per CRON)\n- Komfortliste: erreichte Rufnr in der verpassten Liste nachträglich kennzeichnen\n- ring und aktive Calls nach voreingestellter Zeit bereinigen\n- Anruferliste als zusätzliches Objekt anlegen & eigene JSON Webausgabe\n- Alert bei zu großer Abweichung der Meldungszeit von der Systemzeit -> Log, Nachricht, Variable\n- Gesprächsdauer, wenn 0, dann \" \" statt 0:00\n\nPrio 3:\n- diverse Webservices (Abfragen, Rückmeldungen, z.B. Anruferliste, aktiver Call ,...)\n- Eigene Webseite über Node-Red für den Flow\n- Anruferlisten: alle (OK), geh, kom, verpasst (OK)\n- CDR Kommasepariert, alle Werte\n- CDR Anruferliste ASCII\n- CDR Anruferliste HTML\n- Zähler Connect, getrennt nach gehenden und kommenden Verbindungen\n- Neue HTML Formatierung für die Listen... rechts- / linksbündig, Zeilenfarbe, Linie zwischen den Zeilen, Schriftart, ggf. Templates zur Auswahl\n- kanonisches Format -> Pushover, Email\n- Telefonbuch aus Fritzbox\n- Ortsvorwahlen, Länderkennzahlen\n- Telefonbuch Webanbindung\n- Anruferlisten einzeln löschbar machen\n- Umbau: Anruferlisten immer in beiden Formaten ausgeben (Text und html)\n- Dashboard: Kreisdiagramm, angenommene zu verlorene Anrufe\n- call Generator: Duration nicht mehr zufällig, sondern als Zeit zwischen start und disconnect\n (Achtung: Zeit ist länger, als die Duration von der fb / prüfen, ob die Zeit bis zum auflegen abgezogen werden muss)\n- \n\nTesten\n======\n\n- \n\nFehler beseitigt:\n=================\n- cdr wird nicht mehr geschrieben, obwohl msg im Debug rauskommt\n (msg statt msg.payload wurde ausgegeben)\n\n\nerledigt:\n==========================================\n- Eintrag Anruferliste bei Disconnect\n- CDRs als JSON\n- Aktiver RING j/n\n- Zähler: Anzahl aktiver RINGS\n- Anzeige der aktiven Gespräche (CONNECT)\n- Zähler: Anzahl aktiver Calls\n- Anruferliste verpasst als Liste\n- Anruferliste gesamt als Liste\n- Anruferlisten Länge konfigurierbar machen\n- Anruferliste html mit Überschriftspalte\n- !!! von msg.config auf global.context umbauen\n- Zähler: aktive Rufaufbau\n- String externe Rufnummern auf die eingestellte Länge kürzen\n- Berechnung der Rufdauer\n- Vergleich aktuelle Zeit System Timestamp, Zeit aus Fritzbox und (NTP Internet -> ntp nicht realisiert) - Liste verpasste Anrufe\n- Anruferliste verpasst löscht nicht, wenn mann context.global löscht\n (war kein Fehler: Liste wird gelöscht (JSON), letzter String ist im Widget noch sichtbar)\n- Zähler verpasste Anrufe\n- call generator Variablen umbauen auf: context.global.fbVars.callgenerator.\n- Wert +/- Zeitunterschied konfigurierbar -> Flag\n- letzte aktiver RING\n (über VIS gelöst, letzter RING als Variable bleibt auch nach dem Auflegen bestehen. \n Über ringAktiv true/false kann bestimmt werden, ob man die Variable noch anzeigen will\n Alternativ kann man bei ringAktiv = false die letzte Rufnummer aus der Variable löschen)\n- Anruferliste kommend: Eintrag kommende Rufnumer: undifined (aus dem Call Generator)\n- Anruferliste gehend: Eintrag ext. Rufnummer: \"\"\n (beides ggf. durch Abbruch des Call Generators durch Deploy???)\n- call generator: 3-5 bekannte Anrufernummern, um die geplante Komfortanruferliste zu testen\n- Demoschalter: start Demo Rufe mit parallelen Calls, Begrenzung auf x Anrufen, Möglichkeit zum stoppe\n- \n\n","x":377.33333587646484,"y":189.33331775665283,"z":"64b98f40.9b467","wires":[]},{"id":"4ed4b1d9.b12b5","type":"ioBroker out","name":"[Pfad aus der Konfig].*","topic":"","ack":"true","autoCreate":"true","x":806.6669311523438,"y":920.166748046875,"z":"64b98f40.9b467","wires":[]},{"id":"fd012eba.02fed","type":"function","name":"Meldungen in Objekten umbauen & Topic=Call ID","func":"// es wird für jeden der vier calltype das Objekt mit allen 14 Werten zusammengebaut,\n// damit die Nachricht im Objekt zu jeder Zeit synchron ist\n// Werte, die aus vorherigen Nachrichten übernommen werden, werden aus\n// global.context.fbVars[] impoertiert (fbVars = fritzboxVariablen)\n\nmess \t= msg.payload; \t\t// die geparste Meldung aus dem tcp Stream als Ganzes\nslices \t= mess.split(\";\"); \t// speichert die Felder der Meldung in ein Array mit dem Namen \"slices\"\n\n// die Call ID wird als erstes ausgelesen, da diese für die eindeutige Zuordnung\n// der Werte zum richtigen Call benötigt wird (es kann mehrere Calls parallel geben)\nmsg.callid\t\t= slices[2]; // an dritter Stelle steht die CallID (Zurordnung zum aktuellen Ruf)\n\nvar callid\t = msg.callid; // für das Array global.context.fbVars.callid[callid]\n\n\ncontext.global.fbVars = context.global.fbVars || {}; // wenn es das Objekt context.global.fbVars noch nicht gibt, wird dieses hier leer angelegt\n// Umbau der Variablen in ein Array\ncontext.global.fbVars.callid = context.global.fbVars.callid || [];\ncontext.global.fbVars.callid[msg.callid] = context.global.fbVars.callid[msg.callid] || {};\n\n\nfunction fritzboxZeitEpoche(datum) {\nvar jahr = \"20\" + datum.substring(6,8);\nvar monat = datum.substring(3,5);\nvar monatJS = parseInt(datum.substring(3,5))-1;\nvar tag = datum.substring(0,2);\nvar stunde = datum.substring(9,11);\nvar minute = datum.substring(12,14);\nvar sekunde = datum.substring(15,17);\n\nvar zeit = new Date(jahr,monatJS,tag,stunde,minute,sekunde);\nvar epoche = Date.parse(zeit) / 1000; // Zeit aus der Meldung in Epoche\n \nreturn epoche;\n} \n\n\n// [0]callid\ncontext.global.fbVars.callid[callid].callid = msg.callid;\n// [1]date\nmsg.date \t\t= slices[0]; // an erster Stelle steht immer das Datum in der Form: 10.05.15 20:06:58\ncontext.global.fbVars.callid[callid].date = msg.date;\n\n// [2]calltype\nmsg.calltype \t= slices[1]; // an zweiter Stelle steht der Ruftyp (CALL, RING, CONNECT, DISCONECT)\ncontext.global.fbVars.callid[callid].calltype = msg.calltype;\n\n\n\n// die restlichen Stellen der Message sind je nach calltype mit unterschiedlichlichen Variablen belegt. \n\n\n\n// ######## RING ######## (kommendes Gespräch = Ruf)\n\nif (msg.calltype == \"RING\") {\n\n// [3]callingNumber\n\tif (slices[3] === \"\") { // keine Rufnummer -> \"Nummer unterdrückt\"\n\t\tmsg.callingNumber = context.global.fbVars.config.rnr_unbekannt;\n\t\t} else {\n\t\tmsg.callingNumber = slices[3];\n\t\t}\n\tcontext.global.fbVars.callid[callid].callingNumber = msg.callingNumber;\n\n\t\n// [4]calledNumber\n\tmsg.calledNumber = slices[4];\n\tcontext.global.fbVars.callid[callid].calledNumber = msg.calledNumber;\n\n\n// [5]connectedNumber\n\tmsg.connectedNumber = \"\"; // im Zustand Call gibt es keine Connected, diese wird hier gelöscht\n\tcontext.global.fbVars.callid[callid].connectedNumber = msg.connectedNumber;\n\n\n// [6]intNumber\n\tmsg.intNumber = \"\";\n\tcontext.global.fbVars.callid[callid].intNumber = msg.intNumber;\n\n\n// [7]line\n\tmsg.line = slices[5];\n\tcontext.global.fbVars.callid[callid].line = msg.line;\n\n\n// [8]connect (Info anhand der Ruftyps selbst erstellt)\n\tmsg.connect = false;\n\tcontext.global.fbVars.callid[callid].connect = msg.connect;\n\n// [9]direction (Info anhand der Ruftyps selbst erstellt)\n\tmsg.direction = \"kommend\";\n\tcontext.global.fbVars.callid[callid].direction = msg.direction;\n\n\n// [10]duration\n\tmsg.duration = 0;\n\tcontext.global.fbVars.callid[callid].duration = msg.duration;\n\n\n// [11]dateStart\n\tmsg.dateStart = msg.date;\n\tcontext.global.fbVars.callid[callid].dateStart = msg.dateStart;\n\n\n// [12]dateConnect\n\tmsg.dateConnect = \"\";\n\tcontext.global.fbVars.callid[callid].dateConnect = msg.dateConnect;\n\n\n// [13]dateEnd\n\tmsg.dateEnd = \"\";\n\tcontext.global.fbVars.callid[callid].dateEnd = msg.dateEnd;\n\n\n// [14]rufdauer\n\tmsg.rufdauer = \"\";\n\tcontext.global.fbVars.callid[callid].rufdauer = msg.rufdauer;\n\n// [15]deltaZeitMeldungSystemSek\n var tst = fritzboxZeitEpoche(msg.date);\n var now = new Date(); \n now = Date.parse(now) / 1000;// aktuelle Zeit in Epoche\n msg.deltaZeitMeldungSystemSek = tst - now;\n\tcontext.global.fbVars.callid[callid].deltaZeitMeldungSystemSek = msg.deltaZeitMeldungSystemSek;\n// [16]dateEpoche\n msg.dateEpoche = tst;\n\tcontext.global.fbVars.callid[callid].dateEpoche = msg.dateEpoche;\n\n// [17]epocheNow - Systemzeit in 1.000stel Sekunden\n var now = new Date(); \n now = Date.parse(now) // aktuelle Zeit in Epoche\n msg.epocheNow = now;\n\tcontext.global.fbVars.callid[callid].epocheNow = msg.epocheNow;\n\t}\n\n\n\n\n\n// ######## CALL ######## (gehendes Gespräch)\n\nif (msg.calltype == \"CALL\") {\n\n// [3]callingNumber\n\tif (slices[4] === \"\") { // keine Rufnummer -> \"Nummer unterdrückt\"\n\t\tmsg.callingNumber = context.global.fbVars.config.rnr_unbekannt;\n\t\t} else {\n\t\tmsg.callingNumber = slices[4];\n\t\t}\n\tcontext.global.fbVars.callid[callid].callingNumber = msg.callingNumber;\n\n\n// [4]calledNumber\n\tmsg.calledNumber = slices[5];\n\tcontext.global.fbVars.callid[callid].calledNumber = msg.calledNumber;\n\n// [5]connectedNumber\n\tmsg.connectedNumber = \"\";\n\tcontext.global.fbVars.callid[callid].connectedNumber = msg.connectedNumber;\n\n// [6]intNumber\n\tmsg.intNumber = slices[3];\n\tcontext.global.fbVars.callid[callid].intNumber = msg.intNumber;\n\n// [7]line\n\tmsg.line = slices[6];\n\tcontext.global.fbVars.callid[callid].line = msg.line;\n\n\n// [8]connect (Info anhand der Ruftyps selbst erstellt)\n\tmsg.connect = false;\n\tcontext.global.fbVars.callid[callid].connect = msg.connect;\n\n// [9]direction (Info anhand der Ruftyps selbst erstellt)\n\tmsg.direction = \"gehend\";\t\n\tcontext.global.fbVars.callid[callid].direction = msg.direction;\n\n// [10]duration\n\tmsg.duration = 0;\n\tcontext.global.fbVars.callid[callid].duration = msg.duration;\n\n// [11]dateStart\n\tmsg.dateStart = msg.date;\n\tcontext.global.fbVars.callid[callid].dateStart = msg.dateStart;\n\n// [12]dateConnect\n\tmsg.dateConnect = \"\";\n\tcontext.global.fbVars.callid[callid].dateConnect = msg.dateConnect;\n\n// [13]dateEnd\n\tmsg.dateEnd = \"\";\n\tcontext.global.fbVars.callid[callid].dateEnd = msg.dateEnd;\n\n// [14]rufdauer\n\tmsg.rufdauer = \"\";\n\tcontext.global.fbVars.callid[callid].rufdauer = msg.rufdauer;\n// [15]deltaZeitMeldungSystemSek\n var tst = fritzboxZeitEpoche(msg.date);\n var now = new Date(); \n now = Date.parse(now) / 1000;// aktuelle Zeit in Epoche\n msg.deltaZeitMeldungSystemSek = tst - now;\n\tcontext.global.fbVars.callid[callid].deltaZeitMeldungSystemSek = msg.deltaZeitMeldungSystemSek;\n// [16]dateEpoche\n msg.dateEpoche = tst;\n\tcontext.global.fbVars.callid[callid].dateEpoche = msg.dateEpoche;\n// [17]epocheNow - Systemzeit in 1.000stel Sekunden\n var now = new Date(); \n now = Date.parse(now) // aktuelle Zeit in Epoche\n msg.epocheNow = now;\n\tcontext.global.fbVars.callid[callid].epocheNow = msg.epocheNow;\n\t}\n\n\n\n\n// ######## CONNECT ######## (verbundens Gespräch)\n\nif (msg.calltype == \"CONNECT\") {\n\n// [3]callingNumber\n\tmsg.callingNumber = context.global.fbVars.callid[callid].callingNumber;\n// [4]calledNumber\n\tmsg.calledNumber = context.global.fbVars.callid[callid].calledNumber;\n// [5]connectedNumber\n\tif (slices[4] === \"\") {\n\t\tmsg.connectedNumber = context.global.fbVars.config.rnr_unbekannt;\n\t\t} else {\n\t\tmsg.connectedNumber = slices[4];\n\t\t}\n\tcontext.global.fbVars.callid[callid].connectedNumber = msg.connectedNumber;\n// [6]intNumber\n\tmsg.intNumber = slices[3];\n\tcontext.global.fbVars.callid[callid].intNumber = msg.intNumber;\n// [7]line\n\tmsg.line = context.global.fbVars.callid[callid].line;\n// [8]connect (Info anhand der Ruftyps selbst erstellt)\n\tmsg.connect = true;\n\tcontext.global.fbVars.callid[callid].connect = msg.connect;\n// [9]direction (Info anhand der Ruftyps selbst erstellt)\n\tmsg.direction = context.global.fbVars.callid[callid].direction;\n// [10]duration\n\tmsg.duration = context.global.fbVars.callid[callid].duration;\n// [11]dateStart\n\tmsg.dateStart = context.global.fbVars.callid[callid].dateStart;\n// [12]dateConnect\n\tmsg.dateConnect = msg.date;\n\tcontext.global.fbVars.callid[callid].dateConnect = msg.dateConnect;\n// [13]dateEnd\n\tmsg.dateEnd = context.global.fbVars.callid[callid].dateEnd;\n// [14]rufdauer\n var zeitConnectEpoche = fritzboxZeitEpoche(msg.date);\n var zeitStartEpoche = fritzboxZeitEpoche(msg.dateStart);\n\tmsg.rufdauer = zeitConnectEpoche - zeitStartEpoche; \n\tcontext.global.fbVars.callid[callid].rufdauer = msg.rufdauer;\n// [15]deltaZeitMeldungSystemSek\n var tst = fritzboxZeitEpoche(msg.date);\n var now = new Date(); \n now = Date.parse(now) / 1000;// aktuelle Zeit in Epoche\n msg.deltaZeitMeldungSystemSek = tst - now;\n\tcontext.global.fbVars.callid[callid].deltaZeitMeldungSystemSek = msg.deltaZeitMeldungSystemSek;\n// [16]dateEpoche\n msg.dateEpoche = tst;\n\tcontext.global.fbVars.callid[callid].dateEpoche = msg.dateEpoche;\n// [17]epocheNow - Systemzeit in 1.000stel Sekunden\n var now = new Date(); \n now = Date.parse(now) // aktuelle Zeit in Epoche\n msg.epocheNow = now;\n\tcontext.global.fbVars.callid[callid].epocheNow = msg.epocheNow;\n\t}\n\n\n\n// ######## DISCONNECT ######## (beendetes Gespräch / Gesprächsversuch)\n\n// wenn der Flow während eines aktiven Gesprächs gestartet wird,\n// sind diverse Zustände nicht bekannt. Diese werden hier abgefangen.\n\nif (msg.calltype == \"DISCONNECT\") {\n// [3]callingNumber\n\tmsg.callingNumber = context.global.fbVars.callid[callid].callingNumber;\n\tif (msg.callingNumber == null) { msg.callingNumber = \"????????????\"; }\n// [4]calledNumber\n\tmsg.calledNumber = context.global.fbVars.callid[callid].calledNumber;\n\tif (msg.calledNumber == null) {\tmsg.callingNumber = \"????????????\";\t}\n// [5]connectedNumber\n\tmsg.connectedNumber = context.global.fbVars.callid[callid].connectedNumber;\n\tif (msg.connectedNumber == null) { msg.connectedNumber = \"????????????\"; }\n// [6]intNumber\n\tmsg.intNumber = context.global.fbVars.callid[callid].intNumber;\n\tif (msg.intNumber == null) { msg.intNumber = \"??\"; }\n// [7]line\n\tmsg.line = context.global.fbVars.callid[callid].line;\n\tif (msg.line == null) { msg.line = \"????\"; }\n// [8]connect (Info anhand der Ruftyps selbst erstellt)\n\tmsg.connect = context.global.fbVars.callid[callid].connect;\n\tif (msg.connect == null) { msg.connect = true }\t\t\t\t\t// undefinierter Zustand, wenn der Flow im aktiven Gespräch gestartet wird (Annahme: Gespräch, da wahrscheinlicher (dauert in der Regel länger als ein Rufzustand))\n// [9]direction (Info anhand der Ruftyps selbst erstellt)\n\tmsg.direction = context.global.fbVars.callid[callid].direction;\n\tif (msg.direction == null) { msg.direction = \"??????\" }\t\t\t// undefinierter Zustand (gehend oder kommend nicht bekannt, wenn der Flow im aktiven Gespräch gestartet wird)\n// [10]duration\n\tmsg.duration = slices[3];\n\tcontext.global.fbVars.callid[callid].duration = msg.duration;\n// [11]dateStart\n\tmsg.dateStart = context.global.fbVars.callid[callid].dateStart;\n\tif (msg.dateStart == null) { msg.dateStart = msg.date; }\n// [12]dateConnect\n\tmsg.dateConnect = context.global.fbVars.callid[callid].dateConnect;\n\tif (msg.dateConnect == null) { msg.dateConnect = msg.date; }\n// [13]dateEnd\n\tmsg.dateEnd = msg.date;\n\tcontext.global.fbVars.callid[callid].dateEnd = msg.dateEnd;\n// [14]rufdauer\n\tmsg.rufdauer = context.global.fbVars.callid[callid].rufdauer;\n\tif (msg.rufdauer == null) { msg.rufdauer = 0; }\n// [15]deltaZeitMeldungSystemSek\n var tst = fritzboxZeitEpoche(msg.date);\n var now = new Date(); \n now = Date.parse(now) / 1000;// aktuelle Zeit in Epoche\n msg.deltaZeitMeldungSystemSek = tst - now;\n// [16]dateEpoche\n msg.dateEpoche = tst;\n\tcontext.global.fbVars.callid[callid].dateEpoche = msg.dateEpoche;\n// [17]epocheNow - Systemzeit in 1.000stel Sekunden\n var now = new Date(); \n now = Date.parse(now) // aktuelle Zeit in Epoche\n msg.epocheNow = now;\n\tcontext.global.fbVars.callid[callid].epocheNow = msg.epocheNow;\n\t}\n\n\n\n\n// ###########################\n\n//Variablen Call ID\n// msg.topic = msg.topic + \"callid.\" + msg.callid +\".\";\n\nmsg.config = {};\nmsg.config.callid_anlegen = context.global.fbVars.config.callid_anlegen;\nmsg.config.cdr_to_disk = context.global.fbVars.config.cdr_to_disk;\n\nif (msg.callid) return msg; // wenn Callid != null, dann weiter","outputs":1,"valid":true,"x":1801.000244140625,"y":1679.5000977516174,"z":"64b98f40.9b467","wires":[["c6b6e5b8.394918","2de38359.d21c7c","e8902f7.f176fd","fe485bb3.01b7a8","c92ce696.36d318"]]},{"id":"fc1188c1.03ee78","type":"function","name":"### KONFIGURATION ###","func":"context.global.fbVars = context.global.fbVars || {}; // wenn es das Objekt context.global.fbVars noch nicht gibt, wird dieses hier leer angelegt\ncontext.global.fbVars.config = {\n\n// ###### KONFIGURATION START ######\n\n \ttopic_prefix: \"node-red.0.fritzbox.\",\t// Pfad unter dem die Daten in ioBroker gespeichert werden sollen\n\tcdr_to_disk:true,\t\t\t\t\t\t// (false/true default:false) schreib CDRs (Call Detail Records auf Disk), gespeichert unter: /opt/iobroker/fritzbox-cdr.txt\n\n// rnr_unbekannt: \"rnr unbekannt\", \t\t// Text, wenn die Rufnummer unbekannt/unterdrückt ist (auf die Länge achten)\n rnr_unbekannt: \"### ? ###\",\t\t \t\t// Text, wenn die Rufnummer unbekannt/unterdrückt ist (auf die Länge achten)\n \n \tlänge_ext_rnr: 15,\t\t\t\t\t\t// (default: 15) Anzeige: max. Länge externe Rufnummern (der Rest wird abgeschnitten)\n \n // Formatierung der Anruferliste per html (Festbreitenschrift und Farbe)\n html:true,\t\t\t\t\t\t\t\t// (true/false, default:true) Anruferlisten in html formatieren\n fontsize:\"14px\",\t\t\t\t\t\t// (default:\"14px\") Schriftgröße\n\n deltaZeit:5,\t \t\t\t\t // (default:10) Zeit Abweichung in Sekunden zwischen Systemzeit und der Zeit der Meldung aus der Fritzbox \n\n infoPushover:false,\t \t\t\t\t// (default:false) Verpasster Anruf per Pushover\n infoEmail:false, \t\t\t\t// (default:false) Verpasster Anruf per Email\n\n\t// welche Daten sollen in den Anruferlisten angezeigt werden\n\t// alle Anruferlisten:\n anz_datum:true,\t\t\t\t\t\t\t// true: Spalte Datum im Format\t\tmm.dd.\t(Format kann im Node einfach geändert werden)\n anz_uhrzeit:true,\t\t\t\t\t\t// true: Spalte Uhrzeit im Format\thh:dmm\t(Format kann im Node einfach geändert werden)\n\n\t// Ruflisten Anzeige Spalten (nur in der Gesamtliste:)\n\tanz_int_rnr:true,\t\t\t\t\t\t// true: Spalte für die interne Rufnummer beim verbundenen Gespräch\n\tanz_eigenes_amt:true,\t\t\t\t\t// true: Spalte für die eigenen verwendeten Amtsrufnummer\n\tanz_line:true,\t\t\t\t\t\t\t// true: Spalte für die Art des Amts (POTS, SIP0, usw.)\n\tanz_duration:true, // true: Spalte für die Dauer des Gespräches in mm:ss\n \n anz_anzahl_zeilen:10, // (default: 10) Anzahl Zeilen in den Anruferlisten\n\n anz_kopfzeile:true // (default: true) Kopfzeile für die Anruferliste ausgeben\n};\n\n\n\n\n\n// ###### KONFIGURATION ENDE ######\n\nreturn msg;\n","outputs":1,"valid":true,"x":272.8332824707031,"y":317.16669178009033,"z":"64b98f40.9b467","wires":[["a777682f.588898","4209cdc4.bdf634"]]},{"id":"c6b6e5b8.394918","type":"switch","name":"(1) RING (2) CALL (3) CONNECT (4) DISCONNECT","property":"calltype","rules":[{"t":"eq","v":"RING"},{"t":"eq","v":"CALL"},{"t":"eq","v":"CONNECT"},{"t":"eq","v":"DISCONNECT"}],"checkall":"true","outputs":4,"x":1976.5237731933594,"y":1598.6431260108948,"z":"64b98f40.9b467","wires":[[],[],[],["6b0f2598.94f0dc","b2710ffd.4d8ef"]]},{"id":"6b0f2598.94f0dc","type":"function","name":"DISCONNECT: Werte für Rufliste (1) alle, (2) verpasst","func":"// [0] callid\t\t\t\t// eindeutige ID des aktuellen Rufes\n// [1] date\t\t\t\t\t// Datum Uhrzeit der Meldung in der Form: yy-mm-tt hh:mm:ss\n// [2] calltype\t\t\t\t// CALL, RING, CONNECT, DISCONNECT \n// [3] callingNumber\t\t// die anrufende Nummer\n// [4] calledNumber\t\t\t// die angerufene Nummer\n// [5] connectedNumber\t\t// Nummer mit der die Verbindung zustande gekommen ist\n// [6] intNumber\t\t\t// interne Nebenstelle\n// [7] line\t\t\t\t\t// Leitung: POTS, SIP0, ...\n// [8] connect\t\t\t\t// verbunden: true/false\n// [9] direction\t\t\t// Richtung: \"gehend\", \"kommend\"\n// [10] duration\t\t\t// Dauer der Verbindung in Sekunden\n// [11] dateStart\t\t\t// Datum Start Verbindungsaufbau\n// [12] dateConnect\t\t\t// Datum Verbindung\n// [13] dateEnd\t\t\t\t// Datum aufgelegt\n// [14] rufdauer\t\t\t// \n\n\n\nfunction fill(n) {\n\tvar empty_chars = \"\";\n\tfor(var i = 0; i < n; ++i)\n\tempty_chars += \" \";\n\treturn(empty_chars);\n\t}\n\n\nfunction fill0(n) {\n\tvar empty_chars = \"\";\n\tfor(var i = 0; i < n; ++i)\n\tempty_chars += \"0\";\n\treturn(empty_chars);\n\t}\n\n\nvar anruferliste = \"\";\nvar anruferlisteKopf = \"\";\nvar verpasst =\"\";\nvar verpasstKopf =\"\";\n\nvar externeNummer = \"\";\nvar externeNummerKopf = \"ext. Rufnr.\";\nvar verbindungssymbol = \"\";\nvar eigenesAmt = \"\";\nvar eigenesAmtKopf = \"Eigenes Amt\";\nvar line = msg.line;\nvar lineKopf = \"Ltg.\";\nvar intNummer = msg.intNumber;\nvar intNummerKopf = \"Nbst\";\n\nvar duration = \"\";\nvar durationKopf = \"Dauer\"\n\nvar durationMin = Math.floor(parseInt(msg.duration) / 60);\nvar durationSek = parseInt(msg.duration) % 60;\n\n\n// css\nif (context.global.fbVars.config.html === true) {\n//\tvar cssstart = '';\n\tvar cssstart = '';\n\tvar cssend = \"\";\n\tvar cssba = \"\";\n\tvar cssbe = \"\";\n\tvar cssrea = '';\n\tvar cssgra = '';\n\t} else {\n\tvar cssstart = \"\";\n\tvar cssend = \"\";\n\tvar cssba = \"\";\n\tvar cssbe = \"\";\n\tvar cssrea = \"\";\n\tvar cssgra = \"\";\n\t}\n\t\n\n\tvar zeitstempel = msg.dateStart; // Zeit des RING\n\n\tvar jahr = zeitstempel.substring(6,8);\n\tvar monat = zeitstempel.substring(3,5);\n\tvar tag = zeitstempel.substring(0,2);\n\tvar stunde = zeitstempel.substring(9,11);\n\tvar minute = zeitstempel.substring(12,14);\n\tvar sekunde = zeitstempel.substring(15,17);\n\n\t//var uhrzeit = stunde + \":\" + minute + \":\"+ sekunde + \" \";\n\tvar uhrzeit = stunde + \":\" + minute + \" \";\n var uhrzeitKopf = \"Zeit  \";\n\n\t//var datum = tag + \".\" + monat + \".20\" + jahr + \" \";\n\t//var datum = tag + \".\" + monat + \".\" + jahr + \" \";\n\tvar datum = tag + \".\" + monat + \". \";\n var datumKopf = \"Tag    \";\n// duration = durationMin + \":\" + fill(2 - durationSek.length);\n\nduration = durationMin + \":\" + fill0(2- durationSek.toString().length) + durationSek;\nduration = fill(5 - duration.length) + duration;\n\n\n\n// Felder rausfiltern, die laut Konfig nicht angezeigt werden sollen\n\nif (context.global.fbVars.config.anz_datum === true) {\n\t} else {\n\tdatum = \"\";\n\tdatumKopf = \"\";\n\t}\n\nif (context.global.fbVars.config.anz_uhrzeit === true) {\n\t} else {\n\tuhrzeit = \"\";\n\tuhrzeitKopf = \"\";\n\t}\n\nif (context.global.fbVars.config.anz_duration === true) {\n\t} else {\n\tduration = \"\";\n\tdurationKopf = \"\";\n\t}\n\n\n\n\n// externe Rufnummer & Verbindungssymbol\nif (msg.direction == \"gehend\") {\n\t\teigenesAmt = msg.callingNumber;\n\tif (msg.connect === true) {\n\t\texterneNummer = msg.connectedNumber;\n\t\tverbindungssymbol = cssgra + \"<<- \" + cssend;\n\t\t} else {\n\t\texterneNummer = msg.calledNumber;\n\t\tverbindungssymbol = cssrea + \"X<- \" + cssend;\n\t\t}\n\t} else if (msg.direction == \"kommend\"){\n\t\teigenesAmt = msg.calledNumber;\n\tif (msg.connect === true) {\n\t\texterneNummer = msg.connectedNumber;\n\t\tverbindungssymbol = cssgra + \" ->>\" + cssend;\n\t\t} else {\n\t\texterneNummer = msg.callingNumber;\n\t\tverbindungssymbol = cssrea + \" ->X\" + cssend;\n\t\t}\n\t} else { // Flow startet im aktivem Gespräch: Richtung gehend oder kommend unbekannt\n\t\n\texterneNummer = msg.connectedNumber; \t// Flow startet in einem aktiven Call: Anrufernummer -> unbekannt, oder, wenn im Connect eingestiegen wurde: connectedNumber\n\tverbindungssymbol = \"???? \";\t \t// Flow startet in einem aktiven Call: Symbol \"????\", ohne Farbe\n\teigenesAmt = msg.callingNumber; \t\t// Flow startet in einem aktiven Call: eigenes Amt -> unbekannt\n\t}\n\n\n// sollte die externen Rufnummern insgesamt länger sein, werden diese auf die max. gewünschte Länge gekürzt\nexterneNummer = externeNummer.substring(0,context.global.fbVars.config.länge_ext_rnr);\nexterneNummerKopf = externeNummerKopf.substring(0,context.global.fbVars.config.länge_ext_rnr);\neigenesAmtKopf = eigenesAmtKopf.substring(0,context.global.fbVars.config.länge_ext_rnr);\n\n\n// Amtsrufnummern (externe und eigene) auf gewünschte Länge mit Leerzeichen auffüllen \nexterneNummer = externeNummer + fill(context.global.fbVars.config.länge_ext_rnr - externeNummer.length);\nexterneNummerKopf = externeNummerKopf + fill(context.global.fbVars.config.länge_ext_rnr - externeNummerKopf.length);\nintNummer = fill(5 - intNummer.length) + intNummer;\nintNummerKopf = fill(5 - intNummerKopf.length) + intNummerKopf;\neigenesAmt = eigenesAmt + fill(context.global.fbVars.config.länge_ext_rnr - eigenesAmt.length);\neigenesAmtKopf = eigenesAmtKopf + fill(context.global.fbVars.config.länge_ext_rnr - eigenesAmtKopf.length);\nline = line + fill(5 - intNummer.length)+ \" \";\nlineKopf = lineKopf + fill(5 - intNummer.length)+ \" \";\n\n\n\n// Felder rausfiltern, die laut Konfig nicht angezeigt werden sollen\n\t\nif (context.global.fbVars.config.anz_int_rnr === true) {\n\t} else {\n\tintNummer =\"\";\n\tintNummerKopf =\"\";\n\t}\n\nif (context.global.fbVars.config.anz_eigenes_amt === true) {\n\t} else {\n\teigenesAmt =\"\";\n\teigenesAmtKopf =\"\";\n\t}\n\nif (context.global.fbVars.config.anz_line === true) {\n\t} else {\n\tline =\"\";\n\tlineKopf = \"\";\n\t}\n\n\n\n// Ausgabe alle Arten von Anrufen\n// =================================\nanruferliste = cssstart + datum + uhrzeit + externeNummer + cssba + verbindungssymbol + cssbe \n\t\t\t + intNummer + \" \" + eigenesAmt + line + duration + cssend;\n\nanruferlisteKopf = cssstart + cssba + datumKopf + uhrzeitKopf + externeNummerKopf + \"g<>k\" \n\t\t\t + intNummerKopf + \" \" + eigenesAmtKopf + lineKopf + durationKopf + cssbe + cssend;\n\n\n// Ausgabe der verpassten kommenden Anrufe\n// =================================\nif (msg.direction == \"kommend\") {\n if (msg.connect == false) {\n\t verpasstKopf = cssstart + cssba + datumKopf + uhrzeitKopf + \" \" + externeNummerKopf + cssbe + cssend;\n\t verpasst = cssstart + datum + uhrzeit + \" \" + externeNummer + cssend;\n } else {\n\t verpasst = \"nichts\";\n\t }\n\t} else {\n verpasst = \"nichts\";\n }\n\n\n\nvar msg1 = {};\nvar msg2 = {};\n\nmsg1.topic = msg.topic + \"ruflisten.alleLetzterEintrag\";\nmsg2.topic = msg.topic + \"ruflisten.verpasstLetzterEintrag\";\n\nmsg1.payload = anruferliste;\nmsg2.payload = verpasst;\n\nmsg1.anruferlisteKopf = anruferlisteKopf;\nmsg2.verpasstKopf = verpasstKopf;\n\nreturn [msg1,msg2];\n","outputs":"2","valid":true,"x":2401.76220703125,"y":1613.619384765625,"z":"64b98f40.9b467","wires":[["511d6cee.aee294","7432024.f8bcdfc","def44c2d.210bb"],["58b35777.a74ca8"]]},{"id":"511d6cee.aee294","type":"debug","name":"Eintrag Anruferliste gesamt","active":false,"console":"false","complete":"payload","x":2478.4163970947266,"y":1701.8336744308472,"z":"64b98f40.9b467","wires":[]},{"id":"e5eaa2d3.1a156","type":"inject","name":"10.05.15 19:07:00;CONNECT;0;10;08913211545;","topic":"","payload":"10.05.15 19:07:00;CONNECT;0;10;08913211545;","payloadType":"string","repeat":"","crontab":"","once":false,"x":302.3334274291992,"y":1987.1667866706848,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"dcdcb5fd.232348","type":"inject","name":"10.05.15 19:07:07;DISCONNECT;0;42;","topic":"","payload":"10.05.15 19:07:07;DISCONNECT;0;42;","payloadType":"string","repeat":"","crontab":"","once":false,"x":248.33340454101562,"y":2023.83349609375,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"4dc8509e.b237b","type":"debug","name":"Eintrag Anruferliste verpasst","active":false,"console":"false","complete":"payload","x":2481.416534423828,"y":1734.500179976225,"z":"64b98f40.9b467","wires":[]},{"id":"58b35777.a74ca8","type":"switch","name":"(1) verpasst (2) nichts verpasst","property":"payload","rules":[{"t":"neq","v":"nichts"},{"t":"else"}],"checkall":"false","outputs":2,"x":2482.1190338134766,"y":1661.9526929855347,"z":"64b98f40.9b467","wires":[["4dc8509e.b237b","7432024.f8bcdfc","fed2f25d.012d1","137130f8.ec8ecf","6045cc63.9fba34"],[]]},{"id":"2450fd49.dbaf02","type":"inject","name":"10.05.15 21:06:58;RING;2;;022143238456;SIP0;","topic":"","payload":"10.05.15 21:06:58;RING;2;;022143238456;SIP0;","payloadType":"string","repeat":"","crontab":"","once":false,"x":264.66673278808594,"y":2123.000244140625,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"92c72447.6d38d8","type":"comment","name":"kommendes Gespr. Nummer unterdrückt zur Sipgate 0221","info":"","x":267.66674041748047,"y":2090.000282764435,"z":"64b98f40.9b467","wires":[]},{"id":"3ef37477.c10c8c","type":"comment","name":"Version 0.3.3 - Versionsinfos","info":"0.3.3\n- Programmstruktur im Kern aufgeräumt\n- JSON Arrays für anstehende Anrufe, Gespräche und gehende Rufe aufgebaut\n (Vorbereitung für diverse Listen)\n- alle CallID ioBroker Objekte entfernt (wurden für die FUnktion nicht benötigt)\n\n0.3.2\n- Demomodus: 100 Anrufe, bis zu drei parallel, werden zufällig abgearbeitet\n- Zähler für verpasste Anrufe hinzugefügt\n\n0.3.1\n- Call Generator für Demo und Test hinzugefügt\n\n0.3.0\n- Konfiguration von msg.config auf context.global.fbVars.config umgestellt\n- http://[eingeneIP]:1880/fritzbox/vars -> Ausgabe des JSON Objekts mit den aktuellen Einstellungen\n- \n\n0.2.0\n- Interne Variablen auf Array nach Call ID umgestellt\n- Solange RING aktiv: Variable RING = true (zur Anzeige in VIS)\n- Anruferlisten für gesamt und verpasst (Format Text oder html, konfigurierbar)\n \n\n0.1.0\n- Werte für Anruferliste gesamt und verpasst sind konfigurierbar und werden ausgegeben\n (Formatierung wahlweise in HTML oder Text // Spalten in der Konfiguration auswählbar)\n- die wichtigsten Parameter können unter KONFIGURATION eingestellt werden\n- Variablen in ioBroker können für alle Call IDs angelegt werden\n Default: es werden keine Variablen angelegt (siehe KONFIGURATION)\n- CDRs to disk (konfigurierbar)\n\n ","x":191.33331298828125,"y":191.3333330154419,"z":"64b98f40.9b467","wires":[]},{"id":"a324eaf6.5cdb18","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1930.3335571289062,"y":1373.5000977516174,"z":"64b98f40.9b467","wires":[]},{"id":"68ac9b14.975364","type":"function","name":"Meldung aufräumen -> CDR JSON","func":"var callid = msg.callid;\n\nmsg = {};\nmsg.topic = \"cdrJSON\";\n\nmsg.payload = context.global.fbVars.callid[callid]; // nur die aktuelle Call ID als JSON ausgeben\n\nreturn msg;","outputs":1,"valid":true,"x":3047.333251953125,"y":1117.5001220703125,"z":"64b98f40.9b467","wires":[["b55ecf0.f4aa13","105a12a2.efa5ed","395285ea.c6ad7a"]]},{"id":"b55ecf0.f4aa13","type":"debug","name":"msg -> CDR (call detail Record) JSON","active":false,"console":"false","complete":"true","x":2669.333297729492,"y":1152.500108242035,"z":"64b98f40.9b467","wires":[]},{"id":"395285ea.c6ad7a","type":"file","name":"","filename":"/opt/iobroker/fritzbox-cdr-json.txt","appendNewline":true,"overwriteFile":"false","x":3060.666748046875,"y":1164.1668701171875,"z":"64b98f40.9b467","wires":[]},{"id":"105a12a2.efa5ed","type":"debug","name":"","active":false,"console":"false","complete":"true","x":3094.0000737508135,"y":1057.5001122156777,"z":"64b98f40.9b467","wires":[]},{"id":"b2710ffd.4d8ef","type":"switch","name":"Konfiguration: CDRs auf Disk schreiben (j/n)","property":"config.cdr_to_disk","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":2684.0000076293945,"y":1115.8334321975708,"z":"64b98f40.9b467","wires":[["68ac9b14.975364","20d4d674.df2b2a"]]},{"id":"970de948.68f218","type":"file","name":"","filename":"/opt/iobroker/fritzbox-cdr-json.txt","appendNewline":true,"overwriteFile":"delete","x":2338.0000610351562,"y":58.500003814697266,"z":"64b98f40.9b467","wires":[]},{"id":"a6ad378c.5952c8","type":"inject","name":"CDR Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":2087.6668090820312,"y":58.666690826416016,"z":"64b98f40.9b467","wires":[["970de948.68f218"]]},{"id":"e8af3951.1750c8","type":"ioBroker out","name":"[Pfad aud der Konfig] + Variablenname","topic":"","ack":"true","autoCreate":"true","x":3463.666748046875,"y":1693.3333740234375,"z":"64b98f40.9b467","wires":[]},{"id":"2de38359.d21c7c","type":"debug","name":"","active":false,"console":"false","complete":"payload","x":1699.3810653686523,"y":1733.6191420555115,"z":"64b98f40.9b467","wires":[]},{"id":"e8902f7.f176fd","type":"debug","name":"","active":false,"console":"false","complete":"true","x":1699.3810653686523,"y":1769.6191420555115,"z":"64b98f40.9b467","wires":[]},{"id":"de45645b.21ba98","type":"function","name":"context.global.fbVars löschen","func":"context.global.fbVars = {};\n\nmsg.payload = context.global.fbVars;\n\nreturn msg;","outputs":1,"valid":true,"x":2338.6665649414062,"y":145.33331680297852,"z":"64b98f40.9b467","wires":[["e752d8bb.18ad28"]]},{"id":"e752d8bb.18ad28","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":2542.6665649414062,"y":143.33331680297852,"z":"64b98f40.9b467","wires":[]},{"id":"7dcb6112.8234a","type":"inject","name":"Löscht die globalen Variablen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":2096.6665649414062,"y":147.33331680297852,"z":"64b98f40.9b467","wires":[["de45645b.21ba98"]]},{"id":"d884a2a9.277b6","type":"comment","name":"DEBUG","info":"DEBUG Infos, später entfernen:\n\n\nin der Funktion \"Meldungen in Objekte...\" zum Schluss:\nmsg.context = context.global.fbVars;\nUnd die dazugehörigen DEBUG Nodes\n\n\n","x":538,"y":192,"z":"64b98f40.9b467","wires":[]},{"id":"20d4d674.df2b2a","type":"debug","name":"","active":false,"console":"false","complete":"true","x":3095.000045776367,"y":1024.000108242035,"z":"64b98f40.9b467","wires":[]},{"id":"7432024.f8bcdfc","type":"function","name":"terminiert alle Variablen","func":"\nreturn msg;","outputs":1,"valid":true,"x":3162.33349609375,"y":1498.666748046875,"z":"64b98f40.9b467","wires":[["e8af3951.1750c8","a5541097.5aabf"]]},{"id":"b5b0eaea.4a4f18","type":"function","name":"Testmeldungen","func":"\nreturn msg;","outputs":1,"valid":true,"x":984.0000152587891,"y":2206.0002756118774,"z":"64b98f40.9b467","wires":[["a777682f.588898"]]},{"id":"d64e0cb2.29b1f","type":"inject","name":"10.05.15 21:07:00;CONNECT;2;10;;","topic":"","payload":"10.05.15 21:07:00;CONNECT;2;10;;","payloadType":"string","repeat":"","crontab":"","once":false,"x":256.49999237060547,"y":2159.00003862381,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"75ffb7a0.8a0048","type":"inject","name":"10.05.15 21:07:07;DISCONNECT;2;42;","topic":"","payload":"10.05.15 21:07:07;DISCONNECT;2;42;","payloadType":"string","repeat":"","crontab":"","once":false,"x":236.5,"y":2193,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"a88757c9.5778a8","type":"inject","name":"10.05.15 20:06:58;RING;3;01713211545;022143238456;SIP0;","topic":"","payload":"10.05.15 20:06:58;RING;3;01713211545;022143238456;SIP0;","payloadType":"string","repeat":"","crontab":"","once":false,"x":824.5,"y":1945,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"74787906.8b8788","type":"comment","name":"kommendes Gespr. 0173 zur Sipgate 0201, Nebenstelle 12 geht dran","info":"","x":814.4999923706055,"y":1913.0000386238098,"z":"64b98f40.9b467","wires":[]},{"id":"9ed34fb.f612cb","type":"inject","name":"10.05.15 20:07:00;CONNECT;3;12;01713211545;","topic":"","payload":"10.05.15 20:07:00;CONNECT;3;12;01713211545;","payloadType":"string","repeat":"","crontab":"","once":false,"x":811.8333129882812,"y":1980.333251953125,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"31e12f38.ce1ed","type":"inject","name":"10.05.15 20:07:07;DISCONNECT;3;42;","topic":"","payload":"10.05.15 20:07:07;DISCONNECT;3;42;","payloadType":"string","repeat":"","crontab":"","once":false,"x":761.8333129882812,"y":2018,"z":"64b98f40.9b467","wires":[["b5b0eaea.4a4f18"]]},{"id":"a5541097.5aabf","type":"debug","name":"","active":false,"console":"false","complete":"false","x":3384.71435546875,"y":1500.2381591796875,"z":"64b98f40.9b467","wires":[]},{"id":"def44c2d.210bb","type":"function","name":"Anruferliste gesamt als Liste","func":"\n\n// var events = [];\ncontext.global.fbVars.anruferlisteGesamt = context.global.fbVars.anruferlisteGesamt || [];\n\nfunction getEventsList() {\n var text = '';\n for (var i = 0; i < context.global.fbVars.anruferlisteGesamt.length; i++) {\n text += (text ? '
\\n' : '') + context.global.fbVars.anruferlisteGesamt[i];\n }\n return text;\n} \n\nif (context.global.fbVars.config.anz_kopfzeile === true) {\n context.global.fbVars.anruferlisteGesamt.shift(); // erste Element im Array löschen (Kopfzeile)\n context.global.fbVars.anruferlisteGesamt.unshift(msg.anruferlisteKopf, msg.payload); // (Kopfzeile und aktueller Eintrag an Stelle 1 und 2 hinzufügen)\n } else {\n context.global.fbVars.anruferlisteGesamt.unshift(msg.payload);\n }\n\n// if (context.global.fbVars.anruferlisteGesamt.length > context.global.fbVars.config.anz_anzahl_zeilen) context.global.fbVars.anruferlisteGesamt.pop();\n if (context.global.fbVars.anruferlisteGesamt.length > context.global.fbVars.config.anz_anzahl_zeilen) {\n context.global.fbVars.anruferlisteGesamt.length = context.global.fbVars.config.anz_anzahl_zeilen;\n }\n msg.payload = getEventsList();\n\nmsg.topic = context.global.fbVars.config.topic_prefix + \"ruflisten.gesamtListe\";\n\nreturn msg;\n","outputs":1,"valid":true,"x":2928.666748046875,"y":1594.83349609375,"z":"64b98f40.9b467","wires":[["4f8e909.fb0717","7432024.f8bcdfc"]]},{"id":"4f8e909.fb0717","type":"debug","name":"Anruferliste gesamt","active":false,"console":"false","complete":"payload","x":3158.666679382324,"y":1589.8334951400757,"z":"64b98f40.9b467","wires":[]},{"id":"fed2f25d.012d1","type":"function","name":"Anruferliste verpasst als Liste","func":"// var events = [];\ncontext.global.fbVars.anruferlisteVerpasst = context.global.fbVars.anruferlisteVerpasst || [];\n\n\n// Liste mit Anzahl Zeilen: context.global.fbVars.config.anz_anzahl_zeilen\nfunction getEventsList() {\n var text = '';\n for (var i = 0; i < context.global.fbVars.anruferlisteVerpasst.length; i++) {\n text += (text ? '
\\n' : '') + context.global.fbVars.anruferlisteVerpasst[i];\n }\n return text;\n} \n\n\n// context.global.fbVars.anruferlisteVerpasst.unshift(msg.payload);\n// if (context.global.fbVars.anruferlisteVerpasst.length > context.global.fbVars.config.anz_anzahl_zeilen) context.global.fbVars.anruferlisteVerpasst.pop();\n// msg.payload = getEventsList();\n\nif (context.global.fbVars.config.anz_kopfzeile === true) {\n context.global.fbVars.anruferlisteVerpasst.shift(); // erste Element im Array löschen (Kopfzeile)\n context.global.fbVars.anruferlisteVerpasst.unshift(msg.verpasstKopf, msg.payload); // (Kopfzeile und aktueller Eintrag an Stelle 1 und 2 hinzufügen)\n } else {\n context.global.fbVars.anruferlisteVerpasst.unshift(msg.payload);\n }\n\n// if (context.global.fbVars.anruferlisteVerpasst.length > context.global.fbVars.config.anz_anzahl_zeilen) context.global.fbVars.anruferlisteVerpasst.pop();\n if (context.global.fbVars.anruferlisteVerpasst.length > context.global.fbVars.config.anz_anzahl_zeilen) {\n context.global.fbVars.anruferlisteVerpasst.length = context.global.fbVars.config.anz_anzahl_zeilen;\n }\n msg.payload = getEventsList();\n\n\n\nmsg.topic = context.global.fbVars.config.topic_prefix + \"ruflisten.verpasstListe\";\n\nreturn msg;\n","outputs":1,"valid":true,"x":2924.5000762939453,"y":1646.500150680542,"z":"64b98f40.9b467","wires":[["14c9cde0.eb3632","7432024.f8bcdfc"]]},{"id":"14c9cde0.eb3632","type":"debug","name":"Anruferliste verpasst","active":false,"console":"false","complete":"payload","x":3160.7501106262207,"y":1647.750171661377,"z":"64b98f40.9b467","wires":[]},{"id":"94b7e9c8.6b4818","type":"http in","name":"","url":"/fritzbox/vars","method":"get","x":2993.666847229004,"y":121.9999885559082,"z":"64b98f40.9b467","wires":[["e6104458.19efb8"]]},{"id":"25c3d420.da3c2c","type":"http response","name":"http://[EIGENE-IP]:1880/fritzbox/vars","x":3553.333282470703,"y":120.33332061767578,"z":"64b98f40.9b467","wires":[]},{"id":"e6104458.19efb8","type":"function","name":"Ausgabe JSON context.global.fbVars","func":"msg.payload = context.global.fbVars = context.global.fbVars;\nreturn msg;","outputs":1,"valid":true,"x":3240.333422342936,"y":120.33332061767578,"z":"64b98f40.9b467","wires":[["25c3d420.da3c2c"]]},{"id":"7aa08ab9.855f74","type":"http in","name":"","url":"/fritzbox","method":"get","x":2987.0001220703125,"y":168.66665172576904,"z":"64b98f40.9b467","wires":[["e6104458.19efb8"]]},{"id":"b00b1c6e.4ff4e","type":"function","name":"*.meldungAusDerFritzBox","func":"\nmsg.topic = msg.topic + \"meldungAusDerFritzBox\"; // Variablenpfad (aus der Konfigurationsfunktion) + \"meldung\"\n\nreturn msg;","outputs":1,"valid":true,"x":1904.0000228881836,"y":1338.6667819023132,"z":"64b98f40.9b467","wires":[["a324eaf6.5cdb18","276c0075.d894"]]},{"id":"fe485bb3.01b7a8","type":"function","name":"*.deltaZeitMeldungSystemSek","func":"var msg1 = {};\nvar msg2 = {};\n\nif ((msg.deltaZeitMeldungSystemSek > context.global.fbVars.config.deltaZeit) || (msg.deltaZeitMeldungSystemSek < -context.global.fbVars.config.deltaZeit)){\n msg2.payload = false\n} else {\n msg2.payload = true\n}\n\n\n\nmsg1.payload = msg.deltaZeitMeldungSystemSek;\nmsg1.topic = msg.topic + \"deltaZeitMeldungSystemSek\";\n\nmsg2.topic = msg.topic + \"deltaZeitMeldungSystemOK\";\n\n\n\n\nreturn [msg1, msg2];\n","outputs":"2","valid":true,"x":2308.904541015625,"y":1941.214599609375,"z":"64b98f40.9b467","wires":[["9cb70203.6349"],["9cb70203.6349"]]},{"id":"fac27e5d.053d8","type":"inject","name":"<<<--- START CALL GENERATOR, zufällige Calls starten (bis zu drei parallele Calls)","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":373.78570556640625,"y":430.857177734375,"z":"64b98f40.9b467","wires":[["24cd539b.db32ac"]]},{"id":"115057df.eeafa8","type":"function","name":"Random Callparameter","func":"var vorwahlen = [\"0201\",\"0211\",\"030\",\"089\",\"040\"];\nvar eigeneRufnummern = [\"021147110815\",\"02118115643\",\"02118115643\"];\nvar eigeneLines = [\"POTS\",\"SIP0\",\"SIP1\"];\nvar extRufnummernBekannt = [\"05119181111\",\"0711987654321\"];\n\nfunction fill(n) {\n\tvar empty_chars = \"\";\n\tfor(var i = 0; i < n; ++i)\n\tempty_chars += \"0\";\n\treturn(empty_chars);\n\t}\n\n//Zufahllszahlen zwischen min und max\nfunction rand(min, max) {\n\treturn Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n//Rufnummer ohne Vorwahl genereieren, Länge zwischen 6 und 8 Ziffern\nfunction rufnummer () {\n var länge = rand (6,8);\n var rufnummer = \"\";\n rufnummer = rufnummer + rand(1,9);\n for (var i = 0; i <= länge; i++)\n rufnummer = rufnummer + rand(0,9);\n return rufnummer;\n}\n\n\nfunction datum() {\n var now = new Date();\n var tag = now.getDate();\n var monat = now.getMonth()+1;\n var jahr = now.getYear();\n var stunde = now.getHours(); \n var minute = now.getMinutes(); \n var sekunde = now.getSeconds(); \n // falsche Systemzeit oder Fritzbox-Zeit simulieren\n if (rand(1,100) < 50) sekunde = rand(00,59);\n\n stunde = stunde.toString(); \n tag = tag.toString();\n monat = monat.toString();\n jahr = jahr.toString();\n minute = minute.toString();\n sekunde = sekunde.toString();\n jahr = jahr.substr(1,2);\n tag = fill(2 - tag.length) + tag;\n monat = fill(2 - monat.length) + monat;\n stunde = fill(2 - stunde.length) + stunde;\n minute = fill(2 - minute.length) + minute;\n sekunde = fill(2 - sekunde.length) + sekunde;\n\n \n var datum = tag + \".\" + monat + \".\" + jahr + \" \" + stunde + \":\" + minute +\":\" + sekunde;\n return datum;\n }\n\n\nvar eigeneNummer = rand(0,2);\n\nmsg.intNumber = rand(11,13);\nmsg.date = datum();\nmsg.eigeneNummer = eigeneRufnummern[eigeneNummer];\nmsg.line = eigeneLines[eigeneNummer];\n\nif (rand(1,10) < 7) {\n msg.connect = true; \n } else {\n msg.connect = false;\n}\n\nif (rand(1,10) < 6) {\n msg.direction = \"kommend\"; \n } else {\n msg.direction = \"gehend\";\n}\n\n\n// externe Rufnummer zufällig\n var rufnummer = rufnummer(); // zufällige Rufnummer ohne Vorwahl\n var dieseVorwahl = rand(0,vorwahlen.length-1); // \n msg.externeNummer = vorwahlen[dieseVorwahl] + rufnummer;\n\n\n// 20% der kommenden Rufnummern mit Unbekannt überschreiben\nif (msg.direction == \"kommend\") {\n if (rand(1,10) < 3) {\n var rufnummer = \"\";\n msg.externeNummer = \"\";\n }\n}\n\n// 20% der Rufnummern in bekannte Rufnummern ändern\n if (rand(1,10) < 3) {\n var bekannt = rand(0,extRufnummernBekannt.length - 1);\n msg.externeNummer = extRufnummernBekannt[bekannt];\n }\n\n\n\n\n var callid = 99;\n\n\tfor(var i = 0; i < context.global.fbVars.callgenerator.callidfrei.length; ++i) {\n\tif (context.global.fbVars.callgenerator.callidfrei[i] === true) {\n\t context.global.fbVars.callgenerator.callidfrei[i] = false;\n\t callid = i;\n\t break;\n\t }\n }\n\nmsg.callid = callid;\n\nif (callid == 99) {\n msg.direction = \"error\";\n}\nmsg.connectedNumber = msg.externeNummer;\n\ncontext.global.fbVars.callgenerator.testcalls++; // aktuell laufende Calls\n\n\nif (context.global.fbVars.callgenerator.testcount <= 0) {\n return null;\n }\n\nreturn msg;\n","outputs":1,"valid":true,"x":394.28570556640625,"y":2641.14306640625,"z":"64b98f40.9b467","wires":[["80cec74c.7f3138","7ebf247c.8140dc","424a7c25.bdb584"]]},{"id":"80cec74c.7f3138","type":"switch","name":"(1) gehend (2) kommend (3) error","property":"direction","rules":[{"t":"eq","v":"gehend"},{"t":"eq","v":"kommend"},{"t":"else"}],"checkall":"true","outputs":3,"x":658,"y":2642,"z":"64b98f40.9b467","wires":[["e3989190.1c677"],["64b3c50b.9b4c3c"],["d3e0b3b4.2c1f5"]]},{"id":"e3989190.1c677","type":"function","name":"CALL","func":"// msg.externeNummer\n// msg.connectedNumber\n// msg.intNumber\n// msg.date\n// msg.eigeneNummer\n// msg.line\n// msg.connect\n// msg.direction\n// msg.callid\n\n\n\nmsg.payload = msg.date + \";CALL;\" + msg.callid + \";\" + msg.intNumber + \";\"\n + msg.eigeneNummer + \";\" + msg.externeNummer + \";\" + msg.line + \";\";\n\nreturn msg;\n","outputs":1,"valid":true,"x":908,"y":2618,"z":"64b98f40.9b467","wires":[["879076cc.786f88","4b30d9c0.b4cf28","57a3f0a1.a85c1"]]},{"id":"7ebf247c.8140dc","type":"debug","name":"","active":false,"console":"false","complete":"true","x":422,"y":2602,"z":"64b98f40.9b467","wires":[]},{"id":"eeaf08f9.1150f8","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":711.9999732971191,"y":2703.9999479055405,"z":"64b98f40.9b467","wires":[]},{"id":"110bf9f9.eef406","type":"debug","name":"","active":false,"console":"false","complete":"payload","x":1244.9999923706055,"y":2437.9999955892563,"z":"64b98f40.9b467","wires":[]},{"id":"64b3c50b.9b4c3c","type":"function","name":"RING","func":"// msg.externeNummer\n// msg.connectedNumber\n// msg.intNumber\n// msg.date\n// msg.eigeneNummer\n// msg.line\n// msg.connect\n// msg.direction\n// msg.callid\n\nfunction fill(n) {\n\tvar empty_chars = \"\";\n\tfor(var i = 0; i < n; ++i)\n\tempty_chars += \"0\";\n\treturn(empty_chars);\n\t}\n\n\nmsg.payload = msg.date + \";RING;\" + msg.callid + \";\" + msg.externeNummer + \";\"\n + msg.eigeneNummer + \";\" + msg.line + \";\";\n\nreturn msg;\n","outputs":1,"valid":true,"x":907.4285888671875,"y":2656.28564453125,"z":"64b98f40.9b467","wires":[["879076cc.786f88","4b30d9c0.b4cf28","57a3f0a1.a85c1"]]},{"id":"3b9a8e85.c46572","type":"switch","name":"(1) Connect (2) kein Connect (3) error","property":"connect","rules":[{"t":"true"},{"t":"false"},{"t":"else"}],"checkall":"true","outputs":3,"x":1302,"y":2636,"z":"64b98f40.9b467","wires":[["5aa54539.a55abc"],["d4bd1bec.2b42e8"],["d3e0b3b4.2c1f5"]]},{"id":"d3e0b3b4.2c1f5","type":"function","name":"error","func":"node.error(\"Fehler im Call Generator\");\nmsg.payload = \"Fehler im Call Generator\"\n\nreturn msg;","outputs":1,"valid":true,"x":574,"y":2706,"z":"64b98f40.9b467","wires":[["eeaf08f9.1150f8"]]},{"id":"5aa54539.a55abc","type":"function","name":"CONNECT","func":"// msg.externeNummer\n// msg.connectedNumber\n// msg.intNumber\n// msg.date\n// msg.eigeneNummer\n// msg.line\n// msg.connect\n// msg.direction\n// msg.callid\n\nfunction fill(n) {\n\tvar empty_chars = \"\";\n\tfor(var i = 0; i < n; ++i)\n\tempty_chars += \"0\";\n\treturn(empty_chars);\n\t}\n\nfunction datum() {\n var now = new Date();\n var tag = now.getDate();\n var monat = now.getMonth()+1;\n var jahr = now.getYear();\n var stunde = now.getHours(); \n var minute = now.getMinutes(); \n var sekunde = now.getSeconds(); \n stunde = stunde.toString(); \n tag = tag.toString();\n monat = monat.toString();\n jahr = jahr.toString();\n minute = minute.toString();\n sekunde = sekunde.toString();\n jahr = jahr.substr(1,2);\n tag = fill(2 - tag.length) + tag;\n monat = fill(2 - monat.length) + monat;\n stunde = fill(2 - stunde.length) + stunde;\n minute = fill(2 - minute.length) + minute;\n sekunde = fill(2 - sekunde.length) + sekunde;\n\n \n var datum = tag + \".\" + monat + \".\" + jahr + \" \" + stunde + \":\" + minute +\":\" + sekunde;\n return datum;\n } \nmsg.date = datum();\n\n\nmsg.payload = msg.date + \";CONNECT;\" + msg.callid + \";\" + msg.intNumber + \";\" + msg.externeNummer + \";\";\n\nreturn msg;\n","outputs":1,"valid":true,"x":1532,"y":2614,"z":"64b98f40.9b467","wires":[["879076cc.786f88","48e2bdb9.b71d44","4e17ad0e.b1e854"]]},{"id":"4b30d9c0.b4cf28","type":"delay","name":"","pauseType":"random","timeout":"6","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"2","randomLast":"6","randomUnits":"seconds","drop":false,"x":1070,"y":2634,"z":"64b98f40.9b467","wires":[["3b9a8e85.c46572"]]},{"id":"879076cc.786f88","type":"function","name":"emulierte Fritzbox Message","func":"var payload = msg.payload;\nmsg = {};\n\nmsg.payload = payload;\n\nreturn msg;","outputs":1,"valid":true,"x":1285.5,"y":2478.9999970197678,"z":"64b98f40.9b467","wires":[["110bf9f9.eef406","b5b0eaea.4a4f18"]]},{"id":"d4bd1bec.2b42e8","type":"function","name":"DISCONNECT","func":"// msg.externeNummer\n// msg.connectedNumber\n// msg.intNumber\n// msg.date\n// msg.eigeneNummer\n// msg.line\n// msg.connect\n// msg.direction\n// msg.callid\n\nfunction fill(n) {\n\tvar empty_chars = \"\";\n\tfor(var i = 0; i < n; ++i)\n\tempty_chars += \"0\";\n\treturn(empty_chars);\n\t}\n\nfunction datum() {\n var now = new Date();\n var tag = now.getDate();\n var monat = now.getMonth()+1;\n var jahr = now.getYear();\n var stunde = now.getHours(); \n var minute = now.getMinutes(); \n var sekunde = now.getSeconds(); \n stunde = stunde.toString(); \n tag = tag.toString();\n monat = monat.toString();\n jahr = jahr.toString();\n minute = minute.toString();\n sekunde = sekunde.toString();\n jahr = jahr.substr(1,2);\n tag = fill(2 - tag.length) + tag;\n monat = fill(2 - monat.length) + monat;\n stunde = fill(2 - stunde.length) + stunde;\n minute = fill(2 - minute.length) + minute;\n sekunde = fill(2 - sekunde.length) + sekunde;\n\n \n var datum = tag + \".\" + monat + \".\" + jahr + \" \" + stunde + \":\" + minute +\":\" + sekunde;\n return datum;\n }\n \n \nmsg.date = datum();\n\n\n\n//Zufahllszahlen zwischen min und max\nfunction rand(min, max) {\n\treturn Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\nvar callid = msg.callid;\ncontext.global.fbVars.callgenerator.callidfrei[callid] = true;\n\n\nif (msg.connect === true) {\n msg.duration = rand(10,40); // Dauer des Gespräches nicht ausgerechnet (faul). Zufall\n } else {\n msg.duration = \"0\";\n}\n\nmsg.payload = msg.date + \";DISCONNECT;\" + msg.callid + \";\" + msg.duration + \";\";\n\nreturn msg;\n","outputs":1,"valid":true,"x":1870,"y":2634,"z":"64b98f40.9b467","wires":[["879076cc.786f88","effe627b.1001a","13a51ea9.ec5ae1"]]},{"id":"48e2bdb9.b71d44","type":"delay","name":"","pauseType":"random","timeout":"5","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"5","randomLast":"12","randomUnits":"seconds","drop":false,"x":1696,"y":2614,"z":"64b98f40.9b467","wires":[["d4bd1bec.2b42e8"]]},{"id":"57a3f0a1.a85c1","type":"debug","name":"","active":false,"console":"false","complete":"true","x":904.9999923706055,"y":2572.4999989271164,"z":"64b98f40.9b467","wires":[]},{"id":"4e17ad0e.b1e854","type":"debug","name":"","active":false,"console":"false","complete":"true","x":1535.0000038146973,"y":2573.9999984502792,"z":"64b98f40.9b467","wires":[]},{"id":"effe627b.1001a","type":"debug","name":"","active":false,"console":"false","complete":"true","x":1872.0000076293945,"y":2589.9999991059303,"z":"64b98f40.9b467","wires":[]},{"id":"13a51ea9.ec5ae1","type":"function","name":"Schleife","func":"\n--context.global.fbVars.callgenerator.testcalls; // aktuell laufende Calls um eins reduzieren\n--context.global.fbVars.callgenerator.testcount;\n\n\nif (context.global.fbVars.callgenerator.testcount <0) {\n context.global.fbVars.callgenerator.testcount = 0;\n}\n\n\n\nreturn msg;","outputs":1,"valid":true,"x":1404.9999732971191,"y":2767.9999479055405,"z":"64b98f40.9b467","wires":[["77435b35.88bca4","424a7c25.bdb584"]]},{"id":"bf6b4dcf.4094b","type":"function","name":"init","func":"context.global.fbVars = context.global.fbVars || {}; // wenn es das Objekt context.global.fbVars noch nicht gibt, wird dieses hier leer angelegt\ncontext.global.fbVars.callgenerator = context.global.fbVars.callgenerator || {};\n\ncontext.global.fbVars.callgenerator.callidfrei = [true,true,true,true,true,true,true,true,true,true,true,true];\ncontext.global.fbVars.callgenerator.testcount = 100; // Schleifendurchgänge\ncontext.global.fbVars.callgenerator.testcalls = 0; // aktuell laufende Calls\n\nreturn msg;\n","outputs":1,"valid":true,"x":203.99998092651367,"y":2638.500000357628,"z":"64b98f40.9b467","wires":[["115057df.eeafa8"]]},{"id":"a99bcaa9.566438","type":"comment","name":"###### Call Generator - simuliert zufällige Telefongespräche ######","info":"","x":269.00001525878906,"y":2458.499997973442,"z":"64b98f40.9b467","wires":[]},{"id":"77435b35.88bca4","type":"delay","name":"","pauseType":"random","timeout":"5","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"4","randomLast":"10","randomUnits":"seconds","drop":false,"x":1542.4999732971191,"y":2766.9999479055405,"z":"64b98f40.9b467","wires":[["115057df.eeafa8"]]},{"id":"d729eba8.28d618","type":"catch","name":"","x":961.5000762939453,"y":1330.000018119812,"z":"64b98f40.9b467","wires":[["e48d9b52.1b7268"]]},{"id":"e48d9b52.1b7268","type":"debug","name":"","active":true,"console":"false","complete":"true","x":1127.5000762939453,"y":1330.000018119812,"z":"64b98f40.9b467","wires":[]},{"id":"fdc75991.0238a8","type":"comment","name":"Aktuelle Werte über http als JSON ausgeben","info":"","x":3073.0000788370767,"y":71.00000762939453,"z":"64b98f40.9b467","wires":[]},{"id":"b462a417.4b9d58","type":"comment","name":"Für DEBUG: löscht die angelegten Variablen: context.global. !!! NICHT WÄHREND DER LAUFZEIT VERWENDEN !!!","info":"","x":2328.0000610351562,"y":112.00000381469727,"z":"64b98f40.9b467","wires":[]},{"id":"93ed6ff5.6c129","type":"pushover","title":"","name":"### konfigurieren ### Pushover","priority":0,"x":626,"y":252,"z":"64b98f40.9b467","wires":[]},{"id":"8f76180d.7089e8","type":"e-mail","server":"smtp.gmail.com","port":"465","name":"","dname":"### konfigurieren ### Email","x":622,"y":296,"z":"64b98f40.9b467","wires":[]},{"id":"11666c7d.ee9994","type":"template","name":"","field":"payload","format":"handlebars","template":"This is the payload: {{payload}} !","x":1839.0000228881836,"y":857.0000066757202,"z":"64b98f40.9b467","wires":[["93ed6ff5.6c129","a4a5f93a.5b5a08"]]},{"id":"854cdcd6.7ab32","type":"template","name":"","field":"payload","format":"handlebars","template":"This is the payload: {{payload}} !","x":1837.0000228881836,"y":897.0000066757202,"z":"64b98f40.9b467","wires":[["8f76180d.7089e8","55a5f5b.faa5a0c"]]},{"id":"137130f8.ec8ecf","type":"function","name":"Verpasste Anrufe - Meldung terminieren - Ausgabe j/n","func":"msg.infoPushover = false;\nmsg.infoEmail = false;\n\nif (context.global.fbVars.config.infoPushover == true ) {\n msg.infoPushover = true;\n}\n\nif (context.global.fbVars.config.infoEmail == true ) {\n msg.infoPushover = true;\n}\n\n\nreturn msg;","outputs":1,"valid":true,"x":1847.0000228881836,"y":953.0000066757202,"z":"64b98f40.9b467","wires":[["a5597334.5aa69","930cee8e.6cf31"]]},{"id":"653a124b.9ac5ec","type":"comment","name":"Baustelle - Ausgabe/Template anpassen (Ausgabe Liste muss auf Text geändert werden)","info":"","x":1855.0000228881836,"y":805.0000066757202,"z":"64b98f40.9b467","wires":[]},{"id":"6045cc63.9fba34","type":"function","name":"verpassten Anruf zählen (max. 999)","func":"context.global.fbVars.verpassteAnrufeZahl = context.global.fbVars.verpassteAnrufeZahl || 0;\n\nmsg.payload = ++ context.global.fbVars.verpassteAnrufeZahl;\n\nif (context.global.fbVars.verpassteAnrufeZahl > 999) contect.global.fbVars.verpassteAnrufeZahl = 999;\n\nmsg.topic = context.global.fbVars.config.topic_prefix + \"anzahlVerpasst\";\n\nreturn msg;","outputs":1,"valid":true,"x":2897.000091552734,"y":1699.0001020431516,"z":"64b98f40.9b467","wires":[["e8af3951.1750c8"]]},{"id":"ec99a690.136658","type":"delay","name":"","pauseType":"random","timeout":"5","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":203.9999885559082,"y":2679.333249926567,"z":"64b98f40.9b467","wires":[["115057df.eeafa8"]]},{"id":"b167c367.4e984","type":"delay","name":"","pauseType":"random","timeout":"5","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":200.66667938232422,"y":2719.333249926567,"z":"64b98f40.9b467","wires":[["115057df.eeafa8"]]},{"id":"a5597334.5aa69","type":"switch","name":"Pushover = true","property":"infoPushover","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":1691.0000228881836,"y":857.0000066757202,"z":"64b98f40.9b467","wires":[["11666c7d.ee9994"]]},{"id":"930cee8e.6cf31","type":"switch","name":"Email = true","property":"infoEmail","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":1697.0000228881836,"y":901.0000066757202,"z":"64b98f40.9b467","wires":[["854cdcd6.7ab32"]]},{"id":"a4a5f93a.5b5a08","type":"debug","name":"","active":false,"console":"false","complete":"false","x":2005.0000228881836,"y":855.0000066757202,"z":"64b98f40.9b467","wires":[]},{"id":"55a5f5b.faa5a0c","type":"debug","name":"","active":false,"console":"false","complete":"false","x":2003.0000228881836,"y":897.0000066757202,"z":"64b98f40.9b467","wires":[]},{"id":"15f8d8ea.ea0727","type":"function","name":"*.config.infoPushover","func":"\nmsg.topic = msg.topic + \"config.infoPushover\";\nmsg.payload = context.global.fbVars.config.infoPushover;\nreturn msg;","outputs":1,"valid":true,"x":511.0001220703125,"y":957.0001831054688,"z":"64b98f40.9b467","wires":[["4ed4b1d9.b12b5"]]},{"id":"4209cdc4.bdf634","type":"function","name":"config über ioBroker/Vis veränderbar","func":"context.global.fbVars.callgenerator = context.global.fbVars.callgenerator || {};\n\nmsg.topic = context.global.fbVars.config.topic_prefix;\n\nreturn msg;","outputs":1,"valid":true,"x":201.5001220703125,"y":918.0001220703125,"z":"64b98f40.9b467","wires":[["15f8d8ea.ea0727","dbe91fc0.2416e","c88aeb6d.377518","f12ba122.0ed46","822b19b0.7dd4e8"]]},{"id":"dbe91fc0.2416e","type":"function","name":"*.config.infoEmail","func":"\nmsg.topic = msg.topic + \"config.infoEmail\";\nmsg.payload = context.global.fbVars.config.infoEmail;\nreturn msg;","outputs":1,"valid":true,"x":501.0001220703125,"y":921.0001831054688,"z":"64b98f40.9b467","wires":[["4ed4b1d9.b12b5"]]},{"id":"783342ee.87ccbc","type":"ioBroker in","name":"node-red.0.fritzbox.anzahlVerpasst","topic":"node-red.0.fritzbox.anzahlVerpasst","payloadType":"value","x":1203.7142486572266,"y":85.42857074737549,"z":"64b98f40.9b467","wires":[["16ad79d8.e95286"]]},{"id":"16ad79d8.e95286","type":"function","name":"verpassteAnrufeZahl aus ioBroker übernehmen","func":"// wenn in ioBroker die verpassten Anrufe zurückgesetzt werden, wird der Wert in Node-red übernommen\ncontext.global.fbVars = context.global.fbVars || {}; // wenn es das Objekt context.global.fbVars noch nicht gibt, wird dieses hier leer angelegt\n\ncontext.global.fbVars.verpassteAnrufeZahl = msg.payload;\n\nreturn msg;","outputs":1,"valid":true,"x":1553.5715255737305,"y":86.28569412231445,"z":"64b98f40.9b467","wires":[["2b71c9ae.d48e36"]]},{"id":"2b71c9ae.d48e36","type":"debug","name":"","active":false,"console":"false","complete":"false","x":1460,"y":124,"z":"64b98f40.9b467","wires":[]},{"id":"a777682f.588898","type":"function","name":"Start & Variablenpfad","func":"msg.topic = context.global.fbVars.config.topic_prefix;\n\nreturn msg;","outputs":1,"valid":true,"x":1513.500144958496,"y":1099.5001382827759,"z":"64b98f40.9b467","wires":[["eb0052b6.14ffb"]]},{"id":"b80431f8.47fbd","type":"inject","name":"init bei Deploy","topic":"","payload":"Fritzbox - Init","payloadType":"string","repeat":"","crontab":"","once":true,"x":132.5,"y":885.0000114440918,"z":"64b98f40.9b467","wires":[["fc1188c1.03ee78"]]},{"id":"276c0075.d894","type":"ioBroker out","name":"[Pfad aus der Konfig].*","topic":"","ack":"true","autoCreate":"true","x":1930,"y":1414,"z":"64b98f40.9b467","wires":[]},{"id":"908f206b.6f70e","type":"comment","name":"Konfigurationsdaten, die auch in ioBroker als Obkjekt zur Verfügung stehen. Z.B. über VIS veränderbar.","info":"","x":560,"y":884,"z":"64b98f40.9b467","wires":[]},{"id":"424a7c25.bdb584","type":"function","name":".callgenerator.testcount","func":"msg.topic = context.global.fbVars.config.topic_prefix + \"callgenerator.testcount\";\nmsg.payload = context.global.fbVars.callgenerator.testcount;\n\nreturn msg;","outputs":1,"valid":true,"x":583.9999732971191,"y":2799.9999479055405,"z":"64b98f40.9b467","wires":[["df91cd76.206e3"]]},{"id":"df91cd76.206e3","type":"ioBroker out","name":"[Pfad aus der Konfig].*","topic":"","ack":"true","autoCreate":"true","x":856.9999732971191,"y":2815.9999479055405,"z":"64b98f40.9b467","wires":[]},{"id":"c88aeb6d.377518","type":"function","name":"*.callgenerator.startDemo","func":"msg.topic = msg.topic + \"callgenerator.startDemo\";\nmsg.payload = false;\nreturn msg;","outputs":1,"valid":true,"x":508,"y":998,"z":"64b98f40.9b467","wires":[["4ed4b1d9.b12b5"]]},{"id":"24cd539b.db32ac","type":"function","name":"Start Call Generator","func":"\nreturn msg;","outputs":1,"valid":true,"x":502.99997329711914,"y":2494.9999479055405,"z":"64b98f40.9b467","wires":[["bf6b4dcf.4094b","ec99a690.136658","b167c367.4e984"]]},{"id":"387c7df2.c78382","type":"ioBroker in","name":"node-red.0.fritzbox.callgenerator.startDemo","topic":"node-red.0.fritzbox.callgenerator.startDemo","payloadType":"value","x":208.3332862854004,"y":2906.6666473150253,"z":"64b98f40.9b467","wires":[["3e5abe6f.c1a542"]]},{"id":"3e5abe6f.c1a542","type":"function","name":"Trigger zurücksetzen","func":"if (msg.payload == \"true\" || msg.payload === true || msg.payload == 1 || msg.payload == \"1\") {\n msg.payload = false;\n msg.topic = context.global.fbVars.config.topic_prefix + \"callgenerator.startDemo\"; \n\n return msg;\n}\nreturn null;","outputs":1,"valid":true,"x":271.3332862854004,"y":2938.6666473150253,"z":"64b98f40.9b467","wires":[["24cd539b.db32ac","df91cd76.206e3"]]},{"id":"11e946bb.ee16b9","type":"ioBroker in","name":"node-red.0.fritzbox.callgenerator.stopDemo","topic":"node-red.0.fritzbox.callgenerator.stopDemo","payloadType":"value","x":193.99995803833008,"y":2979.3331998586655,"z":"64b98f40.9b467","wires":[["885987dc.77a678"]]},{"id":"885987dc.77a678","type":"function","name":"Stop Testcalls","func":"if (msg.payload == \"true\" || msg.payload === true|| msg.payload == 1 || msg.payload == \"1\") {\n msg.payload = false;\n msg.topic = context.global.fbVars.config.topic_prefix + \"callgenerator.stopDemo\"; \n context.global.fbVars.callgenerator.testcount = 0;\n return msg;\n}\nreturn null;\n","outputs":1,"valid":true,"x":260.3332824707031,"y":3012.999919295311,"z":"64b98f40.9b467","wires":[["df91cd76.206e3","424a7c25.bdb584"]]},{"id":"f12ba122.0ed46","type":"function","name":"*.callgenerator.stopDemo","func":"msg.topic = msg.topic + \"callgenerator.stopDemo\";\nmsg.payload = false;\nreturn msg;","outputs":1,"valid":true,"x":509.9999694824219,"y":1036.6666259765625,"z":"64b98f40.9b467","wires":[["4ed4b1d9.b12b5"]]},{"id":"822b19b0.7dd4e8","type":"function","name":".callgenerator.testcount","func":"msg.topic = context.global.fbVars.config.topic_prefix + \"callgenerator.testcount\";\ncontext.global.fbVars.callgenerator.testcount = 0;\nmsg.payload = context.global.fbVars.callgenerator.testcount;\n\nreturn msg;","outputs":1,"valid":true,"x":508,"y":1074,"z":"64b98f40.9b467","wires":[["4ed4b1d9.b12b5"]]},{"id":"c92ce696.36d318","type":"function","name":"aktueller Stand: Listen, Zähler","func":"\n\n\nfunction dynamicSort(property) {\n var sortOrder = 1;\n if(property[0] === \"-\") {\n sortOrder = -1;\n property = property.substr(1);\n }\n return function (a,b) {\n var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;\n return result * sortOrder;\n }\n}\n\n\nvar anzahlRing = 0;\nvar anzahlCall = 0;\nvar anzahlConnect = 0;\n\n\n// Liste der aktiven RING, CALL löschen\ncontext.global.fbVars.listeRing = [];\ncontext.global.fbVars.listeCall = [];\ncontext.global.fbVars.listeConnect = [];\n\n\n// Verwendete Variablen initialisieren\ncontext.global.fbVars.ringLetzter = context.global.fbVars.ringLetzter || \"\"; \ncontext.global.fbVars.ringAktuell = context.global.fbVars.ringAktuell || \"\"; \ncontext.global.fbVars.ring = context.global.fbVars.ring || false;\n\n\n\n// Schleife, Anzahl der Call IDs im Array: Zählt die jeweiligen Zustände, ein Array je Zustand\nfor (var i = 0; i < context.global.fbVars.callid.length; i++){ \n\tif (context.global.fbVars.callid[i] != null) {\n // Call Status = RING\n \tif (context.global.fbVars.callid[i].calltype === \"RING\"){ \n context.global.fbVars.listeRing[anzahlRing] = context.global.fbVars.listeRing[anzahlRing] || {};\n context.global.fbVars.listeRing[anzahlRing] = context.global.fbVars.callid[i];\n\t anzahlRing++; \n\t }\n\n\t // Call Status = CALL\n \tif (context.global.fbVars.callid[i].calltype === \"CALL\"){ \n context.global.fbVars.listeCall[anzahlCall] = context.global.fbVars.listeCall[anzahlCall] || {};\n context.global.fbVars.listeCall[anzahlCall] = context.global.fbVars.callid[i];\n anzahlCall++;\n\t }\n\n\t // Call Status = CONNECT\n \tif (context.global.fbVars.callid[i].calltype === \"CONNECT\"){ \n context.global.fbVars.listeConnect[anzahlConnect] = context.global.fbVars.listeConnect[anzahlConnect] || {};\n context.global.fbVars.listeConnect[anzahlConnect] = context.global.fbVars.callid[i];\n anzahlConnect++;\n\t }\n\t}\n}\n\n\n// sortiert die ermittelten Listen nach der tatsächlichen Meldungszeit (Systemzeit)\ncontext.global.fbVars.listeRing.sort(dynamicSort(\"-epocheNow\")); // Liste sortieren: jüngster Eintrag oben\ncontext.global.fbVars.listeCall.sort(dynamicSort(\"-epocheNow\")); // Liste sortieren: jüngster Eintrag oben\ncontext.global.fbVars.listeConnect.sort(dynamicSort(\"-epocheNow\")); // Liste sortieren: jüngster Eintrag oben\n\n\n// aktuellste Anrufernummer wird als Letzter Anrufer (Ring) gespeichert\nif (context.global.fbVars.listeRing[0] != null) {\n context.global.fbVars.ringLetzter = context.global.fbVars.listeRing[0].callingNumber; \n context.global.fbVars.ringAktuell = context.global.fbVars.listeRing[0].callingNumber; \n context.global.fbVars.ring = true;\n}\n// kein aktiver Ring, ringAktuell löschen && ring = false (kein Ring aktiv)\nif (anzahlRing < 1) {\n context.global.fbVars.ringAktuell = \"\";\n context.global.fbVars.ring = false;\n}\n\n\n// Summen Anrufarten\ncontext.global.fbVars.anzahlRing = anzahlRing;\ncontext.global.fbVars.anzahlCall = anzahlCall;\ncontext.global.fbVars.anzahlConnect = anzahlConnect;\n\n\n\n\n\n\nreturn msg;\n","outputs":1,"valid":true,"x":2315,"y":2059.66650390625,"z":"64b98f40.9b467","wires":[["f2ad5e87.0d52a","2b677937.d49886","cd41ef70.32be1","142d43ae.ebd2bc","31ce296f.ce31d6","c01194b5.3fee68","66ae1a23.9951e4","91e1fc94.6e1e","6f5afd4b.90a504"]]},{"id":"9cb70203.6349","type":"ioBroker out","name":"[Pfad aud der Konfig] + Variablenname","topic":"","ack":"true","autoCreate":"true","x":3434.66650390625,"y":1934.333251953125,"z":"64b98f40.9b467","wires":[]},{"id":"d4890e21.2b76f","type":"comment","name":"Bei jeder Meldung werden die aktuellen Zustände aktualisiert","info":"","x":2404.333251953125,"y":2016.333251953125,"z":"64b98f40.9b467","wires":[]},{"id":"f2ad5e87.0d52a","type":"function","name":"ringLetzter (Letzte Runfnummer die anruft/angerufen hat)","func":"if (context.global.fbVars.ringLetzter === null) context.global.fbVars.ringLetzter = \"\";\n\nmsg.payload = context.global.fbVars.ringLetzter;\nmsg.topic = msg.topic + \"ringLetzter\"; // Variablenname\n \nreturn msg;","outputs":1,"valid":true,"x":2844,"y":2058,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]},{"id":"2b677937.d49886","type":"function","name":"ringAktuell (letzte Rufnummer, die gerade aktuell anruft)","func":"if (context.global.fbVars.ringAktuell === null) context.global.fbVars.ringAktuell = \"\";\n\nmsg.payload = context.global.fbVars.ringAktuell;\nmsg.topic = msg.topic + \"ringAktuell\"; // Variablenname\n \nreturn msg;","outputs":1,"valid":true,"x":2846,"y":2094,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]},{"id":"eff91bc4.1006e8","type":"comment","name":"schreibe ioBroker Variablen für Vis","info":"","x":2764,"y":2014,"z":"64b98f40.9b467","wires":[]},{"id":"3eeee7c5.c11118","type":"comment","name":"schreibe ioBroker Listen für Vis","info":"","x":2787,"y":2366,"z":"64b98f40.9b467","wires":[]},{"id":"66ae1a23.9951e4","type":"function","name":"listeConnect, alle aktuellen Gespräche","func":"\nvar listeConnect = context.global.fbVars.listeConnect;\n\n\nvar zeitstempel = msg.dateStart; // Zeit des RING\n\n\nfunction datum(zeitstempel) {\n var jahr = zeitstempel.substring(6,8);\n var monat = zeitstempel.substring(3,5);\n var tag = zeitstempel.substring(0,2);\n var stunde = zeitstempel.substring(9,11);\n var minute = zeitstempel.substring(12,14);\n var sekunde = zeitstempel.substring(15,17);\n\n //var uhrzeit = stunde + \":\" + minute + \":\"+ sekunde + \" \";\n var uhrzeit = stunde + \":\" + minute + \" \";\n\n //var datum = tag + \".\" + monat + \".20\" + jahr + \" \";\n //var datum = tag + \".\" + monat + \".\" + jahr + \" \";\n var datum = tag + \".\" + monat + \". \";\n \n var zeit = datum + uhrzeit;\n \n return zeit;\n}\n\n\n\n\n var text = '';\n for (var i = 0; i < listeConnect.length; i++) {\n text += datum(listeConnect[i].date) + \" \" + listeConnect[i].connectedNumber;\n text += (text ? '
\\n' : '');\n }\n\n\nmsg.payload = text;\n\nmsg.topic = msg.topic + \"listeConnect\"; // Liste der aktiv Anrufenden (Zustand: RING)\n\nreturn msg;\n","outputs":"1","valid":true,"x":2804,"y":2404,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]},{"id":"cd41ef70.32be1","type":"function","name":"anzahlRing (Summe der aktuellen Anrufer)","func":"msg.payload = context.global.fbVars.anzahlRing;\nmsg.topic = msg.topic + \"anzahlRing\"; // Variablenname\n \nreturn msg;","outputs":1,"valid":true,"x":2805,"y":2142,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]},{"id":"142d43ae.ebd2bc","type":"function","name":"anzahlCall (Summe der gehenden Rufe)","func":"msg.payload = context.global.fbVars.anzahlCall;\nmsg.topic = msg.topic + \"anzahlCall\"; // Variablenname\n \nreturn msg;","outputs":1,"valid":true,"x":2799,"y":2180,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]},{"id":"31ce296f.ce31d6","type":"function","name":"anzahlConnect (Summe der aktuellen Gespräche)","func":"msg.payload = context.global.fbVars.anzahlConnect;\nmsg.topic = msg.topic + \"anzahlConnect\"; // Variablenname\n \nreturn msg;","outputs":1,"valid":true,"x":2826,"y":2214,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]},{"id":"c01194b5.3fee68","type":"function","name":"ring (true ein oder mehrer RING aktiv)","func":"msg.payload = context.global.fbVars.ring;\nmsg.topic = msg.topic + \"ring\"; // Variablenname\n \nreturn msg;","outputs":1,"valid":true,"x":2794,"y":2260,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]},{"id":"3b01e59c.c4fe1a","type":"comment","name":"!!! Baustelle !!! hier entstehen die weiteren Listen auf Bais der JSON Arrays","info":"","x":2644,"y":2334,"z":"64b98f40.9b467","wires":[]},{"id":"d54540de.2abac","type":"comment","name":"Testanrufe, Einzelschritte vs. Call Generator unten","info":"","x":498,"y":1644,"z":"64b98f40.9b467","wires":[]},{"id":"91e1fc94.6e1e","type":"function","name":"listCall, alle aktuellen gehende Rufe","func":"\nvar listeCall = context.global.fbVars.listeCall;\n\n\nvar zeitstempel = msg.dateStart; // Zeit des CALL\n\n\nfunction datum(zeitstempel) {\n var jahr = zeitstempel.substring(6,8);\n var monat = zeitstempel.substring(3,5);\n var tag = zeitstempel.substring(0,2);\n var stunde = zeitstempel.substring(9,11);\n var minute = zeitstempel.substring(12,14);\n var sekunde = zeitstempel.substring(15,17);\n\n //var uhrzeit = stunde + \":\" + minute + \":\"+ sekunde + \" \";\n var uhrzeit = stunde + \":\" + minute + \" \";\n\n //var datum = tag + \".\" + monat + \".20\" + jahr + \" \";\n //var datum = tag + \".\" + monat + \".\" + jahr + \" \";\n var datum = tag + \".\" + monat + \". \";\n \n var zeit = datum + uhrzeit;\n \n return zeit;\n}\n\n\n\n\n var text = '';\n for (var i = 0; i < listeCall.length; i++) {\n text += datum(listeCall[i].date) + \" \" + listeCall[i].calledNumber;\n text += (text ? '
\\n' : '');\n }\n\n\nmsg.payload = text;\n\nmsg.topic = msg.topic + \"listeCall\"; // Liste der aktiv Anrufenden (Zustand: RING)\n\nreturn msg;\n","outputs":"1","valid":true,"x":2802,"y":2444,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]},{"id":"6f5afd4b.90a504","type":"function","name":"listeRing, alle aktuellen Anrufe (RING)","func":"\nvar listeRing = context.global.fbVars.listeRing;\n\n\nvar zeitstempel = msg.dateStart; // Zeit des RING\n\n\nfunction datum(zeitstempel) {\n var jahr = zeitstempel.substring(6,8);\n var monat = zeitstempel.substring(3,5);\n var tag = zeitstempel.substring(0,2);\n var stunde = zeitstempel.substring(9,11);\n var minute = zeitstempel.substring(12,14);\n var sekunde = zeitstempel.substring(15,17);\n\n //var uhrzeit = stunde + \":\" + minute + \":\"+ sekunde + \" \";\n var uhrzeit = stunde + \":\" + minute + \" \";\n\n //var datum = tag + \".\" + monat + \".20\" + jahr + \" \";\n //var datum = tag + \".\" + monat + \".\" + jahr + \" \";\n var datum = tag + \".\" + monat + \". \";\n \n var zeit = datum + uhrzeit;\n \n return zeit;\n}\n\n\n\n\n var text = '';\n for (var i = 0; i < listeRing.length; i++) {\n text += datum(listeRing[i].date) + \" \" + listeRing[i].callingNumber;\n text += (text ? '
\\n' : '');\n }\n\n\nmsg.payload = text;\n\nmsg.topic = msg.topic + \"listeRing\"; // Liste der aktiv Anrufenden (Zustand: RING)\n\nreturn msg;\n","outputs":"1","valid":true,"x":2802,"y":2484,"z":"64b98f40.9b467","wires":[["9cb70203.6349"]]}]