IPS_Sleep in einer Schleife

Hallo,

ich nutze erfolgreich das VOIP Modul um mich bei Brandalarm selbst anzurufen.

Ich habe den Besipielcode verwendet.

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);
 }

Ich sehe ja IPS_Sleep immer kritisch wegen blockierten Slots. Und länger wie 20 Sec soll man das meines wissens eh nicht machen.

Ist IPS_Sleep wie in der Schleife im Beispiel, weniger kritisch?
Weil es sind ja nur 1000ms x die Schleifendurchgänge.

Grund:
Ich möchte in dem selben Script mehrere Telefonnummern eintragen, die angerufen werden und jede Nummer soll 3 mal hintereinander angerufen werden.
Wie würdet Ihr das umsetzen??

Danke schon mal.

Kennst du schon unter Telefonkette Modul?

paresy

1 „Gefällt mir“

Servus

Indem du das Script wie eine State-Machine aufbaust.
d.h. das Script stellt einen Timer durch welchen es sich selbst immer wieder aufruft.
Dazu brauchst du eine Variable als Schleifenzähler welcher die Aufrufe mitzählt. So weiß das Script dann:
zb.
1.Aufruf → Alarm eingegangen, stelle den Timer
2.Aufruf → 1sten Anruf tätigen
3.Aufruf → 2ten Anruf tätigen
4.Aufruf → 3ten Anruf tätigen
5.Aufruf → Timer wieder abschalten , irgendwas machen

Je nach Gusto mit $_IPS[‚SENDER‘] abfragen wie das Script überhaupt gestartet wurde (Händisch, per Timer, per Webfront usw) und auch darauf entsprechend reagieren.

oder für Faule: die Wartezeit per Ablaufplan machen, allerdings wird das leicht ein schwer lesbares Gestrüpp. - ich mags nicht. Wenn du ein wenig coden kannst würde ich das wie oben gezeigt per Script vorziehen.

gruß
bb

1 „Gefällt mir“

@paresy das klingt interessant, schaue ich mir an.

@bbernhard
mit Scripttimer und hochzählen mit Case Statement wäre jetzt auch meine Idee, also war ich schon auf dem richtigen Weg.
Danke.
Den Ablaufplan mag ich auch nicht.
Hätte es den 2019 schon gegeben, als ich mit IPS angefangen habe, hätte ich den Ablaufplan sicherlich geliebt.

Aber ist jetzt 1000ms bei IPS_Sleep x 10 über eine Schleife iterieren, genau so kritisch wie 10000ms IPS_Sleep einzeln ausgeführt?
Schon oder?

Hi,
kannst Du nicht den Anruf mit deinem Script realisieren und den Rest mit einem Abarbeitungsscript welches Du in der Konfiguration der VOIP-Instanz eingerichtet hast? So bräuchtest Du keine Warteschleifen. Da würde es dann so aussehen:

error_reporting(E_ERROR | E_PARSE | E_NOTICE);
if($_IPS["SENDER"] == "VoIP") {
    $VoIPID = $_IPS["INSTANCE"];
    switch($VoIPID){
        case 39859:
            $leitung = "8407";
            break;
        case 36184:
            $leitung = "943617";
            break;
        case 42383:
            $leitung = "943618";
            break;
    }
      switch($_IPS["EVENT"]) {
        case "Incoming":
            break;
        case "Connect":
            break;
        case "Disconnect":
            break;
        case "PlayFinish":
            @VoIP_Disconnect($VoIPID, $connection["ID"]);
            break;
    }
}

Vermutlich müsstest Du bei „Connect“ dein PlayWave starten und bei „PlayFinish“ wie hier Disconnect machen.

Ralf

1 „Gefällt mir“

Danke. Wsl gibt es viele Möglichkeiten. Ich werde deinem Vorschlag auch mal testen und das beste umsetzen.

Geht aber erst seit 6.4 Public Beta wieder. In 6.3 war voip defekt.

Ich benutze voip um Werbeanrufe abzulehnen so daß mein Telefon nicht klingelt.

Ralf

@HarmonyFan
Warum ist VOIP in der 6.3 defekt? Nur bestimmte befehlsreferenz?
Ich habe 6.3, konnte bis jetzt bei ausgehenden Anrufen nichts feststellen.

Habs jetzt so umgesetzt.

Pro Brandmeldeschleife eine VOIP Instanz.
Das ganze ruft drei Rufnummern hintereinader an und wiederholt das ganze 1x.
Wenn jemand abhebt, dann wird nicht mehr angerufen.
Bei Abheben, wird die Ansage abgespielt, hier habe ich ein IPS_Sleep einbauen müssen, das die Absage abgespielt werden kann, also das gewartet wird. In der 6.4 soll das per Variable überwacht werden können, somit kann ich das slepp wieder rausschmeissen.

Im Webfront, kann man die Telefonnummern eingeben und Nummern aktivieren oder deaktivieren, sowie die Funktion testen.
Ist sicherlich ein bisschen Spaghetti Code, aber ich kanns nicht besser.

Falls man hier was verbessern kann, immer gene her mit den Vorschlägen.
@bbernhard Hast du ein Beispiel oder einen Link mit einer anständigen Zustandsmaschine?

Hier mein Skript, vielleicht kanns jemand gebrauchen…

<?php

if($_IPS['SENDER'] == "Variable") {

    $state = GetValueInteger(58601);


switch ($state) {
    case 1:     $Nummer = GetValueString(35515);        //Telefonnummer
                $Hans_aktiv = GetValueBoolean(34709);   //Teilnehmer aktivieren oder deaktivieren
                if ($Hans_aktiv) {
                
                //Hans anrufen wenn aktiviert
                $id = VoIP_Connect(35954, "$Nummer");
                //Maximal 10 Sekunden warten, dass einer abnimmt
                for($i = 0; $i < 15; $i++) {
                    IPS_Sleep(1000);
                    $c = VoIP_GetConnection(35954, $id);
                    if($c['Connected']) {
                        // VoIP_Playwave() unterstützt ausschließlich WAV im Format: 16 Bit, 8000 Hz, Mono. Sound abspielen
                        VoIP_PlayWave(35954, $id, IPS_GetKernelDir() . "media/Brandalarm/Garage.wav");
                        IPS_Sleep(7000);    //warten bis abgespielt ist 
                        SetValueInteger(58601,1);   //Status für beendet setzen 
                        SetValueString(23981,"Hans");   //Wer hat abgnommen setzen
                        return;
                    }
                            }
                
                //Auflegen, falls keiner abnimmt
                VoIP_Disconnect(35954, $id);
                SetValueInteger(58601,2);   //Status 1 höher um nächsten anzurufen
                }
                else
                {
                SetValueInteger(58601,2);   //Falls Teilnehmer nicht aktiviert, sofort Status für nächsten Teilnehmer setzen 
                }
    break;

    case 2:
                $Nummer = GetValueString(47342);    //Telefonnummer
                $Maria_aktiv = GetValueBoolean(30225);     //Teilnehmer aktivieren oder deaktivieren
                if ($Maria_aktiv){

                //Maria anrufen  wenn aktiviert
                $id = VoIP_Connect(35954, "$Nummer");
                //Maximal 10 Sekunden warten, dass einer abnimmt
                for($i = 0; $i < 15; $i++) {
                    IPS_Sleep(1000);
                    $c = VoIP_GetConnection(35954, $id);
                    if($c['Connected']) {
                        // VoIP_Playwave() unterstützt ausschließlich WAV im Format: 16 Bit, 8000 Hz, Mono.
                        VoIP_PlayWave(35954, $id, IPS_GetKernelDir() . "media/Brandalarm/Garage.wav");
                        IPS_Sleep(7000);    //warten bis abgespielt ist 
                        SetValueInteger(58601,1);       //Status für beendet setzen
                        SetValueString(23981,"Maria");     //Wer hat abgnommen setzen
                        return;
                    }
                        }
               
                
                //Auflegen, falls keiner abnimmt
                VoIP_Disconnect(35954, $id);
                SetValueInteger(58601,3);   //Status 1 höher um nächsten anzurufen
                }
                else
                {
                SetValueInteger(58601,3);  
                }
    break;

    case 3:
                $Nummer = GetValueString(42950);    //Telefonnummer
                $Telefon_optional_aktiv = GetValueBoolean(47824);       //Teilnehmer aktivieren oder deaktivieren
                if ($Telefon_optional_aktiv){

                //Teilnehmer optional anrufen  wenn aktiviert
                $id = VoIP_Connect(35954, "$Nummer");
                //Maximal 10 Sekunden warten, dass einer abnimmt
                for($i = 0; $i < 15; $i++) {
                    IPS_Sleep(1000);
                    $c = VoIP_GetConnection(35954, $id);
                    if($c['Connected']) {
                        // VoIP_Playwave() unterstützt ausschließlich WAV im Format: 16 Bit, 8000 Hz, Mono.
                        VoIP_PlayWave(35954, $id, IPS_GetKernelDir() . "media/Brandalarm/Garage.wav");
                        IPS_Sleep(7000);    //warten bis abgespielt ist 
                        SetValueInteger(58601,1);       //Status für beendet setzen
                        SetValueString(23981,"Telefon optional");       //Wer hat abgnommen setzen
                        return;
                    }
                        }
               
                
                //Auflegen, falls keiner abnimmt
                VoIP_Disconnect(35954, $id);
                SetValueInteger(58601,4);       //Status 1 höher um nächsten anzurufen
                }
                else
                {
                SetValueInteger(58601,4);       //Falls Teilnehmer nicht aktiviert, sofort Status für nächsten Teilnehmer setzen
                }
   break;

   case 4:     $Nummer = GetValueString(35515);        //Telefonnummer
                $Hans_aktiv = GetValueBoolean(34709);   //Teilnehmer aktivieren oder deaktivieren
                if ($Hans_aktiv) {
                
                //Hans anrufen wenn aktiviert
                $id = VoIP_Connect(35954, "$Nummer");
                //Maximal 10 Sekunden warten, dass einer abnimmt
                for($i = 0; $i < 15; $i++) {
                    IPS_Sleep(1000);
                    $c = VoIP_GetConnection(35954, $id);
                    if($c['Connected']) {
                        // VoIP_Playwave() unterstützt ausschließlich WAV im Format: 16 Bit, 8000 Hz, Mono. Sound abspielen
                        VoIP_PlayWave(35954, $id, IPS_GetKernelDir() . "media/Brandalarm/Garage.wav");
                        IPS_Sleep(7000);    //warten bis abgespielt ist 
                        SetValueInteger(58601,1);   //Status für beendet setzen 
                        SetValueString(23981,"Hans");   //Wer hat abgnommen setzen
                        return;
                    }
                            }
                
                //Auflegen, falls keiner abnimmt
                VoIP_Disconnect(35954, $id);
                SetValueInteger(58601,5);   //Status 1 höher um nächsten anzurufen
                }
                else
                {
                SetValueInteger(58601,5);   //Falls Teilnehmer nicht aktiviert, sofort Status für nächsten Teilnehmer setzen 
                }
    break;

    case 5:
                $Nummer = GetValueString(47342);    //Telefonnummer
                $Maria_aktiv = GetValueBoolean(30225);     //Teilnehmer aktivieren oder deaktivieren
                if ($Maria_aktiv){

                //Maria anrufen  wenn aktiviert
                $id = VoIP_Connect(35954, "$Nummer");
                //Maximal 10 Sekunden warten, dass einer abnimmt
                for($i = 0; $i < 15; $i++) {
                    IPS_Sleep(1000);
                    $c = VoIP_GetConnection(35954, $id);
                    if($c['Connected']) {
                        // VoIP_Playwave() unterstützt ausschließlich WAV im Format: 16 Bit, 8000 Hz, Mono.
                        VoIP_PlayWave(35954, $id, IPS_GetKernelDir() . "media/Brandalarm/Garage.wav");
                        IPS_Sleep(7000);    //warten bis abgespielt ist 
                        SetValueInteger(58601,1);       //Status für beendet setzen
                        SetValueString(23981,"Maria");     //Wer hat abgnommen setzen
                        return;
                    }
                        }
               
                
                //Auflegen, falls keiner abnimmt
                VoIP_Disconnect(35954, $id);
                SetValueInteger(58601,6);   //Status 1 höher um nächsten anzurufen
                }
                else
                {
                SetValueInteger(58601,6);  
                }
    break;

    case 6:
                $Nummer = GetValueString(42950);    //Telefonnummer
                $Telefon_optional_aktiv = GetValueBoolean(47824);       //Teilnehmer aktivieren oder deaktivieren
                if ($Telefon_optional_aktiv){

                //Teilnehmer optional anrufen  wenn aktiviert
                $id = VoIP_Connect(35954, "$Nummer");
                //Maximal 10 Sekunden warten, dass einer abnimmt
                for($i = 0; $i < 15; $i++) {
                    IPS_Sleep(1000);
                    $c = VoIP_GetConnection(35954, $id);
                    if($c['Connected']) {
                        // VoIP_Playwave() unterstützt ausschließlich WAV im Format: 16 Bit, 8000 Hz, Mono.
                        VoIP_PlayWave(35954, $id, IPS_GetKernelDir() . "media/Brandalarm/Garage.wav");
                        IPS_Sleep(7000);    //warten bis abgespielt ist 
                        SetValueInteger(58601,1);       //Status für beendet setzen
                        SetValueString(23981,"Telefon optional");       //Wer hat abgnommen setzen
                        return;
                    }
                        }
               
                
                //Auflegen, falls keiner abnimmt
                VoIP_Disconnect(35954, $id);
                SetValueInteger(58601,1);       //Status 1 höher um nächsten anzurufen
                }
                else
                {
                SetValueInteger(58601,1);       //Falls Teilnehmer nicht aktiviert, sofort Status für nächsten Teilnehmer setzen
                }
   break;
                }
 }

Hi,
PlayWave war in 6.3 defekt in dem Sinne das danach sofort aufgelegt wurde und es kam auch kein PlayFinish. Für deine Anwendung spielt es keine Rolle.

Ralf

Moin,
das Modul „Telefonansage“ macht dein Script vielleicht ein wenig schöner bzw. das von Paresy erwähnte „Telefonkette“ könnte vielleicht schon größtenteils dein Script ersetzen.

Ich muss aber gestehen das ich es bei Rauchmeldung auch so mache wie Du, d.h. mit Sleep():grinning_face_with_smiling_eyes: Allerdings wusste ich es damals nicht besser.

Ralf

Ich hab das gleich gemerkt, deswegen dieses

IPS_Sleep(7000);    //warten bis abgespielt ist 

Das Modul Telefonkette habe ich jetzt noch nicht geteset, weil ich im Funktionsumfang nichts von:

  1. Teilnehmer aktivieren
  2. Nummern Eingabe vom Webfront
  3. Uhrzeiten einstellen, bestimmte Nummern nur am Wochenende anrufen und andere unter der Woche.

Vielleicht kann man das auch alles, mittels den Variablen von (Telefonkette) trotzdem machen.
Habs jetzt nicht getestet, weil ich immer erst versuche es selbst zu coden, Übung macht den Meister.

Moin,

so habe ich es damals auch gesehen. Danach habe noch einige Sachen mit der VOIP-Instanz gemacht damit mein Telefon nur klingelt wenn ich es will.

Ralf