ISDN-Anrufauswertung

Hallo,
ich versuche gerade, mit dem ISDN over Capi-Modul eine Anrufauswertung zu schreiben. Allerdings liefert mir schon das Script aus der Wiki eine Fehlermeldung, die ich nicht ganz verstehe:
<b>Notice</b>: Undefined offset: 1 in <b>C:\IP-SYMCON\scripts.currentscript</b> on line <b>12</b><br />
Was mache ich falsch?
Danke für hilfreiche Infos
Jürgen

Probleme mit dem Array in Zeile 12

Die ISDN Status Parameter wurden mal geändert, dadurch stimmt das Script von WIKI wahrscheinlich nicht mehr ;-).

Welches Script verwendest du?

Ich habe hiermit rumprobiert:
:frowning: ich darf nur 10000 Zeichen


<?
/*Header gekürzt*/

// ********** USER SETTINGS 
include_once(IPS_GetKernelDir()."scripts/GlobalDefines.ips.php");

// Path to Web log output (table include files and WAVs)
$myWebHome = IPS_GetKernelDir()."web\\calls";
// Path to Sound files
$soundFilePath = __myhome."\\Sounds\\";
$debug = TRUE;

// ******** END OF USER SETTINGS 
$weblogFilePath = $myWebHome;
$callLogFilePath = __myhome."\\Call.Logs\\call_log_".date("ymd").".txt";

// Number of "knocks"
$numberOfRings = GetValueInteger("ISDN_NumberOfRings");
// Are we already connected ? (avoids logging and answering twice)
$hasBeenConnected = GetValueBoolean("ISDN_IsConnected");

SetValueInteger("ISDN_NumberOfRings", $numberOfRings + 1);

$buffer = GetValueString("ISDN_Status");
//$buffer = $IPS_Value;
if($buffer=="") {
   exit;
}

// Open the Call log file
if ($debug) $logHandle=fopen("$callLogFilePath", "a");

$items = explode(chr(13).chr(10), $buffer);
foreach($items as $item) {
   // SK: Datum und Zeit ermitteln
   $callTimeStamp = Date("H:i");
   $skDate = Date("Ymd");
   $skTime = Date("H-i-s");

   // wer hat angerufen?
   if (substr($item, 0, 13) == "CallingNumber"){           // nach "CallingNumber" suchen
      if ($debug) fwrite($logHandle, date("d.m.y")." - ".date("H:i:s")." -> Ring:".$numberOfRings." - FOUND NUMBER 
");
      $callerNumber = substr($item, 14, 20);                    // der Rest ist die Telefonnummer
      if ($callerNumber <> "") {
         $callerName = findNumberDB($callerNumber);
         if ($callerName === false) {  // Number not found in phonebook, search the web
            switch(substr($callerNumber,0,4)) {
               case "33":
                  echo "French number calling...
";
                  // TODO
                  break;
               case "32":
                  echo "Belgian number calling...
";
                  // TODO
                  break;
               case "43":
                  echo "Austrian number calling...
";
                  // TODO
                  break;
               default:
                  echo "German number calling...
";
                  if (substr($callerNumber,0,1) != "0") $callerNumber = "0".$callerNumber;
                  if ($numberOfRings == 1) { // Web lookup only performed once to avoid connection overflow
                     if ($debug) fwrite($logHandle, date("d.m.y")." - ".date("H:i:s")." -> Ring:".$numberOfRings." - RESOLVING NAME FROM WEB 
");
                     $callerName = findNumberDE($callerNumber);
                  } else {
                     $callerNameGlobal = GetValueString("PhoneNumber_Name");
                     if ($callerNameGlobal <> "") $callerName = $callerNameGlobal;
                  }
                  break;
            }
         } else {
            if ($debug) fwrite($logHandle, date("d.m.y")." - ".date("H:i:s")." -> Ring:".$numberOfRings." - FOUND NAME IN DB (".$callerName.")
");
         }
      } else {
         $callerNumber = "Unknown";
         $callerName = "Unknown";
      }
      if (!isset($callerName) or ($callerName == "")) {
         $callerName = "Unknown";
      }
      // Keep the caller Name
      SetValueString("PhoneNumber_Name", $callerName);

   }  // End of "Wer hat angerufen ?"

   // hier wird der Status ausgewertet und der eigentliche AB gestartet
   if (($item == "Connected") and (!$hasBeenConnected)){
      $webLogFileName = "Message_from_".$callerNumber."_on_".$skDate."_".$skTime.".wav";
      $webLogFile = $weblogFilePath."\\".$webLogFileName;
      SetValueBoolean("ISDN_IsConnected", True);
      if ($debug) fwrite($logHandle, date("d.m.y")." - ".date("H:i:s")." -> Ring:".$numberOfRings." - CONNECTED 
");
      IPS_Sleep(4000);
      ISDN_PlayWave(ISDN_1, $soundFilePath."Ansage8k.wav");
      IPS_Sleep(7100);
      ISDN_PlayWave(ISDN_1, $soundFilePath."Aufnahme8k.wav");
      IPS_Sleep(1000);
      ISDN_RecordWave(ISDN_1, $webLogFile);

      // LOG TO KERNEL MESSAGES AND WEB PAGE
      IPS_LogMessage( "ISDN","Call from ".$callerName." (AM On)" );
      if ($debug) fwrite($logHandle, date("d.m.y")." - ".date("H:i:s")." -> Ring:".$numberOfRings." - WRITE WEB PAGE 
");
      // Write calls web page
      $WebLogHandle=fopen("$weblogFilePath\\callsLog_".$skDate.".php", "a");
      // Add a line to the calls table in calls.php
      // Write everything on one line to be able to delete the line if the user requires it
      fwrite($WebLogHandle, "<tr>");
      fwrite($WebLogHandle, "<td valign='top' bgcolor='#BBBBBB'>".$callTimeStamp."</td>");
      fwrite($WebLogHandle, "<td valign='top' bgcolor='#BBBBBB'>".$callerNumber."</td>");
      fwrite($WebLogHandle, "<td valign='top' bgcolor='#BBBBBB'>".$callerName."</td>");
      fwrite($WebLogHandle, "<td valign='top' bgcolor='#BBBBBB'><a href='./calls/".$webLogFileName."' title='Listen to the Message'>Yes</a></td>");
      fwrite($WebLogHandle, "</tr>");
      fclose($WebLogHandle);
   }  // end of if connnected
}  // end of foreach loop on $item

// Write to log file
if ($debug) fwrite($logHandle, date("d.m.y")." - ".date("H:i:s")." -> Ring:".$numberOfRings." - Number: ".$callerNumber." - Name: ".$callerName." - item: ".$item."
");

// Auflegen erkennen und Aufnahme stoppen
$items = explode(chr(13).chr(10), $buffer);
foreach($items as $item) {

   if($item == "Disconnected") {
      if ($debug) fwrite($logHandle, date("d.m.y")." - ".date("H:i:s")." -> Ring:".$numberOfRings." - DISCONNECTED 
");
      ISDN_StopRecord(ISDN_1);
      SetValueBoolean("ISDN_IsConnected", False);

      //... und den Status-Buffer lschen
      SetValueString("ISDN_Status", "");
      SetValueInteger("ISDN_NumberOfRings", 0);

      // If it has not been connected, the AM is not On and we log the call here
      if (!$hasBeenConnected) {
         IPS_LogMessage( "ISDN","Call from ".$callerName." (AM Off)" );
         if ($debug) fwrite($logHandle, date("d.m.y")." - ".date("H:i:s")." -> Ring:".$numberOfRings." - WRITE WEB PAGE 
");
         // Write calls web page
         $WebLogHandle=fopen("$weblogFilePath\\callsLog_".$skDate.".php", "a");
         // Add a line to the calls table in calls.php
         // Write everything on one line to be able to delete the line if the user requires it
         fwrite($WebLogHandle, "<tr>");
         fwrite($WebLogHandle, "<td valign='top' bgcolor='#BBBBBB'>".$callTimeStamp."</td>");
         fwrite($WebLogHandle, "<td valign='top' bgcolor='#BBBBBB'>".$callerNumber."</td>");
         fwrite($WebLogHandle, "<td valign='top' bgcolor='#BBBBBB'>".$callerName."</td>");
         fwrite($WebLogHandle, "<td valign='top' bgcolor='#BBBBBB'>No</a></td>");
         fwrite($WebLogHandle, "</tr>");
         fclose($WebLogHandle);
      }

      if ($debug) fclose($logHandle);
      // clear the Phone Number
      SetValueString("PhoneNumber_Name", "");

      exit;
   }
}


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

function findNumberDB($callerNumber)
{
   $mysql_host="172.16.100.+++";   // Host name
   $mysql_username="++++++++";        // Mysql username
   $mysql_password="++++++++";        // Mysql password
   $mysql_db_name="adressen";         // Database name
   $mysql_tbl_name="adressen";        // Table name

   // Current date
   $nowDate = date("y-m-d H:i:s");

   // Connect to server and select databse.
   $link = mysql_connect("$mysql_host", "$mysql_username", "$mysql_password")or die("cannot connect");
   mysql_select_db("$mysql_db_name")or die("cannot select DB");

   // Find an entry in the table with that number
   $sql="SELECT * FROM $mysql_tbl_name WHERE Number LIKE '%$callerNumber'";
   $result=mysql_query($sql);
   echo "sql query: ".$sql."
";

   // Mysql_num_row is counting table row
   $count=mysql_num_rows($result);
   echo "entries found in book: ".$count."
";

   if ($count == 1) {
      $row = mysql_fetch_object($result);
      echo "Name: ".$row->name." (".$row->type.")
";
      return "$row->name"." ($row->type)";
   } elseif ($count > 1) {
      echo "Various Names
";
      return "Various Names";
   } else {
      echo "No Name Found
";
      return false;
   }
}
?>

Hallo Ralf,
ich verwende dieses script

<?
/*
*******************************
IP-SYNCOM Event Scripting
*******************************
*/

// Trigger: Variable in: "Status Variable" nicht: "Status Variable Deprecated, Concats with CRLF"
$status = $IPS_VALUE;

$content_1 = explode(";",$status);        // ISDN Line und Status
$content_2 = explode(":",$content_1[1]);  // MSN Nummer > [1]

// wer ruft an?
if ($content_2[0] == "CallingNumber"){
   SetValueString("Calling_Number", $content_2[1]);
}

// wer wird gerufen?
if ($content_2[0] == "CalledNumber"){
   SetValueString("Called_Number", $content_2[1]);

// wenn ein Anruf von der Nummer  17012345678  (Null ggf. weglassen TK-Anlagen abhängig)
// und für die MSN (hier Nebenstelle 45) bestimmt ist, dann tu dies oder jenes
   if ((GetValueString("Calling_Number") == "17012345678") and ($content_2[1] = "45")){
      include(IPS_GetScriptFile("Doorbell"));
      include(IPS_GetScriptFile("Ein_anderes_Skript_starten"));
   }
}

// verbunden ??
if ($content_2[0] == "Connected"){

	// hier der Code bei "Connected"

}
?>

das, was du gepostet hast, habe ich auch probiert, es macht aber diverse Probleme und ist auch eigendlich zu komplex. Ich brauche z.B. keinen Anrufbeantworter, aber möchte mir beim Klingeln den Namen des Anrufers sagen lassen. Das Weblog ist allerdings eine schöne Sache, die ich auch nutzen möchte. Eventuell kann man das ja kombinieren. Allerdings stehe ich bei php ganz am Anfang. Vieleicht hast du ja noch einen Tip für mich.
Gruß
Jürgen

Die beiden Zeilen und somit auch die Folgeverarbeitung sind falsch, da die Daten in der ISDN Statusvariablen inzwischen anders abgelegt werden.

So sieht bei mir ein kompletter Eintrag in der Variablen aus:

‚CallingNumber:01729876543
CalledNumber:20
Accepted
Connected
Disconnected‘

$items = explode(chr(13).chr(10), $buffer);
Foreach ...

Ab hier ist der entscheidende Teil aus dem AB Script bis zu

}  // End of "Wer hat angerufen ?"

Ich glaube, die Beschreibung unter http://www.ipsymcon.de/wiki/index.php/ISDN_over_CAPI ist falsch rum (altes/neues Modul).

So, ich hab jetzt noch mal rumprobiert, aber ich krieg einfach nicht die callingnumber in eine Variable zum Auswerten. Da ich hier mit bis zu 9 Nummern arbeite, muss ich die Anrufer schon nach Empfängern trennen. Wahrscheinlich mach ich da irgendwo einen grundlegenden Fehler. Vieleicht kannst Du mir da mal einen Denkanstoss geben.
Gruß
Jürgen

So, ich muss den Thread noch einmal hervor holen.

Nachdem die Com/Lan Verbindung zur Fritzbox scheinbar nicht stabil läuft, habe ich jetzt das ISDN Modul eingerichtet … mit Capi … das funktioniert auch soweit, aber wenn ich ein Script auf „onChange“ auf die Variable triggern lasse, dann gibt es ein onChange nur in dem Moment, wo der Anruf ein geht … müßte nicht ein „onChange“ auch dann passieren, wenn nach dem Telefonat aufgelegt wird? …

$items = explode(chr(13).chr(10), $buffer);
foreach($items as $item) {

   if($item == "Disconnected")

Hier nach sollte sich doch die Variable ändern, oder??

@Ralf: Hast du mit dem Script auch eine eigene Datenbank für die Telefonnummern eingerichtet? Gibt es dazu ein HowTo? Bisher nutze ich nämlich immer noch JFritz

Grüße
Jens

Hallo Jens,

Lass auf OnUpdate triggern