IP-Symcon mit VoIP/SIP Support

Bisher nicht.

paresy

Schade, was ja noch nicht ist kann ja noch werden :wink:
Trotzdem Danke

Für mich wäre das vor allem interessant um Anrufe „mitzubekommen“ und anhand dessen Aktionen auszulösen ohne das Symcon die Verbindung entgegen nimmt, also KEIN automatischer Connect. Lässt sich das konfigurieren?

>> Würde ich auch begrüßen :slight_smile: Gute Idee und sehr praktisch :slight_smile:

Viele Grüße,
Chris

Hi,
hat schon mal einer sowas realisiert?

„Willkommen im Haus des Königs von Deutschland. Bitte geben Sie Ihre PIN ein.“
dann auf Pin warten. Eingabe per DTMF und dann weiter mit Menü.
„Mit 1 starten Sie die Dusche, mit 2 Spülen Sie das Klo, …“ (Nur als Beispiel:-))

Es geht mir um eine Pin-Abfrage nicht das jeder alles einfach steuern kann.

Ralf

Das ist nichts anderes als im Case


case "DTMF":

die Sache abzuarbeiten, siehe auch Anfang vom Thread.
Kannst ja mal schreiben was Du bisher versucht hast.

Hi,
ich will eine Code der Länge X abfragen. Versuch war:


        case "DTMF":
            IPS_LogMessage("VOIP", "DTMF"); 
            $data = json_decode(VOIP_GetData($id_voip, $_IPS["CONNECTION"]), true);
            if ($count < 8){
                $magic *= 10;
                $magic += $_IPS["DATA"];
                $count++;
            }
            if ($count == 8) {
                if ($magic == 12345678){
                    VOIP_PlayWave($id_voip, $_IPS["CONNECTION"], IPS_GetKernelDir() . "/media/voip/fertig.wav");
                }
                else{
                    VOIP_PlayWave($id_voip, $_IPS["CONNECTION"], IPS_GetKernelDir() . "/media/voip/Warnichts.wav");
                }
            }

Das Beispiel arbeitet ja nur mit einem Zeichen als Eingabe und reagiert dann darauf.

Edit: habe meinen Fehler gefunden. Ich hatte $count und $magic lokal definiert aber ich muss dafür Variablen anlegen und dann immer mit GetValue holen und mit SetValue setzen dann klappt es auch mit dem Nachbarn:-)

Ralf

Hallo.

Ich habe bei IPS 5.2 das VoIP Modul entdeckt.
Habe es ausprobiert. Super Sache.

Allerdings habe ich einige Fragen.
Das Modul nimmt die Anrufe sofort entgegen. Logs aus dem Arbeitsscript.
06.11.2019 09:46:54 | 00000 | CUSTOM | VoIP_Script | Sender:VoIP Event:Incoming
06.11.2019 09:46:54 | 00000 | CUSTOM | VoIP_Script | Sender:VoIP Event:Connect

Wie kann ich dem VoIp Modul das „Connect“ selber bestimmen?
Ich will nur auf „Incoming“ reagieren und ein File abspielen. Das Modul soll sich nicht Connecten.

Dann habe ich noch etwas gesehen.
06.11.2019 09:38:50 | 00000 | CUSTOM | VoIP_Script | Sender:VoIP Event:Incoming
06.11.2019 09:38:50 | 00000 | CUSTOM | VoIP_Script | Ein eingehender Anruf ID:3
06.11.2019 09:38:50 | 56047 | MESSAGE | VoIP | Deregistriert!

Ab und zu bekomme ich ein „Deregistriert!“. Warum? Dann muss ich das VoiP Modul wieder per Hand registrieren.
Wenn kein Anruf reinkommt bleibt das Modul „Registriert!“.

Könnt Ihr mir hier helfen?

Danke.
BYE
Thomas

Ich nutze das Modul auch zur Benachrichtigung bei Anrufen. Dabei nimmt das Modul den anruf nicht entgegen, sondern signalisiert nur. Funktioniert Super, wenn sich der Homematic socket nicht gerade wieder wegen fehlenden „Pong“ deaktiviert hat (also alle 90s für 20s tot ist).


<?php
$id_voip=xxxx;
$id_gong=yyyy;

//print_r($_IPS);
if($_IPS['SENDER'] == "VoIP") {
    $connid=$_IPS["CONNECTION"];
    $conn=VoIP_GetConnection($id_voip, $connid);
    if($conn["Direction"] == 1 /* Ausgehend */) {
        return;
    }
 
    switch($_IPS["EVENT"]) {
        case "Incoming":
            $nummer=$conn["Number"];
            IPS_LogMessage("VoIP", "eingehender Anruf von $nummer");
            HM_WriteValueString($id_gong,"SUBMIT","1,1,5,2");
            break;
    }
}

Das Abarbeitungsskript legt man ja selber fest, also ob man abnimmt oder nicht entscheidet dann ja letztlich das Empfangsskript. Das Modul selber erhält ja aber grundsätzlich den Anruf und gibt dann erst die Daten an das Abarbeitungsskript weiter, daher fände ich es schön wenn bei dem Modul auch grundsätzlich eine Variable ergänzt werden könnte, die die letzte Rufnummer enthält, die angerufen hat. Das erspart einem selber die Variable anlegen zu müssen und diese aus dem Skript zu beschreiben. Desweiteren fände ich auch eine weitere Variable des Moduls schön indem der letzte empfangene DTMF Signal angezeigt wird.

Wie soll das bitte funktionieren wenn mehrere Anrufe / Verbindungen gleichzeitig anstehen?
Du musst also auf jeden Fall mit einem Script arbeiten wo du die ID der Verbindung hast. Sonst kannst du weder die Rufnummer noch die DTMF der Verbindung zuordnen.
Michael

Ist es nicht so das ein VOIP Instanz einer Telefonummer zugeordnet ist? An einer Telefonnummer kann man doch auch nur einmal anrufen oder? Oder hast Du mehrere Telefonummern IP-Symcon zugeordnet?

Das habe ich jetzt trotzdem noch nicht verstanden, das Modul bekommt doch die Daten, die kann man doch auch im Debug Fenster sehen, und reicht diese dann an ein Skript weiter. Was hindert also dann das Modul daran den Wert der eingehenden Nummer einfach in einer Variable abzulegen, an das Skript wird der Wert doch auch übergeben?

@Fonzo: Du kannst die selbe Nummer mehrfach anrufen. Und das auch gleichzeitig. Geht ja bei einer normalen Telefonanlage auch :slight_smile: Somit ist nicht eindeutig wer aktuell an der Leitung hängt. Eine Variable ist somit nicht zielführend sondern die speziellen Funktionen für Speichern der Daten sollten verwendet werden.

@atmel: Das „manuelle“ Akzeptieren per Skript habe ich auf der Wunschliste.

paresy

Ich möchte gern bei einem eingehenden Anruf eine TTS-Ansage schalten und danach das Gespräch automatisch auflegen lassen.
Was muss ich wo in dem Beispiel des Abarbeitungsskriptes einfügen, damit das nach dem case „PlayFinish“ automatisch aufgelegt wird?

Du willst beim PlayFinish ein VoIP_Disconnect einbauen. Löst das deine Frage?

paresy

Das ist richtig, aber ich brauche ja zu VoIP_Disconnect neben der InstanzID auch die VerbindungsID. Und bei der VerbindungsID scheitere ich dann mit meinen Programmierkenntnissen. Welchen Parameter muss ich dafür eintragen?

Wenn du auf PlayFinish reagierst kannst du die magische Variable $_IPS[„CONNECTION“] verwenden. Dort ist die aktuelle ID drin :slight_smile:

paresy

Der Disconnect ist jetzt zwar richtig, aber da das Gespräch noch nicht aufgelegt wird, scheint es falsch platziert zu sein.

if($_IPS['SENDER'] == "VoIP") {
 
    switch($_IPS["EVENT"]) {
        
        case "Connect":
        IPS_LogMessage("VoIP", "Es wurde eine Verbindung aufgebaut");
        
        $Text='Ansagetext bei Anruf.';
        TTSV_GenerateFileEx(44181, $Text, "/var/lib/symcon/media/wav/hallo.wav", "8khz_16bit_mono", "WAV", "de-de");
        VoIP_PlayWave(57741, $_IPS["CONNECTION"], IPS_GetKernelDir() . "/media/wav/hallo.wav");
            break;

        case "PlayFinish":
            IPS_LogMessage("VoIP", "Es wurde eine Sounddatei abgespielt");
            VoIP_Disconnect(57741, $_IPS["CONNECTION"]);
            return;
 
    }
}

Magst du mal im Debug schauen was passiert? Eigentlich sieht das nämlich ganz korrekt aus.

paresy

Im Debug steht eigentlich auch, dass disconnected wird. Der Ruf bleibt nur eben bei dem anrufenden Telefon weiter bestehen. Ich habe es mit einem Handy und einem Festnetz probiert.

dump.txt (1.74 KB)

Hallo, wir haben eine Lösung für unsere Schranke die per Anruf geöffnet wird.
Asterisk (Telefonanlage) erkennt die Nummer und schaltet die Schranke. Der Anruf wir nicht angenommen, sondern nur die Nummer des Anrufers erkannt.
Ist dieses Szenario in IPS darstellbar?
LG Marc