[Frage] Freetz Callmonitor als "Standalone" möglich?

obelix76

Neuer User
Mitglied seit
7 Feb 2006
Beiträge
52
Punkte für Reaktionen
0
Punkte
6
da ich leider bei mir das Freetz von der Fritte verbannen mußte (irgendwie "zickte" die 7490 in letzter Zeit massiv rum, selbst nur mit einem minimalst-Freetz), wollte ich mal fragen, ob es den Freetz Callmonitor irgendwie als "Standalone"-version gibt, um ihn mir z.B. auf dem Raspberry Pi zu installieren. (Ein Raspi läuft hier eh mittlerweile mit, der hat mittlerweile auch viele Funktionen, die sonst die Fritte hatte, mit übernommen).
Daß der Pi einen Webserver laufen haben muß, ist mir klar. Der Callmonitor wird ja über eine Weboberfläche konfiguriert.

Kann mir jemand einen Tip geben, wie ich den Callmonitor auf meinen Raspi bekomme?

Danke schon mal vorab!
 
Moins

Na, wenn du schon einen RaspPi am Laufen hast...
Dann ist doch der beste Callmonitor installierbar: apt-get -y install asterisk :D

Als Plugin für OSMC/KODI gibt es auch: Fritz!Box Callmonitor
...für Asterisk: kodi-pbx-addon
 
Danke für den Tipp - aber Asterisk ist jetzt aber ein klein wenig wie mit Kanonen auf Spatzen geschossen, oder? ;)
OSMC/Kodi läuft auf dem Raspi nicht. Der tut wirklich nur Serverdienste.

Ich wollte mich eigentlich nicht ewig in ein aderes System einarbeiten müssen, daher die Frage, ob mit dem Freetz-Callmonitor vielleicht auch was im Standalone-Betrieb geht. Ich hab jetzt erstmal ein - deutlich weniger komfortables - Shell-/PHP-Script geschrieben, aber das ist halt sehr basic. Was ich wirklich vermisse ist die Rückwärtssuche. Aber dazu fehlt mir die Zeit, da was brauchbares hinzustricken.
 
Ich habe ziemlich lange mit dem jAnrufmonitor gearbeitet. Der hat ähnliche Funktionen wie der Callmonitor. (Rückwärtssuche, Scriptaufruf bei Anruf, usw.)
Brauchst dazu nur die RemoteCapi der Fritzbox konfigurieren. (Signalisierung des Anrufs auf dem Pi)
Bin mir nicht sicher, ob du dazu freetz brauchst oder ob das mit der originalen FW funktioniert.
 
Hallo
Gibs hier was neues?
Habe keine Lust mehr meine Fritzbox mit einem Freetz zuversehen.
Würde aber gerne die CallmonitorApp ausm Freetz auf meinem Raspberry laufen lassen um über Telefonanrufe auf meinen Enigma2 Boxen informiert zu werden. Sollte doch theoretisch kein Problem sein die Telnetschnittstelle (Port 1012 auf der Fritzbox) vom Raspberry aus abzurufen und als Message an die EnigmaBoxen zuschicken.
 
Zuletzt bearbeitet:
leider nein - ich habe keine Möglichkeit gefunden, den Freetz Callmonitor ohne Freetz zu betreiben (es ist halt auch der *Freetz* Callmonitor ;)). Auch die anderen Vorschläge, die hier im Thread kamen, hatten nicht wirklich was zielführendes für mich gebracht.

Am Ende habe ich dann ein sehr rudimentäres, auf der Bash ausgeführtes PHP-Script an den Start gebracht, was sich auf den Callmonitor-Port der Fritte verbindet und dann je nach den Events (siehe dazu das Wiki) Aktionen ausführt. Bei mir z.B. über Netcat an andere Rechner die Caller-infos raussenden und ein Display mit den Anruferdaten befüllen. Eine Namensauflösung Rufnummer -> Teilnehmer hatte ich auch mal drinnen, aber da die ganzen Telefonverzeichnis-Anbieter natürlich in den meisten Fällen keine API für ihre Suchen rausgeben und man durch die Webseiten durchparsen muß "von Hand" ist bei jeder Änderung der Webseite beim Anbieter auch der Filter neu zu schreiben. Aktuell scheint meine Rückwärtssuche mal wieder rumzuspinnen, ich hab aber keine Zeit, mich da drum zu kümmern...

Alles in Allem bleibt nur: selbst Hand anlegen.
 
Hallo obelix76
Kannst du dein verwendetes Script bitte mal zur Verfügung stellen.
Würde gerne mal sehen ob ich es irgendwie hin bekomme.

Danke für deine schnelle Antwort und hoffentlich das Script
 
@script: ungern, da meine Programmierkünste katastrophal sind :D

aber ich will mal nicht so sein... Das Script habe ich mehr oder weniger selbst zusammengestümpert als "Übersetzung" und Erweiterung zu den hier veröffentlichten Scripten: http://www.wehavemorefun.de/fritzbox/Anrufmonitor_nutzen - da ich die Sprache Perl nicht beherrsche, habe ich es halt in PHP gemacht ;) Den Aufbau der Callmonitor-Rückmeldungen hatte ich - so meine ich mich jedenfalls zu erinnern - auch aus diesem Wiki geholt.

Disclaimer: Ich stelle das Script ohne Support, ohne irgendwelche Garantien auf Funktion usw. zur Verfügung. Jeder der es nutzt, muß selbst wissen, was er da tut und wie er sich ggfs. helfen kann! Außerdem wird das Script von mir nicht weiterentwickelt werden!

PHP:
#!/usr/bin/php -q
<?php
/**********************************************************************************************************************/
/*                                                                                                                    */
/* CallMonitor helper Script - liest Call Events von einer FritzBox                                                   */
/* Script Version: 1.0.2 vom 01.12.2015                                                                               */
/* Script Autor: obelix76, [email protected]                                                              */
/*                                                                                                                    */
/* syntax: path/to/script <Fritzbox-IP> <Fritzbox-Monitorport>                                                        */
/*                                                                                                                    */
/* Script als root über z.B. Cron starten und in regelmäßigen Abständen prüfen ob es noch läuft, ggfs. neu starten    */
/*                                                                                                                    */
/**********************************************************************************************************************/

$FRITZBOX=$argv[1];
$FRITZPORT=$argv[2];
$DOLOOKUPS="true";                //führe Reverse Lookups durch
$DOTELLOWS="false";                //führe Scoreprüfung bei Tellows durch; Benötigt kostenpflichtige Partner-ID 
                                //und API-Key in der Funktion tellows($nummer) !!!
$ORTSNETZ_self="Musterstadt";    //Für "Ortsnetzauflösung" wenn Ruf ohne Vorwahl reinkommt
//===============================================================================

function debugprint($variable){
        print_r($variable."\n");
}

function zeitformat($Sekundenzahl)
{
  $Sekundenzahl = abs($Sekundenzahl); // Ganzzahlwert bilden
  return sprintf("%02d:%02d:%02d", ($Sekundenzahl/60/60)%24,($Sekundenzahl/60)%60,$Sekundenzahl%60);
}

function tellows($nummer){
    $PARTNER = "Partner-ID";
    $APIKEY  = "API-KEY";
    $URL     = "http://www.tellows.de/basic/num/".$nummer."?xml=1&partner=".$PARTNER."&apikey=".$APIKEY;

    $result  = "";

    if ($DOTELLOWS){
        if ($nummer <> 0){
            //nur abfragen, wenn eine Rufnummer mitgeliefert wird
            $xml = simplexml_load_file($URL);
            $result.="Score ".$xml->score;
        }
        return($result);
    }
    else{
        return("Tellows Score Modul deaktiviert!");
    }
}

function reverse_lookup($nummer){
    $check = substr(trim($nummer),0,1);
    $nummer = urlencode($nummer);
    $url="http://www.dastelefonbuch.de/Rückwärtssuche/".$nummer;
    $webseite = @file_get_contents($url, true);
    if ($webseite === false){
        //Nichts vom Telefonbuchanbieter bekommen...
        //versuche, Rufnummer über lokales Telefonbuch aufzulösen
        $phonebook=file('/home/pi/callmonitor/phonebook.csv');
        foreach ($phonebook as $entry){
            if (strpos($entry, urldecode($nummer)) !== false){
                $results[]=$entry;
            }
        }
        if (isset($results)){
            $tmp=explode(";",$results[0]);
            $nummer=str_replace(array("\r\n", "\r", "\n"), '', $tmp[1]);;
        }
        else{
            //Rufnummer auch nicht im phonebook gefunden - versuche das Ortsnetz zu ermitteln und zurückzuliefern
            //das ganze Gerödel nur machen, wenn das erste Zeichen der übergebenen Rufnummer eine "0" ist
            if ($check=="0"){
                 $ovz=file('/home/pi/callmonitor/onk.txt');
                    for ($i = 6; $i>0; $i--){
                            $such=substr(urldecode($nummer), 0, $i);
                            foreach ($ovz as $entry){
                                    if (strpos($entry, $such) !== false){
                                            $results[]=$entry;
                                    }
                                    if (isset($results)){
                                            break;
                                    }
                            }
                            if (isset($results)){
                                        break;
                            }
                    }
                    if (isset($results)){
                            $ortsnetz = explode(";",$results[0]);
                    $nummer = "Rufnummer unbekannt, Ortsnetz ist ".$ortsnetz[1];
                    $nummer = str_replace(array("\r\n", "\r", "\n"), '', $nummer);;
                    }
                    else{
                            //ONK gefunden - Textmeldung zurückliefern
                            $nummer = "Rufnummer unbekannt, Ortsnetz konnte nicht ermittelt werden";
                    }
            }
            else{
                $nummer = "Rufnummer unbekannt, Ortsnetz ist $ORTSNETZ_self";
            }
        }
    }
    else{
        //Parsing für "dastelefonbuch.de" - funktionierte zum Datum 20151201
        $webseite=explode("<div class=\"vcard\">", $webseite);
        $webseite=explode("<div class=\"contact clearfix\">", $webseite[1]);
        $data_name=explode("<span itemprop=\"name\">", $webseite[0]);
        $data_name=explode("</span>", $data_name[1]);
        $nummer = $data_name[0];
        $data_streetloc=explode("<address>", $webseite[0]);
        $data_streetloc=explode("</address>", $data_streetloc[1]);
        $data_street=explode("<span itemprop=\"streetAddress\">", $data_streetloc[0]);
        $data_street=explode("<span itemprop=\"postalCode\">", $data_street[1]);
        $data_str=explode("</span>", $data_street[0]);
        $nummer.= ", ".trim($data_str[0])." ".trim($data_str[1]);
        $data_plz=explode("</span>", $data_street[1]);
        $nummer.= " ".trim(str_replace('</span>', '', $data_plz[0]));
        $data_loc=explode("<span itemprop=\"addressLocality\">", $data_street[1]);
        $data_loc=explode("</a>", $data_loc[1]);
        $nummer.= " ".trim(str_replace('</span>', '', $data_loc[0]));
    }
    return($nummer);
}

//Start des Hauptteils des Scriptes
$client=stream_socket_client("tcp://$FRITZBOX:$FRITZPORT", $errno, $errorMessage);

if ($client === false) {
    throw new UnexpectedValueException("Failed to connect: $errorMessage");
}

while(!feof($client)){
    $line=fgets($client);
    if (strstr($line, ";RING;")){    //Behandlung eingehender Rufe
        $CALLDATA=explode(";",$line);
        $NAME="";
        $NR=$CALLDATA[3];
        if ($DOLOOKUPS){
            $NAME=reverse_lookup($NR);
        }
        if ($DOTELLOWS){
            $TELLOWS=tellows($NR);
        }
        system("echo \"===new caller===\" | nc <IP> <Port>");
        system("echo \"Anrufzeit: $CALLDATA[0]\" | nc <IP> <Port>");
        system("echo \"Anrufer  : $CALLDATA[3]\" | nc <IP> <Port>");
        system("echo \"Anrufer  : $NAME\" | nc <IP> <Port>");
        system("echo \"Rufziel  : $CALLDATA[4]\" | nc <IP> <Port>");
        system("echo \"Provider : $CALLDATA[5]\" | nc <IP> <Port>");
        system("echo \"Tellows  : $TELLOWS\" | nc <IP> <Port>");
        $wgetstring="wget -O /dev/null \"http://root:dbox2@dbox2ip/control/message?popup=Eingehender%20Anruf%0A%0AAnrufer%3A%20".$CALLDATA[3]."%0AAnrufer%3A%20".$NAME."%0Aan%20%20%20%20%20%20%20%20%3A%20".$CALLDATA[4]."\" >/dev/null 2>&1 &";
        system($wgetstring);
        system('logger -p 7 \"Tellows  : '.$TELLOWS.'\"');
        system('logger -p 7 \"Provider : '.$CALLDATA[5].'\"');
        system('logger -p 7 \"Rufziel  : '.$CALLDATA[4].'\"');
        system('logger -p 7 \"Anrufer  : '.$NAME.'\"');
        system('logger -p 7 \"Anrufer  : '.$CALLDATA[3].'\"');
        system('logger -p 7 \"Anrufzeit: '.$CALLDATA[0].'\"');
        system('logger -p 7 \"===new caller===\"');
    }
    if (strstr($line, ";CALL;")){    //Behandlung ausgehender Rufe
        $CALLDATA=explode(";",$line);
        $NAME="";
        $NR=$CALLDATA[5];
        if ($DOLOOKUPS){
            $NAME=reverse_lookup($NR);
        }
        $ARGS='logger -p 7 \"Neuer ausgehender Ruf - Nebenstelle '.$CALLDATA[3].', Abgangsrufnummer: '.$CALLDATA[4].', Ziel: '.$CALLDATA[5].' ';
        if (!($NAME == $NR)){
            $ARGS=$ARGS.$NAME.'\"';
        }
        system($ARGS);
        system("echo \"***new outgoing call***\" | nc <IP> <Port>");
        system("echo \"Anrufzeit: $CALLDATA[0]\" | nc <IP> <Port>");
        system("echo \"Ziel     : $CALLDATA[5]\" | nc <IP> <Port>");
        system("echo \"Ziel     : $NAME\" | nc <IP> <Port>");
        system("echo \"von      : $CALLDATA[4]\" | nc <IP> <Port>");
        system("echo \"Nebenst. : $CALLDATA[3]\" | nc <IP> <Port>");
    }
    if (strstr($line, ";CONNECT;")){    //Behandlung zustandegekommene Verbindung
        $CALLDATA=explode(";", $line);
        $ARGS='logger -p 7 \"Verbindung hergestellt: Nebenstelle '.$CALLDATA[3].', Rufnummer: '.$CALLDATA[4].', Call-ID: '.$CALLDATA[2].'\"';
        system($ARGS);
    }
    if (strstr($line, ";DISCONNECT;")){//Behandlung beendete Verbindung
        $CALLDATA=explode(";", $line);
        $ARGS='logger -p 7 \"Verbindung beendet: ConnectionID '.$CALLDATA[2].', Dauer: '.zeitformat($CALLDATA[3]).' h\"';
        system($ARGS);
    }
}
fclose($client);
?>


weiterhin benötigt das Script in seinem Scriptverzeichnis eine

phonebook.csv

mit dem Aufbau "Rufnummer;Name" - also:
0221123456789;Max Mustermann
0308760815;Maxi Musterfrau

usw. für Namensauflösungen bei Rufnummern, die nicht oder fehlerhaft bei der netzgestützten Inverssuche gefunden werden (z.B. Mitarbeiterdurchwahlen in Firmen könnte man da reintun) und außerdem eine Datei namens

onk.txt

mit den Ortsnetzkennzahlen für Deutschland (aufsteigend sortiert) mit dem Aufbau
Vorwahl;Ortsnetzname

Diese Datei habe ich mir selbst aus dieser Quelle erstellt: http://www.bundesnetzagentur.de/cln...chnisse/ONB_Verzeichnis/ONBVerz_Basepage.html
Da es sich um eine Bearbeitung der Datei handelt und ich mir über etwaige rechtliche Probleme im Zusammenhang mit einer Veröffentlichung nicht bewußt bin, muß diese Datei von jedem selbst erstellt werden. Ich veröffentliche sie hier sicherheitshalber nicht.


Zur Funktion / Funktionserweiterung der Rufsignalisierung: In der Endlosschleife kann man bei "Behandlung eingehender Rufe" / "Behandlung ausgehender Rufe" / "Behandlung zustandegekommene Verbindung" / "Behandlung beendete Verbindung" eigene Systemaufrufe ablegen. Ich reporte zum Beispiel mittels "Logger" an den System Log Deamon und per Netcat an ein Display mit Netzwerkschnittstelle. Im Bereich der eingehenden Rufe habe ich auch noch einen Popup-Aufruf für eine Dbox2 mit Neutrino Linux stehen. Das hab ich aber seit gefühlt 10 Jahren nicht mehr angefaßt, zudem habe ich keine dbox2 mehr in Betrieb ;) Der Aufruf könnte aber vielleicht für die Enigma-Boxen ähnlich aussehen.


Edit: Ich hab keinen Schimmer, warum die Forensoftware meinen Post in der Breite so zusammenstaucht - in der Bearbeitungsvorschau wird die komplette Breite verwendet... *Schulterzuck*
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.