ISDN Modul verwenden

Hallo Christian,

ich kann hier nur mal etwas spekulieren.

Ich würde zwischen dem Generate und dem Abspielen einen Sleep einbauen, damit die Datei auch wirklich fertig gestellt wurde und vom Dateisystem „freigegeben“ wurde bevor IPS es abspielen soll.

Gruß Philipp

Also bei mir läuft alles mit backslash und nciht mit slash, also anstelle von / hab ich \ im datei pfad…

$file = „C:\ip-symcon\media emp.wav“;

Wenn man einen String in doppelte Anführungszeichen setzt und eingibt, wird daraus das Tab-Zeichen gemacht. Daher muss man das dann mit \ escapen. Unter doppelten Anführungszeichen gibt es noch viele weitere solcher Sonderfälle, daher kann ich jedem nur empfehlen, für normale Strings einfache Anführungszeichen zu benutzen. Dort muss nur ’ mit ’ escaped werden. Daher reicht hier einfach:

$file = 'C:\ip-symcon\media	emp.wav';

Mehr zum Thema unter PHP: Strings - Manual.

Hallo,

danke für die Info. Mit einem IPS_Sleep werden die Meldungen weniger. Es scheint also an der Geschwindigkeit zu liegen.

Danke und Gruß
Christian

Muss auch nochmal wühlen: Habe das Script von paresy laufen. Kommender Ruf wird angenommen, eine wav-Datei abgespielt. Nun wollte ich das DTMF testen. Dafür muss ich in die Verbindung 2mal eine „0“ wählen, und zwar schnell hintereinander. Eine wird im Debug des ISDN-Modul erkannt und die Aktion ausgelöst. Warum 2x „0“?

Hallo zusammen,
ich verzweifel hier gleich… Folgendes Problem:
Wenn es bei mir am Tor klingelt, ruft mich IPS auf dem Handy an. Dann gibts ne Ansage mit 3 Menüpunkten, die ich über die Handytastatur bedienen möchte. Dazu muss ich ja die Tastatureingaben am Telefon auswerten. Scheint hier allen leicht zu fallen- ich bin zu blöd. Hier mein Skript:

//Anrufen und nach 10 Sekunden auflegen
 $id = ISDN_Connect(34143 /*[Sonstige Module\ISDN Module]*/, "0172xxxxxxx");
do {
    IPS_Sleep(500);
    $callinfo = ISDN_GetConnectionInfo(34143, $id);
} while ( $callinfo["State"] != "4") ; // warten, bis abgenommen wurde

$len = ISDN_PlayWave(34143, $id, "C:\Sprachausgabe IPS\Anrufansage klingel.wav"); // Spieldauer in ms
IPS_Sleep($len+500); // warten bis abgespielt
ISDN_StopPlay(34143, $id);

…so hier muss nun ja nach meinem Verständnis IPS auf Tastatureingaben warten, oder? Wie muss es weitergehen? Wie greife ich auf die $ISDN_DATA Variable zu? Die kennt IPS nicht…

Kann mir jemand helfen?

LG; Marcus

Hallo,

du kannst den Ablauf nicht gerade in einem Skript herunter programmieren sondern musst auf die verschiedenen Ereignisse reagieren.
Die Variable „$ISDN_DATA“ wird beschrieben wenn ein Script mit dem Ereignis „DTMF“ aufgerufen wird.
Das Ereignis was das Script auslöst kannst du unter „$ISDN_EVENT“ abgefragt.
Normaler weise darf kein „Sleep“ in deinem Skript vorkommen. Nach „ISDN_PlayWave“ sollte das Skript beendet werden und dann auf „PlayFinish“ wieder reagieren.

MfG; Thomas

Hey Thomas,
danke, verstanden. Wo finde ich denn die Variable DTMF? Wie füge ich die als Ereignis zu einem Skript hinzu? Ich glaub, ich bin da etwas dämlich.
Das von mir geopstete Skript erzeugt ja einen ausgehenden Anruf. Wie ich im Forum gelesen habe, werden die Variablen nur bei eingehenden Anrufen erzeugt, ist das richtig?
Eigentlich geht es darum: Wie verarbeite ich bei ausgehenden Anrufen DTMF Töne des Angerufenen?
Szenario: Wenn jmd. bei mir am Tor klingelt, ruft IPS mein Handy an. Dort will ich dann über Tastaturtöne Tor oder Pforte öffnen können.
Bis zum Anruf und dem Abspielen des Textes klappt alles- nun muss ich nur noch die Tastaturtöne verarbeiten.

Kannst Du mir einen Tipp geben?

LG; Marcus

Hallo,

„DTMF“ ist keine Variable sonder der Inhalt von „$ISDN_EVENT“. Bei jeder Veränderung wird ein neues Ereignis Ausgelöst. Das Skript zum verarbeiten dieses Ereignisses musst du im ISDN Modul angeben. Ein Ereignis ist nicht nur das Erhalten eines Anrufes sondern z.B. Auch das beenden eines Ansagetextes oder die Eingabe eines Codes auf der Tastatur des Telefons.
Nachfolgend mein Skript für die Verarbeitung der ISDN Ereignisse. Bitte aber nicht verwirren lassen. Das Skript ist sehr umfangreich wegen der Anbindung an eine Datenbank.
Die ISDN Verarbeitung hat auch noch eine zweites Skript das durch einen Timer gesteuert die Verbindung überwacht da das „Disconnect“ Ereignis nicht sonderlich Zuverlässigkeit ist.



define ('IID_ISDN' , 43936 /*[.ISDN\ISDN Module]*/);         // ISDN Instans
define ('pISDN_Status' , 28883 /*[.ISDN\ISDN_Auswertung\sISDN_Status]*/);     // Variable
define ('pISDN_Timer', 51278 /*[.ISDN\ISDN_Timer]*/);       // Skript "ISDN_Timer"
define ('pSMS',12293 /*[.ISDN\SMS_Senden]*/);

if($IPS_SENDER == "ISDN"){

   // ISDN Status Laden
   $Text = GetValueString(pISDN_Status);
   IF($Text!= ''){
      $ISDN_Status_Liste = unserialize($Text);
   }
   $ISDN_Status_alt = $ISDN_Status_Liste;

   //Informationen ins Meldungsfenster ausgeben
   echo "Event: ".$ISDN_EVENT."
" ;

   $ID = $ISDN_CONNECTION;

   if($ISDN_EVENT != "Disconnect"){
   $callinfo = ISDN_GetConnectionInfo(IID_ISDN, $ID);
   //Mehr Informationen ausgeben
   echo "ISDN_GetConnectionInfo: ".$ISDN_CONNECTION.",".print_r($callinfo,True);
   }

    //Je nach Ereigniss eine Aktion ausführen
    switch($ISDN_EVENT)
    {
     case "Incoming":
     // Neuer Anruf ?
         IF(!array_key_exists($ID,$ISDN_Status_Liste)){
	     // Feldeintrag für Kommenden Ruf anlegen
	         $ISDN_Status['Time']= Time();
	         $ISDN_Status['Typ']= "IN";

	     // Anruf in Datenbank Schreiben
	         $CallingNumber = "0".$callinfo['CallingNumber'];
	         $CalledNumber = $callinfo['CalledNumber'];

			// Verbindung zur Datenbank
				$connectionInfo = array( "Database"=>"Adressen_SQL");
			   $db=sqlsrv_connect ("ZENTRALE\SQLEXPRESS",$connectionInfo);

	         $sTime = strftime("%Y-%m-%d %X", Time());
	         $query = "INSERT INTO [Anrufe] (Von, An, Zeitpunkt)VALUES(?,?,CONVERT(DATETIME, ?,102))";
				echo "Eintrag in DB: ".$query."
";
				$params = array( $CallingNumber, $CalledNumber,$sTime);
	         $result = sqlsrv_query($db,$query,$params);

				if(!$result){
	     			echo "Error in statement execution.
";
	      		die( print_r( sqlsrv_errors(), true));
				}

			// Index des neuen Eintrags
				$query = "SELECT ident_current('[Anrufe]') as ID";
				$result = sqlsrv_query($db,$query);
				if($result){
				   $row = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC);
				   $ISDN_Status['ID'] = $row['ID'];
				}else{
				   $ISDN_Status['ID'] = 0;
				}

	         sqlsrv_close($db);
	         IPS_SetScriptTimer(pISDN_Timer, 1);    // Timer Einschalten
	       	$Text = "Update";
	         RegVar_SendText(59656 /*[.ISDN\Register Variable]*/ ,$Text.$Text.chr(10) );

	//			if($CallingNumber == '1701686912'){
	//            ISDN_Disconnect(IID_ISDN,$ID);
	//			}

			// Feldeinträge Speichern
	         $ISDN_Status_Liste[$ISDN_CONNECTION] = $ISDN_Status;
	         echo "Incoming: ".print_r($ISDN_Status_Liste,True);
			}
      break;

     case "Connect":
         // Anruf von Klingel ausgelöst ?
         if($ISDN_Status_Liste[$ID]['Typ']== 'Klingel'){
            $ISDN_Status_Liste[$ID]['Typ']= 'Klingel_WAV';
            ISDN_PlayWave(IID_ISDN,$ISDN_CONNECTION,"C:\Anwendungsdaten\IP-Symcon\wav\haustür.wav");
         }else{
            //Aktion nach dem Verbinden ausführen
            $CalledNumber = $callinfo['CalledNumber'];
				if ($CalledNumber == 33){
					$file = "C:\Anwendungsdaten\IP-Symcon\wav\Tupper_ISDN.wav";
				}else{
					$file = "C:\Anwendungsdaten\IP-Symcon\wav\Feldmann_ISDN.wav";
				}
				echo "Ansage: ".$file." Angerufende Nr.:".$CalledNumber. "
";
				ISDN_PlayWave(IID_ISDN, $ISDN_CONNECTION, $file);
            $ISDN_Status_Liste[$ID]['Typ']= 'IN_Ansag';
         }
      break;

     case "Disconnect":
      //Aktion, wenn Anruf beendet wurde
      //"ISDN_GetConnectionInfo" ist hier nicht mehr verfügbar!
         if($ISDN_Status_Liste[$ID]['Typ']== 'Klingel_WAV'){
            unset($ISDN_Status_Liste[$ID]);
         }
         // Status ISDN
         elseIF(@array_key_exists($ID,$ISDN_Status_Liste)){
            $Dauer = time() - $ISDN_Status_Liste[$ID]['Time'];
            echo "Dauer : $Dauer s
";
            $ISDN_Status = $ISDN_Status_Liste[$ID];
            echo "ISDN_Status".print_r($ISDN_Status,true);
				// Sprächsdauer in DB Schreiben
				if(substr($ISDN_Status['Typ'],0,2)=='IN'){
				
					$connectionInfo = array( "Database"=>"Adressen_SQL");
				   $db=sqlsrv_connect ("ZENTRALE\SQLEXPRESS",$connectionInfo);

	            $Dauer = Time() - $ISDN_Status['Time'];
               $iID = $ISDN_Status['ID'];
    				$query = "UPDATE Anrufe SET [Anrufe].[Dauer] = $Dauer WHERE [Anrufe].[Index] = $iID";
					echo "Eintrag in DB: ".$query."
";
					$result = sqlsrv_query($db,$query);
	            sqlsrv_close($db);
	            
	            IPS_RunScript(pSMS );
	            
				}
         	unset($ISDN_Status[$ID]);
         	$Text = "Update";
          	RegVar_SendText(59656 /*[.ISDN\Register Variable]*/ ,$Text.$Text.chr(10) );
	      }
      break;

     case "PlayFinish":
      //Aktion, wenn Wav abgespielt wurde
         if($ISDN_Status_Liste[$ID]['Typ']== 'Klingel_WAV'){
            ISDN_Disconnect(IID_ISDN,$ID);
         }elseif($ISDN_Status_Liste[$ID]['Typ']== 'IN_Ansag'){
            $file = "C:\Anwendungsdaten\IP-Symcon\wav\Beeps\Echoton.wav";
            ISDN_PlayWave(IID_ISDN, $ISDN_CONNECTION, $file);
            $ISDN_Status_Liste[$ID]['Typ']= 'IN_Beep';
         }elseif($ISDN_Status_Liste[$ID]['Typ']== 'IN_Beep'){
            $file =  strftime("%Y-%m-%d %H-%M-%S", Time()).".wav";
            echo "Aufnahmedate: ".'C:\Anwendungsdaten\IP-Symcon\wav\Nachrichten\\'.$file."
";
            ISDN_RecordWave(IID_ISDN, $ISDN_CONNECTION, 'C:\\Anwendungsdaten\\IP-Symcon\\wav\\Nachrichten\\'.$file);
            $ISDN_Status_Liste[$ID]['Typ']= 'IN_Rec';

				// Dateiname in Datenbank schreiben
				$connectionInfo = array( "Database"=>"Adressen_SQL");
			   $db=sqlsrv_connect ("ZENTRALE\SQLEXPRESS",$connectionInfo);

            $iID = $ISDN_Status_Liste[$ID]['ID'];
    			$query = "UPDATE Anrufe SET [Anrufe].[Nachricht_neu] = 1, [Anrufe].[Nachricht] = '$file' WHERE [Anrufe].[Index] = $iID";
				echo "Eintrag in DB: ".$query."
";
				$result = sqlsrv_query($db,$query);

	      	sqlsrv_close($db);
         }

      break;
      
     case "DTMF":
			echo $ISDN_DATA;

 /*     switch($ISDN_DATA)
      {
       //Aktion wenn 0 gedrückt wird
       case "0":
        $file = IPS_GetKernelDir()."temp.wav";
        $text = "The Time is ".date("H:i");
        TTS_GenerateFile(IID_TTS, $text, $file, 6);
        ISDN_PlayWave(IID_ISDN, $ID, $file);
        break;
       //Aktion wenn falsche Taste gedrückt wird
       default:
        ISDN_Disconnect(IID_ISDN, $ID);
        break;
      }  */
      break;
    }

   // Staus wenn verändert Sichern
   IF($ISDN_Status_Liste != $ISDN_Status_alt){
      SetValueString(pISDN_Status,serialize($ISDN_Status_Liste));
   }
}
?>


Hi,
vielen Dank, so langsam scheint es bei mir zu dämmern… Wird das Skript, das ich im ISDN Modul angebe, grundsätzlich gestartet, wenn auf das Modul zugegriffen wird- sprich auch bei ausgehenden Anrufen? Bzw. was ist genau das Startkriterium für das Skript, das im ISDN Modul hinterlegt ist?

LG; Marcus

Hallo,
nun habe ich ein wenig rumprobiert und es soweit verstanden, denke ich. Hier mal zusammengefasst für den Fall, dass noch jemand mein Problem haben sollte:

Das im ISDN Modul hinterlegte Skript wird bei jeder Verwendung des ISDN Moduls automatisch gestartet. D.h. sowohl bei eingehenden als auch bei ausgehenden Anrufen.
Mit Start des Skripts werden die verschiedenen Variablen $ISDN_EVENT etc. automatisch erzeugt und stehen im Skript zur Verfügung. Darüber lassen sich z.B. auch Tastaturtöne auswerten.

LG; Marcus

Hab da auch mal eine Frage:

die Systemvariable $IPS_Sender gibt es ja nicht mehr sondern nur noch $_IPS[‚SENDER‘]. Das habe ich nun rausbekommen. Aber ich vermute mal das die Ereigniss Events unter $ISDN_EVENT auch nicht mehr Up to date sind.

if($_IPS['SENDER'] == "ISDN") {
 	switch ($ISDN_EVENT) {
	   case "Connect":
	      setValue(53269  /*[Scripte\Telefon\ISDN \Status]*/,true);
	      echo "Anruf angenommen";
	    break;
	   
	   case "Disconnect":
	       setValue(53269  /*[Scripte\Telefon\ISDN \Status]*/,false);
	   break;
 	}
}

Kleines Testcodeschnipsel. Im Case wird nichts ausgeführt. Daher vermute ich das die Variable $ISDN_EVENT nicht mehr aktuell ist. In der Doku steht unter IP-Symcon :: Automatisierungssoftware — Systemvariablen nur unter ISDN siehe ISDN … und wo geht es weiter?

Gruß

Habe die Doku entsprechend vervollständigt. IP-Symcon :: Automatisierungssoftware — Systemvariablen

paresy

Moin,

ich versuche momentan per IP-Symcon eine Anruferliste mit E-Mail-Versand bei verschiedenen Stati einzurichten.
Sprich:

Anruf kommt - E-Mail versenden + Eintrag erstellen
Anruf wurde angenommen - E-Mail versenden
Anruf wurde nicht angenommen - E-Mail versenden

Ich bin mittlerweile so weit, dass ich einen Anruf erfolgreich absetzen kann. Allerdings habe ich arge Probleme beim Empfang.

Mal erkennt er einen Anruf, mal nicht. Als MSN hab ich die Interne MSN des PC’s genommen, das Testskript sieht so aus:

if($_IPS['SENDER'] == 'ISDN') {
switch ($_IPS['EVENT']) {
	case "Connect":
	   print_r("Connect");
	break;
	case "Incoming":
	   print_r("Incoming");
      #$callinfo = ISDN_GetConnectionInfo(32922  /*[ISDN Module]*/, $_IPS['CONNECTION']);
      #print_r($callinfo);
	break;
	case "Disconnect":
	   print_r("Disconnect");
	break;
}

}

Kann mir jemand weiter helfen, wo der Fehler liegen könnte?

Edit:

Das ISDN-Modul empfängt jetzt Anrufe, meine Fragen führe ich in folgendem Thread fort, da das Skript ungefähr das Widerspiegelt, was ich auch umsetzen möchte.