NEWS
Anrufliste und Info der Fritzbox
-
In diesem "Neben-Topic" möchte ich meine Infoseite zur Fritzbox zeigen und einige Details dazu beschreiben.
Hier der Link zum Haupt-Topic:
https://forum.iobroker.net/topic/70692/vorstellung-meiner-visualisierungZu sehen ist die aktuelle Baustelle mit viel Platz für weitere Informationen. Rechts im Bild ein QR-Code für das Gast-WLAN.
Die Anrufliste kommt vom Adapter "tr-064", Datenpunkt "tr-064.0.calllists.all.json"
Die Symbole links in der Anrufliste haben mir ein wenig Kopfzerbrechen bereitet. Vom Adapter kommen an dieser Stelle nur Ziffern von 1 bis 4, welche den Anruftyp wie folgt kennzeichnen:
1: Eingehend
2: Verpasst
3: Ausgehend
4: AbgewiesenUm die Grafiken zu bekommen habe ich die JSON-Datei mit folgendem Skript modifiziert und in einen neuen Objekt abgelegt, welches dann VIS über das Widget "vis-inventwo - JSON Table" angezeigt wird.
// Anrufliste modifizieren und ablegen on ({id: 'tr-064.0.calllists.all.json', change: 'ne'}, function(){ var anruflisteJSON = (getState("tr-064.0.calllists.all.json").val); var myAnrufliste = anruflisteJSON.replace(/"type":"1"/g, '"type":"<img src=/vis.0/Hausautomation/Anruf_eingehend_32.png />"'); myAnrufliste = myAnrufliste.replace(/"type":"2"/g, '"type":"<img src=/vis.0/Hausautomation/Anruf_verpasst_32.png />"'); myAnrufliste = myAnrufliste.replace(/"type":"3"/g, '"type":"<img src=/vis.0/Hausautomation/Anruf_ausgehend_32.png />"'); myAnrufliste = myAnrufliste.replace(/"type":"4"/g, '"type":"<img src=/vis.0/Hausautomation/Anruf_abgewiesen_32.png />"'); myAnrufliste = myAnrufliste.replace(/SIP: /g, ''); myAnrufliste = myAnrufliste.replace(/callednumber/g, 'eigeneNr'); myAnrufliste = myAnrufliste.replace(/callernumber/g, 'eigeneNr'); setState("0_userdata.0.Anrufliste",myAnrufliste, true); });
Die Zeilen 8 - 10 modifizieren einige Feldnamen um eine einheitliche Abfrage zu ermöglichen.
Für VoIP-Anschlüsse wird vor der eigentlichen Rufnummer der hier nicht benötigte Text "SIP:" übertragen. Zeile 8 eliminiert diesen Text.
Zeile 9 und 10: In Abhängigkeit von der Anrufrichtung (eingehend oder ausgehend) wird die eigene Rufnummer entweder als "callednumber" oder als "callernumber" bezeichnet. Das erschwert eine spätere Auswertung (zumindest für meine Zwecke). Daher die Vereinheitlichung mit dem Feldnamen "eigeneNr".
Bei eingehenden Anrufe wird für einige Sekunden eine Infoseite eingeblendet:
Feld 1 zeigt die Telefonnummer des Anrufers (sofern übertragen)
Feld 2 den Gerätenamen des angerufenen Telefons (Kommt aus der Fritzbox)
Feld 3 Name des Anrufers (sofern im Telefonbuch der Fritzbox vorhanden)
Das Bild des Anrufers kommt ebenfalls aus der Fritzbox, sofern es dort hinterlegt ist.Das Bild aus der Fritzbox zu bekommen ist ein wenig knifflig, da es nur für kurze Zeit mit einer Session-ID aus der Fritzbox abgerufen werden kann.
Hier mein Skript dazu:
var timeout, command; var AltBild = getState("vis.0.control.data").val; //zwischenspeichern des alten Fensters function helligkeit(Helligkeit, Kontrast){ //Helligkeit und Kontrast des Anzeigebildschirms einstellen var SSH = require('simple-ssh'); var ssh = new SSH({ host: '192.168.xx.xx', //IP-Adresse des "Anzeige-Raspi" auf dem der Browser für den Anzeigemonitor läuft user: 'xxxxxxxxxx', pass: 'xxxxxxxxxx' }); ssh.exec('sudo ddcutil setvcp 10 ' + Helligkeit).start(); ssh.exec('sudo ddcutil setvcp 12 ' + Kontrast).start(); } function zurueck() { //nach Beendigung der Anrufanzeige Bilschirm auf vorherigen Zustand zurücksetzen setState("vis.0.control.instance", "FFFFFFFF"); setState("vis.0.control.data", AltBild); setState("vis.0.control.command", 'changeView'); } on({ id: 'tr-064.0.callmonitor.ringing' /* ringing */, change: 'ne' }, async (obj) => { //bei eingehendem Anruf var SSH = require('simple-ssh'); var ssh_Bild = new SSH({ host: '192.168.xx.xx', //IP-Adresse des Raspi auf den der tr-064 Adater läuft user: 'xxxxxxxxxx', pass: 'xxxxxxxxxx' }); if ((obj.state ? obj.state.val : "")) { (() => { if (timeout) { clearTimeout(timeout); timeout = null; }})(); timeout = setTimeout(async () => { timeout = null; var bildpfad = getAttr(getState('tr-064.0.callmonitor.inbound.json').val, 'imageurlcaller'); //Pfad einschließlich Session-ID zum Bild in der Fritzbox if(bildpfad === undefined){ command = ['cp /home/pi/kiosk/Unbekannt.jpg /home/pi/kiosk/Anruferbild.jpg'].join(''); //Wenn kein Bild vorhanden dann "Unbekanntbild" anzeigen ... }else{ command = ['curl -sL "',bildpfad,'" >/home/pi/kiosk/Anruferbild.jpg'].join(''); // ... sonst Anruferbild runterladen ... } ssh_Bild.exec(command).start(); // ... und ausführen var angerufenerName = getAttr(getState('tr-064.0.callmonitor.inbound.json').val, 'calleeName'); setState("0_userdata.0.Anrufziel", angerufenerName); //Anrufziel des eigehenden Anrufs setzen timeout = setTimeout(async () => { timeout = null; helligkeit(50,50); setState("vis.0.control.instance", "FFFFFFFF"); AltBild = getState("vis.0.control.data").val; setState("vis.0.control.data", "Hausautomation/Anruf"); setState("vis.0.control.command", 'changeView'); setTimeout(zurueck,20000); }, 2000); }, 1500); } else { (() => { if (timeout) { clearTimeout(timeout); timeout = null; }})(); } })
Im Skript sind, obwohl es problemlos läuft, noch ein paar Unsauberkeiten enthalten:
oder auch
Vielleicht kann mir ja jemand einen Tipp geben, wie das zu beheben ist...