NEWS
[gelöst] Fritzbox - Adapter; unbekannt = "### ? ###" lässt sich nicht verarbeiten
-
Guten Abend,
ich spiele per Script an meinem Telefon View.
Dabei will ich die Telefonnummer abgreifen; sowie den Namen des Anrufers per tr-064 darstellen.
Klappt soweit.
Nur bei unbekannten Anrufen verzweifle ich derzeit.
Im Adapter lässt sich hinterlegen was angezeigt wird. Standard und bei mir ist "### ? ###".
Komischerweise lässt sich dies nicht verarbeiten. Es ist kein String (warum aber nicht; sieht doch so aus).
If Abfragen mit string klappen nicht.
Auch die Scripte hier im Forum, z.B.
http://forum.iobroker.net/viewtopic.php … mer#p20299
funktionieren bei unbekannten / unterdrückten Nummer nicht (zumindest bei mir nicht).
Obwohl es lt. Script ja abgegriffen wird:
if (!telefonbuchRufnummer[rufnummer]) { // undefinierte Rufnummern name = telefonbuchRufnummerNichtBekannt; // undefinierte Rufnummern
In meinem einfachen Script klappt es ebenfalls nicht.
! ````
// Telefon Anzeige in vis
! // Variablen
var Anrufer_Nr = "fritzbox.0.calls.ringActualNumber"; // Nr. des Anrufers
var Anrufer_Name = "tr-064.0.callmonitor.inbound.callerName"; // Name des Anrufers
var Sprache = getState("hm-rega.0.29816").val; // Auto Sprachausgabe
var request = require ('request');
! on ({id: Anrufer_Nr, valGe: 1}, function(obj) {
log ('Auslöser Telefon');
! // Name ermitteln
var name = "";
! if (obj.state.val === "### ? ###") { // undefinierte Rufnummern
name = "Unbekannt"; // undefinierte Rufnummern
} else {
name = getState(Anrufer_Name).val;
}
! // Bild ermitteln
switch (name) {
case 'Dieter Arbeit':
name = "Dieter";
setState('javascript.0.Status.Telefon.Bild_Nr', 1);
break;
default:
setState('javascript.0.Status.Telefon.Bild_Nr', 0);
break;
}
! setState('javascript.0.Status.Telefon.Name', name);
setState('javascript.0.Status.Telefon.Nummer', obj.state.val);// Sprachausgabe if (Sprache === true) { request('http://192.168.243.76:50000/track=tos-computer-03.wav'); setTimeout(setState('sayit.0.tts.text', name + " ruft an."), 3000); } //Telegram if (name ==='Unbekannt') { sendTo('telegram', "Telefon zu Hause:\n unbekannte Nummer ruft an."); } else { sendTo('telegram', "Telefon zu Hause:\n" + name + ", " + getState('javascript.0.Status.Telefon.Nummer').val + ", ruft an."); } View_change ('Telefon', 0); setTimeout(function() { View_change ('Titel', 0); }, 30000);
! });
! ````Bitte mal anschauen. Bin am verzweifeln.
mfg
Dieter
-
Also, ich bin nicht richtig weiter !
Wenn ich schreibe:
var nummer = getState('fritzbox.0.calls.ringLastNumber').val;
log (nummer);
log (typeof nummer);
log (nummer.length);
bekomme ich ausgegeben:
nummer = ### ? ###
type = string
length = 9
soweit alles richtig.
Wenn ich dann aber dazu setze:
if (nummer === "### ? ###") {
log ("richtig");
} else {
log ("nein");
}
bekomme ich -> nein.
Warum ???????????????????????
Hier für euch mal komplett (wer es testen möchte).
var nummer = getState('fritzbox.0.calls.ringLastNumber').val; log (nummer); log (typeof nummer); log (nummer.length); if (nummer === "### ? ###") { log ("richtig"); } else { log ("nein"); } for (z=0; z<=8; ++z) { log ('zeichen '+ (z+1) + ': ' + nummer.charCodeAt(z)); }
Hab mir unten auch mal den charcode anzeigen lassen.
Komme damit aber nicht richtig weiter (der code passt irgendwie nicht mit der utf16 Tabelle die ich im Netz gefunden habe.
Vielleicht sieht jemand den Fehler sofort.
mfg
-
ok,
hab jetzt folgende Lösung (warum das ursprüngliche nicht klappt weiß ich nicht)
if (nummer === String.fromCharCode(35,35,35,160,63,160,35,35,35)) { // charCode entspricht "### ? ###" log ("richtig"); } else { log ("nein"); }
d.h.
ich überprüfe einfach ob der charCode passt.
Damit bekomme ich als log : richtig !
mfg
-
probier doch mal mit
var str = "### ? ###"; if(str.test(nummer)){ "tue dies tue das" }
-
Deinen code versteh ich nicht.
mfg
-
Deinen code versteh ich nicht.
mfg `
Die .test() Methode prüft einen String auf dessen Inhalt, und gibt dann true oder false zurück.von mir aus so
var str = "### ? ###"; if(str.test(nummer)){ log('ja'); } else{ log('nein'); }
-
probier doch mal mit
var str = "### ? ###"; if(str.test(nummer)){ "tue dies tue das" } ```` `
Es kommt Fehlermeldung:
str.test is not a function
-
Müsste dies (wie oben im Code)
if (nummer === "### ? ###") { log ("richtig"); } else { log ("nein"); }
nicht das gleiche sein.
Und dies klappt eben nicht.
-
probier doch mal mit
var str = "### ? ###"; if(str.test(nummer)){ "tue dies tue das" } ```` `
Es kommt Fehlermeldung:
str.test is not a function `
Stimmt! Muss wohl so heissen….
var str = /### ? ###/
Kommt aber trotzdem false raus. Kann es sein das das "verbotene Zeichen" sind?
-
habe mittlerweile folgendes festgestellt:
Die Fritzbox übermittelt: "### ? ###"
Hierbei ist die Leertaste mit dem charCode 160 !!! benannt.
Im String ""### ? ###" ist der charCode der Leertaste 32 !!!
Also unterschiedlicher Code für Leertaste.
mfg
-
wie vermutet landet dein Code auch bei Nein !!!
var str = /### ? ###/; if(str.test(nummer)){ log('ja'); } else{ log('nein'); }
m.E. liegt es an der unterschiedlichen Behandlung der Leertaste.
mfg
D.Müller
-
Fehler gefunden:
var str = /### \? ###/; if(str.test(nummer)){ log('ja'); } else{ log('nein'); }
Das geht
-
bei mir geht es nicht.
… not a function
-
Also ich bleib jetzt bei meiner Lösung:
if (nummer === String.fromCharCode(35,35,35,160,63,160,35,35,35)) { // charCode entspricht "### ? ###" log ("richtig"); } else { log ("nein"); }
Die Fritzbox scheint die Leertaste anders zu übermitteln.
Und mit o.g. char… funktioniert es.
mfg
-
Jetzt schon:
var str = /### \? ###/; if(str.test(nummer)){ log('ja'); } else{ log('nein'); }
-
blauholsten
Deine Lösung klappt nicht !!!
-> Es klappt mit deinem String
-> Es klappt aber nicht mit dem String der die Fritzbox übermittelt.
Diese übermittelt als String einen anderen CharCode für die Leertaste.
Probier es mit dem Handy aus und schalt die Tel.Nr. aus.
mfg
Dieter
-
Okay!
PS Skript bitte als gelöst markieren.
-
Anbei das Script wie es nun bei mir läuft komplett:
! ````
// Telefon Anzeige in vis
! // Variablen
var Anrufer_Nr = "fritzbox.0.calls.ringActualNumber"; // Nr. des Anrufers
var Anrufer_Name = "tr-064.0.callmonitor.inbound.callerName"; // Name des Anrufers
var Sprache = getState("hm-rega.0.29816").val; // Auto Sprachausgabe
var request = require ('request');
! function weiter(obj) {
// Name ermitteln
var name = "";
! if (obj.state.val === String.fromCharCode(35,35,35,160,63,160,35,35,35)) { // undefinierte Rufnummern, charCode entspricht "### ? ###"
name = "Unbekannt"; // undefinierte Rufnummern
} else {
name = getState(Anrufer_Name).val;
}
! // Bild ermitteln
switch (name) {
case 'Dieter Arbeit':
name = "Dieter";
setState('javascript.0.Status.Telefon.Bild_Nr', 1);
break;
default:
setState('javascript.0.Status.Telefon.Bild_Nr', 0);
break;
}
! if (name === "") {
name = "Unbekannt";
} else {
setState('javascript.0.Status.Telefon.Name', name);
}
setState('javascript.0.Status.Telefon.Nummer', obj.state.val);// Sprachausgabe if (Sprache === true) { request('http://192.168.243.76:50000/track=tos-computer-03.wav'); setTimeout(setState('sayit.0.tts.text', name + " ruft an."), 3000); } //Telegram und log if (name ==='Unbekannt') { sendTo('telegram', "Telefon zu Hause:\n Unbekannte Nummer ruft an."); log("Telefon zu Hause: Unbekannte Nummer ruft an."); } else { sendTo('telegram', "Telefon zu Hause:\n" + name + ", " + obj.state.val + ", ruft an."); log("Telefon zu Hause: " + name + ", " + obj.state.val + ", ruft an."); } View_change ('Telefon', 0); setTimeout(function() { View_change ('Titel', 0); setState('javascript.0.Status.Telefon.Name', ""); setState('javascript.0.Status.Telefon.Nummer', ""); setState('javascript.0.Status.Telefon.Bild_Nr', 0); }, 30000);
! }
! on({id: Anrufer_Nr, change: "ne"}, function(obj) {
log ('Auslöser Telefon');
if (obj.state.val !== '') {
weiter(obj);
}
});
! ```` -
das "andere Leerzeichen" kommt nicht von der Fritzbox, sondern vom Adapter.
Ein Leerzeichen wird gegen ein nbsp; (non breaking space) ausgetauscht, damit die Länge bei html mit Festbreitenschrift passt.
Beim Mac erzeugt man ein nbsp; mit alt+Leertaste (aus dem Gedächtnis)
im Javascripteditor wird das dann auch grafisch angezeigt
Gesendet von iPhone mit Tapatalk
-
Vom Adapter - hab ich mir schon gedacht.
Trotzdem muss man das erst einmal wissen. Man versucht halt mit der normalen Leertaste eine if abfrage zu basteln und ist fast am verzweifeln warum dies nicht klappt.
Danke für den Tipp mit dem "alt + Leertaste".
Muss ich mal versuchen.
Wieder was gelernt.
Mit freundlichen Grüßen