IP-Symcon mit VoIP/SIP Support

Hallo Paresy

Danke für die Antwort. Wie sieht es aus betreffend der Meldung des BUG’s aus Fall 1 oben stehend ? Solange Symcon im Registering-Status ist, wird angezeigt dass die Registrierung erfolgreich ist, obschon vom Registrar gar keine Meldung zurückkommt. Das lässt sich mit dem Debug auf höchster Stufe sehr einfach nachstellen.
Betreffend Nachfrage nach Proxy-Support. Sobald mehr Schweizer-User ihren Swisscom-Account verwenden wollen, wird die Nachfrage sicher steigen… :slight_smile:

Gruss Letraz

Ich hätte mal eine Frage:D
…und zwar möchte ich folgendes Script verwenden um einen Anruf abzusetzen. Die „WaveOut.wav“ wird vorher mit tts generiert. Anruf klappt auch alles. Mein Problem, Symcon blockiert nach dem Anruf diese Datei. Ich kann sie erst löschen oder überschreiben wenn ich Symcon komplett runterfahre. Kann man da was machen?

IP-Symcon 5.4, Windows x64, 19.05.2020

$id = VOIP_Connect(56647, "+49xxxxxxxxx");

 for($i = 0; $i <= 30; $i++) {
     IPS_Sleep(1000);
     $c = VOIP_GetConnection(56647, $id);
     if($c['Connected']) {
        
        VOIP_PlayWave(56647, $id, IPS_GetKernelDir() . "/webfront/user/Sprachausgabe/WaveOut.wav");
        IPS_Sleep(20000);
        break;
     }
 }
 
 VOIP_Disconnect(56647, $id);  

Seit der 5.4 läuft VoIP auch bei mir gut (inkl. auflegen). Was jetzt noch fehlt oder was ich nicht finde: Wenn ich einen Anruf über meine FritzBox starte, wird aktuell meine Rufnummer zum Empfänger nicht übertragen. Da wohl laut AVM die Einstellung nicht in der FritzBox, sondern im Gerät selbst vorgenommen werden muss, suche ich also eine Einstellmöglichkeit im Symcon-Modul… Hat da jemand eine Lösung bzw. geht das nur bei mir nicht?

Viele Grüße, Carsten

@BrausePaul: Ich kann das bei mir leider nicht nachstellen :frowning: Hat noch wer das Problem?
@doctee: Bei meinen Tests (Sipgate) muss ich keinerlei Absender setzen. Das macht Sipgate von sich aus - je nachdem welche Nummer dem SIP Endpunkt zugeordnet ist.

paresy

Hallo paresy,

danke für den Hinweis. Bisher hatte ich nur an die Einstellungen im Modul und in der Fritzbox gedacht; jetzt habe ich gelernt, dass mein Telekom-Anschluss (IP) sich auch über das sog. Telefoniecenter online konfigurieren lässt; dort war die Rufnummerunterdrückung (wohl standardmäßig) eingeschaltet. Haken raus, Problem gelöst.:slight_smile:

doctee

@paresy
Was müsste ich liefern damit wir ggf. eine Lösung finden können? Also jede Wave die Symcon einmal über

VOIP_PlayWave(56647, $id, IPS_GetKernelDir() . "/webfront/user/Sprachausgabe/WaveOut.wav");

abgespielt hat, bleibt danach über den Symcon-Prozess gesperrt.

Ich müsste das irgendwie nachstellen können. Kannst du mal prüfen, ob IP-Symcon auch Threads „leakt“ und diese immer weiter ansteigen?

paresy

Wenn du die PHP-Slots unter dem Tab PHP Informationen meinst, dann nein. Dort ist keiner hängen geblieben.
Habe jetzt mal das „Generieren“ der Wav aus dem Call-Script rausgenommen und separiert. Das Problem löst das allerdings nicht.
Ich vermute mal es hängt irgendwie damit zusammen, das das Call-Script nicht immer sauber beendet wird. Je nachdem wann man den Anruf abnimmt, wann auflegt usw.

Ich meinte die Threads vom ips.exe Prozess im Task Manager :slight_smile: Hast du einen Mini Schnipsel bei dem es passiert?

Reicht bei dir das zweite Beispiel aus der Doku? Voice over IP — IP-Symcon :: Automatisierungssoftware

paresy

Also im Taskmanager sehe ich unter Prozesse nur IP-Symcon Service und darunter IP-Symcon. Unter Details gibt es nur den ips.exe und den ips_tray.exe Prozess. Wo kann ich da noch mehr sehen?

Mein Code brauch ich gar nicht kürzen, das ist schon bereits das ganze Call-Script. Vom Beispiel unterscheidet sich das nur darin das ich 30s Zeit gebe um ans Telefon zu gehen und statt Amazon-TTS soll er eine breits zuvor erzeugte Wav abspielen.
Was mir nur gerade auffällt, evtl. läuft das Script ja hin und wieder in einen Timeout. Wartezeit bis einer abnimmt+30s Wartezeit die ich einbauen musste damit PlayWave genug Zeit bekommt.

 $id = VOIP_Connect(56647, "+491*****");

 for($i = 0; $i <= 30; $i++) {
     IPS_Sleep(1000);
     $c = VOIP_GetConnection(56647, $id);
     if($c['Connected']) {
        IPS_Sleep(1000);
        VOIP_PlayWave(56647, $id, IPS_GetKernelDir() . "/webfront/user/Sprachausgabe/WaveOut.wav");
        IPS_Sleep(30000);
        return;
     }
 }
 VOIP_Disconnect(56647, $id);

Genau die ips.exe ist die, die ich suche. Dort kannst du im Task Manager noch eine Spalte für Threads einblenden. Stegen die immer weiter an, wenn du anrufen machst?

Kannst du das mit dem Timeout oder nicht Timeout ausprobieren? Denn ich habe genau diesen Code Schnippsel verwendet und konnte es bei mir leider nicht nachstellen. Irgendwas muss also bei dir noch anders sein - ggf. passiert es nur bei dem Timeout?

paresy


Ja pro festhängender Wav Datei zählt der Threadcounter eins hoch und bleibt auf dem Level.
Das mit dem Timeout kann ich ausschließen, ich habe für die Versuche die Scriptlaufzeit unter 30s gehalten (gleich rangehen und nach 5s wieder auflegen).

Um Wechselwirkungen zu dem Wave-generieren auszuschließen habe ich einfach mal manuell wav’s erstellt und dann mit dem Anrufscript vorlesen lassen. In 20% der Fälle gehe ich ran und es kommt nichts (außer einem Echo), dann wird aber die Wav aber auch nicht blockiert. In 80% der Fälle wird die Wave abgespielt und ist danach blockiert (bis ich symcon abschieße).

Ich dachte mir so lösch ich die Wave doch mal gleich nach dem abspielen:

01.07.2020, 15:18:09 | ScriptEngine         | Result for Script 37978
Anrufscript gestartet!Anruf entgegen genommen!Spiele Wav ab!Breche anruf ab, nachdem Ansage abgespielt wurde!<br />
<b>Warning</b>:  unlink(C:\ProgramData\Symcon\\webfront\user\Sprachausgabe\WaveOut98.wav): Resource temporarily unavailable in <b>C:\ProgramData\Symcon\scripts\37978.ips.php</b> on line <b>32</b><br />
Trenne Verbindung!

(Habe natürlich geprüft das der unlink-Befehl unter normalen Bedingungen funktioniert.)
Geht nicht, was VOIP_PlayWave einmal hat gibt es nicht mehr her :banghead:

Wenn wir das Problem mit den gesperrten Wav’s nicht lösen können, evtl. hat ja jemand eine Idee für einen Workaround. Eine maßgebliche Anforderung ist es das keine Clouddienste verwendet werden können (also AWS ect.). Das muss alles lokal passieren.

Ziel ist es ein Monitoring zu installieren das bei einem Geräteproblem einen Anruf tätigt und durchsagt welches Gerät das Problem hat.
PRTG überwacht die Geräte, über das PRTG Modul ist der Status auch in Symcon verfügbar. Sobald es zu einem Problem kommt, wird folgendes Script getriggert:

<?php
include_once "Standard.ips.php";

check_timer(false,15460); //Scripttimer löschen 
check_timer(true,15460,120); //Scripttimer auf x Sekunden setzen

$liste_prtg_objekte = IPS_GetChildrenIDs(55186);    //Root bzw. hier sind alle PRTG Objekte drin

foreach($liste_prtg_objekte as $nr => $ebene0){                 //alle PRTG-Objekte durchgehen Ebene0
    $liste_prtg_objekt = IPS_GetChildrenIDs($ebene0);            
    
    foreach($liste_prtg_objekt as $nr => $ebene1){              //alle PRTG-Objekte durchgehen Ebene1
        $liste_prtg_sensor = IPS_GetChildrenIDs($ebene1);
        
        foreach($liste_prtg_sensor as $nr => $ebene2){          //alle PRTG-Objekte durchgehen Ebene2

            if(IPS_GetName($ebene2)== "Sensoren Fehlerhaft"){
                
                if(GetValueInteger($ebene2)>0){
   
                    $Verursacher=IPS_GetName($ebene0); 
                    tts_generate('<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="de-DE">Hallo, leider wurde für folgendes Gerät ein Fehler gemeldet   '.$Verursacher.'. Ich wiederhole den Gerätenamen <prosody rate="-50.00%"><say-as interpret-as="characters">'.$Verursacher.'</say-as></prosody></speak>'); //Legt eine Wav mit gesprochenem Text ab
                    ips_sleep(5000);
                    IPS_RunScriptEx(37978,array("Verursacher" => IPS_GetName($ebene0))); //Anruf triggern und Verursachername übergeben
                    return;                                                                     //Script abbrechen um keine weiteren Anrufe auszulösen

                }
                    
            }
                
        }
        
    }

}

?>

Die Funktion tts_generate enthält folgendes:

function tts_generate($ansagetext)
 	{
        $datei = fopen(IPS_GetKernelDir() . "webfront\user\Sprachausgabe\Textausgabe.txt","w+");
		$ansagetext=iconv("UTF-8", "ISO-8859-1", $ansagetext);
		fwrite($datei, $ansagetext);
		rewind($datei);
		fclose($datei);
		IPS_ExecuteEx(IPS_GetKernelDir() . "webfront\user\Sprachausgabe\generate_wave.bat","",false,true,-1);
	}

Das heißt sobald das Anruf/Callscript aufgerufen wird liegt bereits eine Wav mit Ansagetext vor die nur noch abgespielt werden muss.
Die generate_wave.bat sieht so aus:

@echo off
C:\Windows\syswow64\cscript.exe "C:\Program Files\Jampal\ptts.vbs" -u C:\ProgramData\Symcon\webfront\user\Sprachausgabe\Textausgabe.txt -s 8000 -c 1 -r -0 -w C:\ProgramData\Symcon\webfront\user\Sprachausgabe\WaveOut98.wav -voice "Microsoft Hedda Desktop"

So und am Ende kommt das Call-Script was nun anruft und die Wave abspielt:

<?php
include_once "Standard.ips.php";
$anzahl_bisheriger_anrufe=getvalue(30449);          //soll verhindern das dieses Script Telefonterror auslösen kann
if($anzahl_bisheriger_anrufe >= 5){return;}                               //nach 5 Anrufen ist Schluss (braucht noch einen Timer der die Variable zurück setzt)
setvalue(30449,$anzahl_bisheriger_anrufe+1);        //Anruf hochzählen
check_timer(false,15460);    //normalen Aufruftimer löschen
check_timer(true,15460,1800);     // Aufruftimer für Prüfscript auf höheren Wert setzen (also eine Pause in der erstmal nicht geprüft wird) 1800s=30min
//$Verursacher=$_IPS['Verursacher']; //Wird aus dem Script "PRTGObjekte nach fehlerhaften Sensoren durchsuchen" geliefert
//$Verursacher="P.S.T.R.F.8.1.9"; //Nur zum Test, wenn dieses Script manuell ausgeführt wird
//IPS_Sleep(5000); //gib dem TTS-Generator 5s Zeit die Wav zu erstellen

 $id = VOIP_Connect(56647, "+49123456789");

 for($i = 0; $i <= 30; $i++) {
     IPS_Sleep(1000);
     $c = VOIP_GetConnection(56647, $id);
     if($c['Connected']) {
        IPS_Sleep(1000);
        VOIP_PlayWave(56647, $id, IPS_GetKernelDir() . "/webfront/user/Sprachausgabe/WaveOut98.wav");
        IPS_Sleep(20000);
        break;
     }
 }
 unlink(IPS_GetKernelDir() . "\webfront\user\Sprachausgabe\WaveOut98.wav"); 
 VOIP_Disconnect(56647, $id);  

?>

So und alles scheitert daran das die erstellte Wav von Voip_PlayWave dauerhaft blockiert wird. Nachfolgend kann die weder gelöscht, noch durch eine neue Ansage überschrieben werden bis ich Symcon neu starte. Vielleicht hat ja jemand eine Idee wie man es lösen könnte ohne Wav’s zu generieren.

Und daran das ptts.vbs vielleicht die Datei nach dem Schreiben nicht sauber schließt, hast du gedacht und ausgeschlossen?
Michael

Und daran das ptts.vbs vielleicht die Datei nach dem Schreiben nicht sauber schließt, hast du gedacht und ausgeschlossen?

Ja und nein. Ich habe auf deinen Hinweis hin mal andere Wav-Dateien (z.b. willkommen.wav aus dem MegaVoteEvent) ausprobiert.
Damit hat dann alles sauber funktioniert. Ich dachte dem Fehler auf der Spur zu sein, aber nun läuft plötzlich auch mit meinen generierten Wav’s alles sauber. Werden abgespielt und sind danach nicht mehr dauerhaft blockiert.

Unschön irgendwie :(, jetzt funktioniert zwar alles wie ichs gern hätte, aber fragt sich wie lange und von welchen Faktoren das abhängt. Codebasis ist immer noch die gleiche wie zuvor gepostet.

Werde nun den Windows-Server mal booten, SymconDienst mehrfach neustarten usw. um zu schauen wie stabil der Status jetzt ist.

WaveOut98.wav.mov (238 KB)

Ich bastel gerade mit dem SIP Modul … Verbindung bekomme ich hin, aber in kann irgendwie kein #9 absetzen.


<?php

if($_IPS['SENDER'] == "Execute") {
    $id = VoIP_Connect(31362, "**613");
 
    //Maximal 10 Sekunden warten, dass einer abnimmt
    for($i = 0; $i < 4; $i++) {
        IPS_Sleep(1000);
        $c = VoIP_GetConnection(31362, $id);
        if($c['Connected']) {
            echo "connect";
            VoIP_SendDTMF(31362,$id ,"#9");
            VoIP_Disconnect(31362, $id);
            return;
        }
    }
 
    //Auflegen, falls keiner abnimmt
    VoIP_Disconnect(31362, $id);
    echo "keiner hat abgenommen";
}

Was mache ich hier noch falsch. Die Telefonanlage ist ein Fritzbox und das Endgerät die Doorline Dect Türsprechanlage. Der Anruf mit dem Telefon und die manuelle Eingabe von #9 gehen. Symcon ist aktuell auf 5.4.

Nach ein Sonntag des SIPs habe ich die „Lösung“. Des Rätsels Lösung war das Sleep nach dem Connect und nach dem absetzen der DTMF Töne. Jetzt geht es.


<?php

if($_IPS['SENDER'] == "Execute") {
    $id = VoIP_Connect(31362, "**613");
 
    for($i = 0; $i < 4; $i++) {
        IPS_Sleep(1000);
        $c = VoIP_GetConnection(31362, $id);
        if($c['Connected']) {
            IPS_Sleep(2000);
            VoIP_SendDTMF(31362,$id ,"#9");
            IPS_Sleep(1000);
            VoIP_Disconnect(31362, $id);
            return;
        }
    }
 
    //Auflegen, falls keiner abnimmt
    VoIP_Disconnect(31362, $id);
    echo "keiner hat abgenommen";
}

Hallo,

irgendwie :banghead: kann ich in der Doku nicht finden, wie ich den Registrierungsstaus ermittle … :eek:

Ich würde gern bei erfolgloser Registrierung ein Script aufrufen - ich sehe dies aber nur im Meldungsfenster.

Hat jemand einen Tipp ?

Danke

herbertF

Geht die Instanz dann in Fehler?
Dann ist das Event-Control dein Freund.
Michael

Ja - funkt :smiley: DANKE :wink: