Bei Anruf Mord (Anruferkennung mit der FRITZ!Box)

Bei Anruf Mord ist ein Thriller von Alfred Hitchcock aus dem Jahr 1954.
Wie man eine Bombe zündet oder auch nur ein Warnlicht einschaltet, wird im folgenden Beitrag beschrieben.

Voraussetzungen:
Callmonitor ist ein Dienst auf dem Port 1012 einer FRITZ!Box Fon, an dem ein Client zur Anzeige eingehender Anrufe betrieben werden kann. Der Port 1012 muss einmalig per analogen Telefon aktiviert werden: Telefoncode zum Öffnen des TCP-Ports: #965 und zum Schließen des TCP-Ports: #964 Diese Funktion wir ab der Firmware Version xx.03.99 von AVM unterstützt. Die eingehenden Anrufe haben das Format:
Datum; RING; ConnectionID; Anrufer-Nr; Angerufene-Nummer;
In IP-Symcon muss ein ‚Client Socket‘ mit der IP-Adresse der Box und dem Port:1012 angelegt werden.
Zusätzlich noch eine ‚Register Variable‘ mit der 'Übergeordneten Instanz vom o.g. ‚Client Socket‘ sowie dem folgendem Skript:

$callmonitor = explode(";", $_IPS['VALUE']);
//IPS_LogMessage('FB_CALL_Monitor',print_r($callmonitor,1));

$id_wf = zzzzz;  // ID des WebFront zur Visualisierung

if ($callmonitor[1] == "RING"){
    WFC_SendNotification ($id_wf, "Ankommendes Gespräch!", "Von:".$callmonitor[3]." An:".$callmonitor[4], "", 60);
    if ($callmonitor[4] == "045130500511"){   // eigene Tel.-Nummer
   		// IPS_RunScript(aaaaa);
    }
}

if ($callmonitor[1] == "CALL"){
    WFC_SendNotification ($id_wf, "Abgehendes Gespräch!", "Von ".$callmonitor[4]." wird ".$callmonitor[5]." angerufen!", "", 60);
}

if ($callmonitor[1] == "CONNECT"){
    WFC_SendNotification ($id_wf, "Anruf angenommen!", $callmonitor[4], "", 60);
    // IPS_RunScript(xxxxx);
}

if ($callmonitor[1] == "DISCONNECT"){
    WFC_SendNotification ($id_wf, "Anruf beendet!", $callmonitor[4], "", 60);
    // IPS_RunScript(yyyyy);
}

MST

PS: special thanks to Nall chan

Danke für das Skript bzw. die Anleitung. Funktioniert einwandfrei.

Eine Frage am Rande. Ist es möglich, wenn ich bspw. eine meiner MSN´s anrufe und dann noch einen Zahlencode anfüge, diese in IPS auszulesen und dann eine Aktion entsprechend zu starten?

Beispiel:

Ich rufe meine Rufnummer mit meinem Handy an, dann geht meine Fritzbox dran und ich gebe dann eine Zahl bspw. 4000 ein. Daraufhin erkennt IPS, dass es sich um den Befehl „Garage öffnen“ handelt.

Ist so etwas möglich? Ein sprachgesteuertes Menü, mit dem ich nur über ein Passwort Zugriff habe ist wahrscheinlich so mit der Firtzzbox IPS nicht möglich …

Funktioniert wunderbar an meiner Fritzbox 7490! Endlich hab ich wieder eine simple Anruf-Anzeige auf meinen Dreamboxen :slight_smile:

DANKE (auch an Michael)!

Grüße,
Chris

Hey,

erstmal danke für dieses nette kleine Script!! Trotzdem habe ich mal eine Frage. Ist es irgendwie möglich anstatt der Nr. den Namen des Anrufers anzuzeigen??

danke und Gruß Bernd

Abend Bernd!

Ich bin mir grad nicht 100% sicher, aber glaube im „Fritzbox SOAP“ Thread wurde das Thema „Rückwärtssuche“ über verschiedene Anbieter immer wieder behandelt. Auch im „Fritzbox Anruferliste“ Thread und im Wiki ist die Rückwärtssuche mit eingebaut :slight_smile: Also einfach „klauen“ :wink:

Grüße,
Chris

Hey Bayaro,

Ich habe mich nun bei einigen Skripten bedient! Soweit so gut! Die Rückwärtssuche über das örtlich funktioniert! Nur habe ich damit das Problem, dass ich zu den Handynummern keine Namen bekomme. Nun dachte ich wie vorgeschlagen an die Telefonbuch XML der Fritzbox.

Nur wie kann ich die XML Datei nach einer bestimmten Rufnummer durchsuchen? Und den dazugehörigen Namen ausgeben?
Ich bin für jeden Rat dankbar.

Vielleicht sollte ich auch einfach mal eine Nacht drüber schlafen, manchmal sieht man den Wald vor lauter Bäumen nicht mehr.

Gruß Bernd

Abend Bernd!

Öhm…meine Skripte? Die FritzBox-SOAP-Skripte hier stammen aus der Feder von Nall chan! So gut bin ich noch lange nicht :eek:
>> FritzBox mit SOAP auslesen und steuern

Bzgl. XML vom FritzBox Telefonbuch durchsuchen. Joa…keine Ahnung, hab mir die XML noch nie angeschaut :smiley:
Dürfte aber nicht weiter problematisch sein. Da kann dir Nall chan sicher einen Tipp geben :slight_smile:

Die XML wird ja vmtl. in ein Array eingelesen und dann könnte man mit sowas in der Art arbeiten!?

function SearchArray($value, $key, $array) {
   foreach ($array as $k => $val) {
   	if ($val[$key] == $value) {
			return $k;
		}
   }
	return NULL;
}

>> PHP: array_search - Manual

Grüße,
Chris

Das Problem ist der Faktor Zeit.
Äh… nicht meine…
Sondern wenn das Event des Anrufens ausgelöst wird, dann mal eben schnell den Anrufer aus der FB holen, wird einfach zu lange dauern.

Alternativ das Telefonbuch als XML oder CSV aus der FB downloaden und immer mit dieser Offline-Version arbeiten. Das könnte klappen.
Michael

Hallo Michael

Das abholen und eine offline Versionsnummer machen war der Plan nur habe ich noch nicht so richtig den roten Faden gefunden um in der XML Datei nach einer Rufnummer zu suchen! Hast du eine Idee ? Evtl über den Umweg die XML in ein Array zu schreiben und dann in dem Array suchen ?

Gruß Bernd

Xpath ist eine Funktion mit der du XMLElemente Filtern kannst.
Bin gerade an Handy, aber schau mal in die PHP-Doku bei de.PHP.net
Dort steht glaube ich ein Link, mit Beispielen.
Michael

Moin!

Hab mal ein Beispiel mit DOM-XPath aufgenommen :slight_smile:
>> IP-Symcon - Wie kann ich… 2.0 - Seite 5

Grüße,
Chris

Hallo Jungs,

Ich berichte dann mal! Das mit, bei jedem Anruf live das Telefonbuch abholen, funktioniert bei der 7390 Problemlos in akzeptablere Zeit. Ich lege es mir dann in ein Array und durchsuche dieses. Falls nichts gefunden wird so suche ich noch bei Das Örtliche! Die ganze Aktion dauert bei 234 Nummer in der Fritzbox mit anschließender online Suche 1,5-1,7 sec. Je früher die Nummer gefunden wird desto weniger Zeit wird natürlich benötigt.

Ich würde sagen durchaus akzeptabel! Nun geht es an Sonos/Heos und Enigma2 Ausgabe.

In diesem Sinne

Gruß Bernd

Moin Bernd!

Klingt gut :slight_smile: Magst du dein Skript mal hier online stellen? Evtl. können noch andere das gebrauchen :slight_smile:

Bzgl. Enigma-Ausgabe findest du hier das passende (auch eine Ausgabe über mehrere Zeilen/Zeilenumbruch möglich):
IP-Symcon - Wie kann ich… 2.0 - Seite 4

Bzgl. Sonos-Ausgabe, da gibt es genug Thread hier mit Sprachausgabe/TTS über z.B. IPSSonos, PHPSonos, oder einfach so. Zu Heos gab ich meine ich auch mal was, da bin ich mir aber nicht sicher.

Grüße,
Chris

Moin,

hat hier schon jemand an das bevorstehende Telnetproblem gedacht? AVM wird Telnet ja in zukünftigen Firmwares nicht mehr unterstützen?

Oder arbeitet der Callmonitor unabhängig von Telnet?

Schöne Grüße
Stephan

Ja. Hat nix mit Telnet zu tun.
Michael

Die neue/gute Methode, um mit der FritzBox zu „sprechen“, ist SOAP. Von daher…wer braucht Telnet? :slight_smile:
>> FritzBox mit SOAP auslesen und steuern

Edit: Zu laaangsam

Grüße,
Chris

Hallo Chris,

anbei mein Script, es muss lediglich die ID des SOAP Scripts eingefügt werden, welches das Telefonbuch als XML von der Fritzbox holt. Anschließend kann das Script z.b. bei Anruf Mord Includiert werden und mit Suche(‚Rufnummer‘) verwendet werden.

ich hoffe es ist akzeptabel für euch, ich bin ja kein PHP Meister

Gruß Bernd

<?
/*Ein Script von Teufel24111991 Aus dem IP-Symcon Forum*/
/********** Dises Script liest den Namen zu einer Rufnummer aus dem FritzBox Telvonbuch oder Das Örtliche aus ***////

$Telefonbuchscript_ID = 20434;      //Hier ist die ID des XML-Telefonbuch-Scriptes einzutregen

/*Die Funktion wird aufgerufen mit Suche('Rufnummer');*/


/////////////////////////////////////////////////
//                                             //
//*Ab Hier muss nichts mehr geändert werden!! */
//                                            //
////////////////////////////////////////////////

function Suche($telefonnummer){

global $Telefonbuchscript_ID;
//Telefonbuch aus der Fritzbox holen und dann vergleichen
include(IPS_GetScriptFile($Telefonbuchscript_ID)); 	//XML Telefonbuch Includieren
$XML = simplexml_load_string($phonebook);          //XML-Datei in Variable ablegen
$a = 0;
$Kontakte_alle = $XML->phonebook->contact;         //XML_Datei auf Kontakte kürzen
$Anzahl_Kontakte=count($Kontakte_alle);            //Anzahl der Kontakte ermitteln

//XML Datei Auslesen und Neues Array mit den Rufnummern zusammensetzen
while ($a <= $Anzahl_Kontakte-1){
    //Name Auslesen und von UTF8 decodieren
	$Name_UTF8 = $XML->phonebook->contact[$a]->person->asXML();
 	$Name = utf8_decode($Name_UTF8);
	

//Rufnummer Auslesen////////////////////////////////////////////////////////
	$Rufnummer_alle = $XML->phonebook->contact[$a]->telephony->number;
	$Anzahl_nummern=count($Rufnummer_alle);            //Anzahl der gespeicherten Rufnummern Pro Person ermitteln
	//Wenn nur eine Rufnunmmer Eingetragen ist
	If ($Anzahl_nummern == 1){
	   (string)$Rufnummer = $XML->phonebook->contact[$a]->telephony->number->__toString();
		If($Rufnummer == $telefonnummer){  //auf zu suchende Rufnummer Vergleichen
			$Treffer = $Name;
			break;                           //Schleife Abbrechen da Treffer gefunden
			}
	}
	else //Wenn mehr als 1 Rufnummer eingetragen ist
	{
		$b=0;
      while ($b <= $Anzahl_nummern-1){    //Für jede Rufnummer einen Anhang im Array erstellen und nummer Anhängen
      (string)$Rufnummer = $XML->phonebook->contact[$a]->telephony->number[$b]->__toString(); //Rufnummer aus XML holen
		If($Rufnummer == $telefonnummer){         //auf zu suchende Rufnummer Vergleichen
			$Treffer = $Name;
			break;                              //Schleife Abbrechen da Treffer gefunden
		}
	   $b++;
	}
}
	If(!empty($Treffer)){         //Wenn Treffer einen Namen enthält schleife Abbrechen (Schneller)
		break;
	}
	 $a++;
}
If(empty($Treffer)){ //Wenn im internen Telefonbuch nichts gefunden wurde bei das Örtliche nach Teilnehmer suchen
//Rückwertssuche bei Das Örtliche wenn nichts im Internen Telefonbuch gefunden wurde
	$data=Sys_GetURLContent("http://www.dasoertliche.de/Controller?form_name=search_inv&ph=$telefonnummer");
	if(preg_match('/na: "(.*)"/', $data, $result))  $Name_ist     = $result[1];
	If(empty($Name_ist)){  					//Wenn Online kein treffer gefunden wurde die Rufnummer in Name_ist schreiben
		$Name_ist = $telefonnummer;
	}
   $Name_ist = strip_tags($Name_ist); //XML-Befehhle entfernen
	return  $Name_ist;                 //Name zurückgeben
}else{

$Treffer = strip_tags($Treffer);    //XML-Befehhle entfernen
return  $Treffer;                   //Name Zurückgeben
}


}


?>

Danke fürs Veröffentlichen/Teilen :slight_smile:

Grüße,
Chris

Hey,

Über Feedback würde ich mich freuen ob es bei ich auch funktioniert! Kann übrigens sagen das es auf der 7490 auch funktioniert.

Gruß Bernd