Hab fertig ... (J)Fritz Anrufmonitor für MCE

Anbei ein Screenshot ->

anrufliste2.jpg

Super.

Kannst Du bitte erklären wie du an die Daten aus der FritzBox kommst.
Rufst Du die FritzBox Webseite auf und grebst die Daten raus, oder gibt es eine Schnittstelle zur FritzBox?
Das würde ich auch gerne nachbauen. Ich benötige aber die MCE nicht. Ich möchte mir eine einfache html/php Seite erstellen.

Danke Thorsten

Steht doch da… JFritz

Das ist eine Zusatzsoftware, die du brauchst

Hallo Thorsten,

also ich mache beides … :wink: Wie das geht ? Also …

1.)Erstmal brauche ich ja , wie bei ISDN, einen Trigger. Hierfür nutze ich den Anrufmonitor der Fritzbox. (Zum Aktivieren des Anrufmonitors wählst Du #965 an Deinem Telefon. Es sollte ein positiver Bestätigungston zu hören sein. Zum Deaktivieren des Anrufmonitors wählst Du #964. Auch hier sollten Sie einen positiven Bestätigungston hören.)

2.) Im IP_SYMCON legtst du zuerst eine Comport Instanz an und eine Register Variabele (I/O Modul). Der Register Variabele verpasst du eine IP_SYMCON Variabele wie z.B. „Fritzbox“. Wähle hier auch „Overwrite“. Beide Komponenten musst du mit einander verbinden (rechtsklick auf das Comport Modul und dann Connect zur Variabelen Instanz). In der Comport Instanz gehst du auf „Configure COM“ und stellst unter LAN deine IP Adresse der Fritzbox und den Port 1012 ein. Nun nur noch den roten Knopf anklicken (wechselt von "Disconnect auf Connect, aber weiterhin rot) und zum guten Schluß noch auf „Apply“ klicken und der Connect Button sollte von rot auf grün wechseln.

3.) So, ab jetzt kannst du schon alle Anrufmonitor Ausgaben über " Watch" Funktion der Variabelen „Fritzbox“ mitlesen. (Ruf dich mal selber an) Habe nun ein „Init“ Script erstellt, das von „Fritzbox“ -> OnChange -> getriggert wird.
Dieses Script wertet nun den Inhalt von „Fritzbox“ aus. (… Ring … , … Call … , … Disconnect …) Sobald ein „DISCONNECT“ drin steht, setzt das Init Script den ScriptTimmerEvent für das eigentliche Anruflisten Script (nach 60 Sek.)
Warum die Verzögerung? Nach Disconnect holt sich ja das JFritz Programm erst mal die Liste aus der Fritzbox (bei mir waren es mal 3865 Einträge, das dauert) und macht dann ggfs. noch ein „Reverse Lookup“ der Rufnummer.

4.) Erst nach dem dies durch ist, öffne ich die JFritz XML Datei „jfritz.calls.xml“ und „jfritz.phonebook.xml“ (dafür die Verzögerung), ziehe die erste Zeile aus der „jfritz.calls“… suche die Nummer im JFRitz Phonebook und wenn diese dort nicht zu finden ist … schaut das Script noch schnell bei www.telefonauskunft.de (KlickTel) vorbei …

5.) Aus den so ausgelesenen und gefilterten Zeilen (Ich nehme nur „Call_in“ und Call_in_failed" Anrufe in die Liste auf, was soll ich mit „Call_out“?MSN 24 ist mein Fax und wird auch ausgefiltert …) bau ich eine HTML Tabelle auf (siehe Screenshot im letzten Post) und füge diese in ein HTML Template ein.

Alle Grundlagen dafür findest du im Script von Zapp ->AnswerMachine.ips.php

Jetzt fragst du dich bestimmt, warum ich „dösel“ denn JFritz nutze und nicht gleich den Anrufmonitor der FB weiter auswerte. Klar, das wäre kein Problem, aber JFritz hat ja noch 1-2 Vorteile.

1.) Rückwertssuche über „wws.dastelefonbuch.de“ integriert
2.) Starten von ext. Programm bei Anrufeingang (MCE_Messages.exe)
3.) Gute Phonebook GUI…

Also besonders Punkt 3 wäre recht zeitintensiv dies nachzubauen.

Und ich bin von Haus aus Faul … :wink:

Herzlichen Dank für die sehr ausführliche Antwort.

@Thorsten

Gern geschehen … kommst du denn jetzt zu recht oder benötigst du noch Hilfe?

Ich habe die Tage auch „Version 2“ fertig …

Hierzu habe ich hier eine Umfrage gestartet -> http://www.mce-community.de/forum/index.php?showtopic=18942

und ein Bild der Version 1 ->
http://www.mce-community.de/forum/index.php?showtopic=18941

und ein Bild der Version 2 ->
http://www.mce-community.de/forum/index.php?showtopic=18943

eingestellt. Welche gefällt dir besser ? Hast du noch eine Anregung?

Hallo Community,

hier ,wie versprochen, der Link ins mce-community-forum, zum letzten Screenshot, Anleitung und Sourcen des Scripts->

http://www.mce-community.de/forum/index.php?showtopic=13556&st=22

Für die „nicht mce’ler“ unte euch: einfach statt der „mce_fb.html“, nur die „nackte“ (und erst nach dem ersten Durchlauf es Script erstellte) Datei „fb_calls.html“ aufrufen. Die Datei stellt eine einfache HTML Tabelle mit denAnrufen dar. (Die im Screenshot im grauen Rahmen zu sehen ist).

Ein schönes Wochenende (damit :wink: ) wünscht …

Hallo Obi,
Danke für das Script. Funzt super. Gibt es vielleicht noch eine Möglichkeit die Anrufliste in den Designer zu bringen, wer super.

cu uwe

Hallo Uwe,

schön das dir das Skript gefällt. Das mit dem Designer müsste eigentlich recht einfach sein. Im Script wäre dann nicht ein HTML Seite zu erstellen, sondern einfach eine array Var zu füllen, die du dir dann im Designer in einem Memofeld anzeigen läst. Bekommst du das hin?

Habe nicht so viel Ahnung von PHP. Wer schön wenn Du mir da Helfen könntest mit einem sript.

Aber ich habe noch ein Problem. Die FB_Init wird getriggert von der Variablen Fritzbox, wird sie aber nicht. Die Stringvariable Fritzbox ändert sich auch nicht. Es steht kein Eintrag drin. Wenn ich die FB_Init manuell starte wird der Timer auch nicht gesetzt. Das Script Anrufliste funzt manuell.

cu uwe

gehen wir das mal „Step by Step“ an. Ich stell mal ein paar Fragen.

1.) Hast du den Comport als I/O Instanz angelegt?
2.) Hast du im ComPort die IP deiner Fritzbox un den Port 1012 eingetragen?
3.) Ist nach „apply“ der Connect Button grün geworden?
4.) Hast du eine Register Variabele als Splitter Instanz angelegt?
5.) Hast du die Fritzboxvariabele der Register Variabelen zugeordnet?
6.)Hast du den Comport mit der Register Varieabelen verbunden?

Wenn du diese ersten 6 Fragen alle mit „ja“ beantworten kannst, solltest du zumindest in der String Variabelen Fritzbox bei jedem Anruf mit „Watch Variabele“ oder enem einfachen zusätzlichem echo Zeile etws angezeigt bekommen… Ich hab dir das Script mit einem zusätzlichem „echo“ mal angehangen. Ich vermute das noch etwas mit den oben angesprochene Punkten bei dir nicht stimmt. Der Script Intervall wird ja auch nur angestossen, wenn z.B. ein ‚10.02.07 16:36:15;DISCONNECT;0;89;‘
'" in der „Fritzbox“ steht. Zum Test kannst du mal in die String Variabele mit „Modify“ ->
‚10.02.07 16:36:15;DISCONNECT;0;89;‘
rein schreiben und dann das FB_Init Script anstossen (Execute). Dann sollte auch der Timmer starten.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : FB_Init.ips.php
Trigger  : OnChange -> Fritzbox
Interval : 
*/
// Auswertung der Fritzbox Variabelen.
$FBstatus = GetValueString('Fritzbox');
echo (substr($FBstatus,18,10)."
" ; // zum Debuggen
// Hier sollte im Ausgabefenster vom IP-SYMCON z.B. DISCONNECT ausgegeben werden
if (substr($FBstatus,18,10) == "DISCONNECT"){
// Warte eine halbe Minute bevor du die Liste holst ...
IPS_SetScriptTimer('Anrufliste_FB',30) ;
}
?>

Hallo,

Die Punkte 1-6 sind alle so angelegt. Habe Dein Script mit Echo mal probiert, es kommt folgende Fehlermeldung.

<b>Parse error</b>: parse error, unexpected ‚;‘ in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>13</b><br />

Also irdendwo klemmt es. Ist sichelich ein kleines Problem was ich immer wieder falsch mache.

Jetzt sollte es gehen …
Was siehst du denn, wenn du die Variablele Fritzbox mit der rechten Maustaste anklickst und „evolate/watch“ auswählst … und dann „Watch“ anklickst … danach dich selber mal übers Handy anrufst …?

Du solltest dann die einzelnen Meldungen (Ring, Connect, Disconnect) im Fenster angezeigt bekommen. Den Inhalt bitte hier mal posten.

<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : FB_Init.ips.php
Trigger  : OnChange -> Fritzbox
Interval :
*/
// Auswertung der Fritzbox Variabelen.
$FBstatus = GetValueString('Fritzbox');
echo substr($FBstatus,18,10) ; // zum Debuggen
// Hier sollte im Ausgabefenster vom IP-SYMCON z.B. DISCONNECT ausgegeben werden
if (substr($FBstatus,18,10) == "DISCONNECT"){
// Warte eine halbe Minute bevor du die Liste holst ...
IPS_SetScriptTimer('Anrufliste_FB',30) ;
}
?>

Es klappt jetzt wunderbar. Danke für Deine Hilfe. Jetzt noch eine Einbindung im Designer, das wärs.

cu uwe

Hallo Uwe,

woran lag es denn? Gib den anderen dein Wissen doch bitte auch weiter.
An das Memo Feld mach ich mich die Tage mal ran und poste dann hier den Code…

Hallo Uwe,

bevor ich in die falsche Richtung code … wie stellst du dir denn das im Designer theoretisch vor? Würde es dir reichen wenn die Liste, statt als HTML Datei, als String in einer Varieabelen landen würde?

Ich wollte mich auch noch bei allen bedanken,die mich bei dem Script auf den richten Weg begracht haben …

Danke @zapp … für das „Mutterscript“ AnswerMachine …

Danke @Tonic1024 für den Tipp mit „simplexml()“ …

Danke @pharsy für den Tipp wie man die Fritzbox anbinden kann !

:slight_smile:

Ich habe nur das neue Script von Dir mit der einen Klammer mehr verwendet und schon ging es.

als String in einer Varieabelen würde mir genügen, wer super wenn Du es machen würdest.

Nochmal vielen Dank

cu uwe

Hallo Uwe,

da das mit dem String recht einfach ist, hab ich das „mal schnell“ umgesetzt.
Anbei mein Scriptentwurf. Wenn du es startest (Execute) siehst du im Fenster darunter die Ausgabe. Ich habe die Felder mit TABs getrennt. Kannst du löschen oder hinzufügen von " " die Tabs verändern. Wenn die Ausgabe für dich ok ist, dann lege im ip-symcon die String-Variabele „Fritzlog“ an und entferne die beiden „//“ vor „SetValueString()“. Gib mal Feedback ob es so ok ist. :confused:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Anrufliste.ips.php
Trigger  : FB_Init Script -> bei Änderungen von -> (string)Var=Fritzbox
Interval : Einmalige Ausführung nach 30 Sekunden verzögerung.
*/
// Jetzt gehts los ....
IPS_SetScriptTimer('Anrufliste_FB',0) ;
if (file_exists('C:\Programme\JFritz\jfritz.calls.xml'))
{
// Ggfs. Pfad anpassen !!!
$xml = simplexml_load_file('C:\Programme\JFritz\jfritz.calls.xml');
}
else {
exit("Konnte Datei nicht laden. ");}
$count=1;
setlocale (LC_ALL, 'German_Germany.1252');
$Fritzlog = strftime('Aktualisiert am %A, den %d.%m.%Y, um %H:%M Uhr');
$Fritzcache = "Zeitpunkt		Rufnummer	Name			auf MSN				Calltype
\r" ;
$Fritzlog = $Fritzlog."
\r".$Fritzcache."
" ;
// Ab hier wird die XML Datei (jfritz.calls.xml) zerlegt.
foreach ($xml->entry as $entry) {
// Hier wird die Zeilenanzahl festgelegt.
if ($count == 30)
{
// SetValueString("Fritzlog",$Fritzlog);
echo $Fritzlog ;
return ;
}
$calltype = $entry->attributes() ;
$date = $entry->date ;
$caller = $entry->caller ;
if ($caller == "") {$caller = "Keine Nummer" ;}
$name = findNumberJF($caller) ;
$caller = str_replace ( '+49', '0', $caller) ;
if (($name == "Unbekannt") && ($caller != "Keine Nummer")) {
$name = findNumberDE($caller) ; }
$port = $entry->port ;
$route = $entry->route ;
$duration = $entry->duration ;
// die $route Abfrage filtert z.B. (bei mir) eine Faxnumer aus.
if ((($calltype == "call_in") OR ($calltype == "call_in_failed")) && $route != "24") {
$count = $count+1 ;


         // Übersetzung von deutschen Umlauten
         $name = str_replace("Ä","Ä",$name) ;
         $name = str_replace("ä","ä",$name) ;
         $name = str_replace("Ö","Ö",$name) ;
         $name = str_replace("ö","ö",$name) ;
         $name = str_replace("%F6","ö",$name) ;
         $name = str_replace("%FC","ü",$name) ;   //neu
         $name = str_replace("Ãœ","Ü",$name) ;
         $name = str_replace("ü","ü",$name) ;
         $name = str_replace("ß","ß",$name) ;
         $Fritzlog = $Fritzlog.$date."	".$caller."	".$name."		".$route."		".$calltype."
";

}
}
// wenn dir die Ausgabe gefällt, einfach die beiden Striche vor GetValue.... entfernen. Vorher die Stringvariablele im ip-symcon anlegen !!
SetValueString("Fritzlog",$Fritzlog);
echo $Fritzlog ;

function findNumberJF($caller)
{
// Ggfs. Pfad anpassen !!!
if (file_exists('C:\Programme\JFritz\jfritz.phonebook.xml'))
{
// Ggfs. Pfad anpassen !!!
$xml = simplexml_load_file('C:\Programme\JFritz\jfritz.phonebook.xml');
}
else {
exit("Konnte Datei nicht laden. ");}
$count=0;
foreach ($xml->entry as $entry) {
$nummer = $entry->phonenumbers->number ;
$name = $entry->name->firstname." ".$entry->name->lastname ;
   if ($nummer == $caller) {
   $count=$count+1 ;
   $treffer=$name ;
   }
}
if ($count == 1)
{
if ($treffer == "") {$treffer = "Falscher Eintrag im PB" ;}
return $treffer;
}
elseif ($count > 1) {
      // Prüft auf -> "Mehr als einmal im Phonebook?".
      return "Various Names";
   }
else {
// Keinen Eintrag gefunden.
return "Unbekannt" ;
 }
}

function findNumberDE($caller)
{
   $url_orig="http://www.telefonauskunft.de/inverseSearch.php?strasse=&newSearch=1&sid=lm996s9alvjlo7f5t7b1g1ngs2&vollstaendig=#TEL#";
   $url=str_replace("#TEL#","$caller",$url_orig);
   $handle=fopen("$url", "r");
   if (!$handle){
      // Kann URL nicht öffnen
      echo("ERROR : Kann URL nicht öffnen : '$url'
");
   }
   $lineNb = 0;
   $searchTag0 = '&Name=';
   $searchTag1 = '&Vorname=';
   $searchTag2 = '&Strasse';
   $found = 0 ;
   while(!$found && !feof($handle)) {
      $lineNb++;
      $buffer = fgets($handle);
        if (strpos($buffer, $searchTag0) !== false) {
        $found = 1 ;
        $startLN= (strpos($buffer, $searchTag0)+6) ;
        $endeLN = strpos($buffer, $searchTag1) ;
        $Lastname = substr($buffer, $startLN, ($endeLN-$startLN)) ;
        $startFN= (strpos($buffer, $searchTag1)+9) ;
        $endeFN = strpos($buffer, $searchTag2) ;
        $Firstname = substr($buffer, $startFN, ($endeFN-$startFN)) ;
        $foundName1 = $Firstname." ".$Lastname."
\r" ;
        $foundName1 = str_replace('+', ' ', $foundName1);
        }
      else {$foundName1 = "Unbekannt";}
   }
   fclose($handle);
   return $foundName1;
}

?>

Ich Danke Dir. Klappt und es ist so richtig. Habe daraus auch gleich gelernd.

Nochmals vielen Dank für die schnelle Hilfe.

cu uwe