Problem VoIP legt nicht auf

Hallo,

ich habe eine VoIP Instanz angelegt und das Skript aus der Anleitung getestet (sieeh unten).

Ergebnis ist folgendes:

  1. gehe ich nicht ans Telefon, legt IPSymcon nach der eingestellten Zeit auf
  2. Gehe ich ans Telefon, höre ich die eingestellte Ansage, aber der Anruf wird nicht beendet.

Ist hier ein Fehler im Skript oder wie bekomme ich es dazu, unmittelbar nach der Durchsage aufzulegen?

Dankeschön.

if($_IPS[‚SENDER‘] == „Execute“) {
$id = VoIP_Connect(12345, „0451305005xx“);
//Maximal 10 Sekunden warten, dass einer abnimmt
for($i = 0; $i < 10; $i++) {
IPS_Sleep(1000);
$c = VoIP_GetConnection(12345, $id);
if($c[‚Connected‘]) {
// VoIP_Playwave() unterstützt ausschließlich WAV im Format: 16 Bit, 8000 Hz, Mono.
VoIP_PlayWave(12345, $id, TTSAWSPOLLY_GenerateFile(23456, „IP-Symcon wünscht einen wunderbaren Tag“));
return;
}
}
//Auflegen, falls keiner abnimmt
VoIP_Disconnect(12345, $id);
}

Da fehlt ja auch das void Disconnet nach dem voip Playwave und vor dem Return.
Alternativ kannst du statt dem Return auch Break 2 benutzen, damit wird die Schleife verlassen und das Disconnet am Ende ausgeführt.
Michael

… achso, ich hatte gehofft, dass das Beispielscript aus der Anleitung komplett nutzbar ist. Da fehlen mir die Kenntnisse bis ins PHP-Detail :slight_smile:

Wenn ich „Break 2;“ benutzen würde, wann wird denn dann aufgelegt - wird Playwave komplett beendet oder bricht er zuvor ab? Vielleicht könnte das Beispiel in der Anleitung dahingehend verbessert werden - mir dienen die Beispiele meist als Gerüst für eigenen Anpassungen. Nach einigem Probieren hatte ich schon herausbekommen, dass return bis ans Ende des Scriptes springt (also die komplette if-Routine beendet und nicht nur die for-Schleife), zu mehr hat es aber bei mir leider nicht gereicht :slight_smile:.

Simmt, das geht nicht. Also ist das Beispiel korrekt.
Es fehlt aber der Hinweis, welcher bei VOIP_Playwave steht:

Es wird nicht auf das Beenden des Abspielens der Sounddatei gewartet. Dies wird durch die Systemvariable $_IPS[‚EVENT‘] == „PlayFinish“ behandelt.

Es wird also das Abarbeitungsskript benötigt und da bei

 case "PlayFinish":
             VoIP_Disconnect($_IPS["INSTANCE"], $_IPS["CONNECTION"]);
             break;

Michael

Ich habe es so gelesen, dass das Abarbeitungsskript nur bei eingehenden Verbindungen abläuft - so steht es zumindest in der Anleitung. Dem widerspricht zwar die erste Zeile, die hierauf nochmals prüft - auf jeden Fall wird mir das Skript in dieser Fassung wahrscheinlich nicht helfen…

Könntet Ihr hier die Doku nochmals überarbeiten?

Fragen wären explizit

  • wann wird das Abarbeitungsskript wirklich aufgerufen (wenn nur bei eingehenden Verbindungen, könnten die ersten Zeilen im Skript gelöscht werden)?
  • wie kann ich erreichen, dass das Wave komplett zu Ende gespielt und danach aufgelegt wird? Dies ist mir leider noch immer unklar.

Ja - das ist in der Tat missverständlich formuliert. Das Skript wird immer aufgerufen. Aber im Skript reduzieren wir aktuell die Abarbeitung auf eingehende Gespräche.

Ich würde nach dem PlayWave ein Sleep einbauen und dann das Disconnect. Alternativ das Abarbeitungsskript wie Nall-Chan vorgeschlagen hat.

paresy

… wie häufig wird denn das Abarbeitungsskript aufgerufen, gibt es hier einen zyklischen Timer oder bestimmte Events?

Was wäre denn der Goldstandard, den Ihr empfehlen könnt? Mein Ziel ist ein allgemeines Anrufskript, welches verschieden lange Texte vorliest oder Waves (Sirene) abspielt. Aus diesem Grund ist ein festes Sleep-Intervall zwar möglich aber nicht sehr schön. Bei kurzen Texten würde es zu lange warten und bei langen Texten ggf. zu früh abschneiden.

Mein Anwendungsfall:
Ich habe mehrere Gruppentelefonnummern, die bei Anruf alle Geräte der definierten Gruppe auf Lautsprecher schalten und die Durchsage wiedergeben.
Mein Ziel ist z.B. beim Alarmanlagenskript folgendes umzusetzen:

  • „Alarmanlage scharf“ über die Türklingel vorlesen zu lassen
  • Probleme bei der Aktivierung intern und extern vorlesen zu lassen (z.B. welche Fenster noch offen sind - dies wären unterschiedliche Telefonnummern nacheinander)
  • Voralarm intern ausgeben zu lassen
  • Hautpalarm über alle Teilnehmer ausgeben zu lassen, ggf. wiederholt

Hier bin ich auf ein zeitnahes Beenden der Vorgängerverbindung angewiesen.

Da hier die Länge der Waves sehr unterschiedlich ist und ich auch keine extrem langen Pausen zwischen den Anrufen haben möchte, wäre eine Möglichkeit des sinnvollen Endes der Telefonverbindung nach Beendigung der Durchsage super für mich. Ein Auflegen per Hand ist durch den Gruppenruf und vieler beteiligter Geräte nicht möglich.

Wie könnte ich dies am Besten lösen? Kann ich in dem Skript noch irgendeine Schleife einbauen, die nur aufgerufen wird, wenn Playwave stattfand, in kurzen Runden durchlaufen wird und auf Ende von Playwave testet? Leider weiß ich aber nicht, wie ich dies am Besten anfangen könnte.

Ich würde mich sehr über einen Denkanstoß bzw. Änderung des Beispielskriptes mit dieser Erweiterung freuen. Dies würde bestimmt auch anderen Nutzern helfen :slight_smile:

… wenn ich das Abarbeitungsskript nehmen würde und die Bedingung (eingehender Anruf) entferne, würde er ja sicherlich auflegen, sobald Playwave fertig ist. Wenn ich mehrere Waves in Folge (mehrere Texte plus Sirene) abspiele, beendet er den Anruf ggf. zu früh? Habe leider keine gute Idee, wie das praktisch bewerkstelligt werden könnte. Am Besten wäre es eigentlich, wenn Playwave erst verlassen wird, wenn es fertig ist - dann wäre es ja mit normaler Skriptlogik einfach mit dem nächsten Befehl umsetzbar.

P.S. Was passiert eigentlich, wenn ich zwei Playwave Anweisungen nacheinander aufrufe - werden die nacheinander abgespielt oder beendet Playwave2 sofort Playwave1? Auch eine kleine Schwierigkeit, wenn mehrere Waves verkettet werden sollen.

… hat noch jemand einen Skriptanstoß, wie ich dies am Besten umsetzen könnte. Zur Not muss ich mich von TTS verabschieden und fertige WAVE-Dateien kreieren, von denen ich die Länge kenne und mit sleep arbeiten …

Hattest du das mit dem Aktionsskript und PlayFinish ausprobiert wie oben vorgeschlagen? Das ist meiner Meinung nach die optimale Lösung.

paresy

… d.h. ich entferne die if-Bedingung für nur eingehende Anrufe und belasse das Skript ansonsten wie im Beispiel?

Kannst Du mir noch zum Verständnis sagen, wann das Skript aufgerufen wird (zyklisch, Event, …)?

Dankeschön

Ja, probier es am besten aus. Es wird immer aufgerufen, wenn sich bei VOIP etwas ändert.

paresy

Hallo,

ich habe jetzt eine Menge ausprobiert und folgendes festgestellt:

Mit IPS 6.4 hatte ich massive Probleme - der Text wurde manchmal vorgelesen, meist aber nicht. Im Logging habe ich gesehen, dass die PlayWave Routine gar nicht gestartet wurde.

Ich probierte dann das Update auf IPS 7 - hier scheint zumindest aktuell das Vorlesen stabil zu funktionieren.

→ Wurde am VOIP Modul irgendetwas bei IPS 7 verbessert?

Erkenntnis: Das Aktionsskript wird unmittelbar nach Playwave ausgeführt, beendet also sofort die Verbindung, nachdem Playwave fertig ist. Mehrere Waves lassen sich nicht abspielen.
Deaktiviere ich das Aktionsskript testweise und lasse 2 Playwaves nacheinander abspielen, „überschreibt“ der zweite Aufruf sofort den ersten. Ich höre quasi einen Teil des ersten Wortes und dann den Satz bzw. Ton des zweiten Aufrufes.

Lässt sich hier seitens IPS noch etwas verbessern, so dass ich nicht mit irgendwelchen Kunstpausen arbeiten muss? Es wäre doch sicherlich am einfachsten, wenn Playwave so lange dauert, wie das Wave abgespielt wird oder spricht hier etwas dagegen? Dann könnte ich das Auflegen auch sauber im jeweiligen Skript ausführen ohne ein Aktionsskript zu bemühen.

Noch eine kleine Frage Off-Topic: Die TTS Kommandos für AWS_Polly und die Windows-TTS Enginge unterscheiden sich hinsichtlich des Aufrufes und der Rückgabe. Könnte man das nicht angleichen, so dass man die Engines einfach austauschen könnte?

Dankeschön

Ich glaube du hast das mit dem Aktionsskript falsch verstanden. Du bekommst ein PlayFinish (siehe Systemvariablen — IP-Symcon :: Automatisierungssoftware) wenn das Wav abgespielt wurde. Dann musst du natürlich das zweite Starten, wenn du mehrere abspielen willst. Und dann erst auflegen. Mit VoIP_SetData — IP-Symcon :: Automatisierungssoftware kannst du dir quasi den State deiner Verbindung merken.

paresy

… das Skript habe ich schon verstanden, ich wollte nur ausdrücken, dass er natürlich beim ersten PlayFinish bereits auflegt und nach einer Lösung fragen VoIP_SetData scheint genau richtig, das werde ich ausprobieren …

Frage 1:
Wie schaffe ich es aber (ohne statische Pause), die beiden Waves nacheinander abzuspielen ohne dass Wave2 die Wiedergabe von Wave1 überschreibt? Da der Text variabel ist, kann ich zuvor nicht wissen, wie lange das Wave dauern wird.

Es wäre trotzdem einfacher (außer andere Dinge stehen dem entgegen), wenn die Funktion Playwave einfach erst beendet würde, wenn das Wave fertig abgespielt wurde.

Wie steht es denn mit meinen anderen beiden „Fragen“
Frage 2: Wurde am VOIP Modul irgendetwas bei IPS 7 verbessert?

Frage 3 Offtopic: Die TTS Kommandos für AWS_Polly und die Windows-TTS Enginge unterscheiden sich hinsichtlich des Aufrufes und der Rückgabe. Könnte man das nicht angleichen, so dass man die Engines einfach austauschen könnte?

Danke Euch und auch einen Dank für die super Arbeit an IPSymcon.

  1. Wie vorgeschlagen → Wenn PlayFinish kommt direkt das zweite PlayWave starten
  2. Wir haben die Bibliotheken dahinter aktualisiert. Gut möglich, dass es dadurch bei dir besser funktioniert.
  3. Nein - Ich würde einfach überall AWSPolly nutzen und das Windows TTS gar nicht mehr.

paresy