.titleBar { margin-bottom: 5px!important; }

zeitgesteuerter Anrufbeantworter

Dieses Thema im Forum "Asterisk Skripte" wurde erstellt von klingeljoe, 25 Feb. 2005.

  1. klingeljoe

    klingeljoe Neuer User

    Registriert seit:
    11 Feb. 2005
    Beiträge:
    21
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo Forum,

    Man kann ja mit gotoiftime zeitgesteuert Anweisungen im Dialplan anbringen.
    Da ich aber von meiner vbox-Zeit da etwas flexibler war habe ich versucht sowas mal nachzustellen.
    Ich bin zwar bestimmt kein begnadeter Perl-Hacker, eher ein schlechter, aber ich habe doch was hinbekommen.

    Man braucht nur zwei Scripte un den passenden context im Dialplan.
    Damit kann man bequem, nummernbezogen und zeitbezogen auf Anrufe reagieren.
    Wer mich schonmal zu Fussballzeit angerufen hat, der weiß, wie wenig mich dass amüsiert ;).
    ich stell alles mal hier rein, sollte fast schon selbsterklärend sein, ansonsten Fragen.

    in der extensions conf bei allem was von draussen kommt:

    Code:
    exten => 7819xxx,1,Wait
    exten => 7819xxx,2,SetLanguage(de)
    exten => 7819xxx,3,AGI,voicebox.agi
    exten => 7819xxx,4,Dial(SIP/10,${TIMEOUT},HtTr)
    exten => 7819xxx,5,Playback(${SOUNDDIR}/${EXTDIR}/${SOUNDFILE})
    exten => 7819xxx,6,Voicemail(10)
    exten => 7819xxx,7,Playback(Goodbye)
    exten => 7819xxx,8,Hangup
    
    Hier das voicebox.agi:
    Da müssen natürlich die Standards entsprechend angepasst werden.
    Code:
    #!/usr/bin/perl -w
    
    use Asterisk::AGI;
    ### Timergesteuerter Anrufbeantworter by klingeljoe
    #
    ### default Einstellungen festlegen
    # Standardtimeout
    $stdtimeout=30;
    # Basis Soundirectory
    $soundbase="/var/spool/asterisk/voicemail/default";
    # Standardextensions Soundir, dieses Directory wird verwendet wenn kein Timmer gefunden wurde
    $stdextdir=10;
    # Standard unavailable Message
    $stdunavail=unavail;
    ### Ende default Einstellungen
    
    $AGI = new Asterisk::AGI;
    %input = $AGI->ReadParse();
    
    $minute=0; $hour=0; $day=0; $month=0;
    
    $cnt=0; $i=0;
    
    ($minute, $hour, $day, $month) = (localtime)[1,2,6,4];
    
    $calledmsn = $input{'extension'};
    print STDERR "calledmsn\n";
    @timerdata="";
    
    open (TIMERDATA, "/etc/asterisk/vboxtimer.conf") || die "konnte vboxtimer.conf nicht öffnen\n";
        while (<TIMERDATA>){
          if ($_ =~ m/^\[([0-9]*)\|(.*)\]\n/){
            $extenname = $1;
            $extdir    = $2;
          }
          if ($_ =~ m/^[0-9]{1,2}.*\n/){
            chomp $_;
            @timerdata= $_ ;
              for ($i=0; $i<=$#timerdata; $i++){
                $cnt=++$cnt;
                @timerdata=split(/\s/,$_);
                $timerdata{"$cnt"."7"}=$extenname;
                for ($i=0; $i<=$#timerdata; $i++){
                  $timerdata{"$cnt$i"} = $timerdata[$i] ;
                }
              }
          }
        }
    close (TIMERDATA);
    
    #Überprüfen ob die Timer zu jetzigen Zeit passen
    $atm    = $hour*60+$minute;
    for ($i=1; $i<=$cnt; $i++){
      $stimer = ($timerdata{"$i"."0"} * 60) + $timerdata{"$i"."1"};
      $etimer = ($timerdata{"$i"."2"} * 60) + $timerdata{"$i"."3"};
      $tday   =  $timerdata{"$i"."4"};
      if ($etimer < $stimer && $atm < $stimer){
        $etimer = $etimer + 1440;
        $atm = $atm + 1440;
      }elsif($etimer < $stimer){
        $etimer = $etimer + 1440;
      }
      if ($stimer <= $atm && $etimer >= $atm && $tday eq $day && $timerdata{"$i"."7"} == $calledmsn ||
          $stimer <= $atm && $etimer >= $atm && $tday eq "*" && $timerdata{"$i"."7"} == $calledmsn){
        printf ("Timer $i Startstunde und Minute ist kleiner als die jetzige\n");
        goto DUMPER;
      }
    }
    goto STANDARD;
    
    DUMPER:
    $gesuchte_extension = $timerdata{"$i"."7"};
    $AGI->set_variable(TIMEOUT, $timerdata{"$i"."6"});
    $AGI->set_variable(SOUNDFILE, $stdunavail);
    $AGI->set_variable(SOUNDDIR, $soundbase);
    $AGI->set_variable(EXTDIR, $extdir);
    exit(0);
    
    STANDARD:
    $AGI->set_variable(TIMEOUT, $stdtimeout);
    $AGI->set_variable(SOUNDFILE, $stdunavail);
    $AGI->set_variable(SOUNDDIR, $soundbase);
    $AGI->set_variable(EXTDIR, $stdextdir);
    exit(0);
    
    Und nun die config Datei.
    Diese muß in /etc/asterisk liegen und
    vboxtimer.conf lauten
    Code:
    ## vboxtimer.conf   by klingeljoe
    ##
    ##
    
    # Kurze Beschreibung:
    # in den eckigen klammen steht als erstes die angewählte Rufnummer gefolgt von dem | (Pipe) Symbol und
    # dann folgt die Extension für die Mailbox.
    # [4711|23] ist Rufnummer 4711 holt die Message Dateien aus der Voicebox 23.
    # Natürlich müssen die Voiceboxen, sowie dei Messages dort existieren.
    # Jeder Telefonnumerblock begint mit den ekigen Klammern.
    #
    # Dann folgen die Timerparameter
    # [Startstunde] [Starminute] [Endstunde] [Endminute] [Tag] [Message] [Timeout]
    #
    # Die Parameter müssen durch ein (nur eins!) Leerzeichen getrennt werden.
    # [Startstunde] 0 - 23
    # [Startminute] 0 - 59
    # [Endstunde] 0 - 23
    # [Endminute] 0 - 59
    # [Tag] 0 - 6 (0 ist der Sonntag und 6 ist der Samstag, * ist jeder Tag)
    # [Message] Name der Message im Voicebox-Directory
    # [Timeout] Timeout in Sekunden bis die Voicebox abhebt. Hier gelten die Paramter die Asterisk erlaubt.
    #           In den meisten fällen reicht wohl ein 0 - 90
    # [8877937|10]  ; Für Rufnummer 8877937 liegen die Voicedateien in Mailbox 10
    # 15 30 17 15 6 fussball 0 ; Samstags zwischen 15:30 und 17:15 die Message fussball abspielen sofort (Timeout 0)
    # 22 30 6 30 * unavail 0 ; Nachts von 22:30 bis 6:30 die Message unavail abspielen sofort (Timeout 0)
    # 17 55 18 55 * dailysoap 90 ; Jeden Tag von 17:55 bis 18:55 90 Sekunden klingeln lassen bis die Message dailysoap abgespielt wird
    # Wichtig ist die Timer mit der Wildcard * immer an den Schluß des Blocks setzen, denn der erste der gefunden wird gewinnt!!
    [8877937|10]
    10 30 20 30 2 fussball 0
    11 30 21 30 3 handball 30
    
    
    [7819999|10]
    ###
    15 30 17 15 6 fussball 11
    22 30 6 30 * unavail 0
    
    Solche Sachen wie "Nur Wochentags" oder "Freitag bis Sonntag" habe ich noch nicht implementiert, kommt vielleicht aber noch.
    Wer möchte kann es testen und auch verbessern.
    Viel Spass damit

    klingeljoe
     
  2. tabellar

    tabellar Neuer User

    Registriert seit:
    13 Feb. 2005
    Beiträge:
    55
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi klingeljoe,

    Dein konfigurierbarer AB sieht ja wirklich gut aus! Ich mag nur leider Perl nicht so sehr und habe es auf meinem Gentoo Rechner auch gar nicht installiert. Ich werde aber das ganze mal auf Python umschreiben (wenn ich die Zeit dazu habe) und mich dann wieder melden.

    Gruss Tabellar
     
  3. LarsAC

    LarsAC Neuer User

    Registriert seit:
    27 Okt. 2004
    Beiträge:
    12
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Python ist mir auch sympathischer. Wenn Du was hast sag mal Bescheid, das täte mich auch interessieren.

    Lars
     
  4. macsea

    macsea Neuer User

    Registriert seit:
    27 Dez. 2004
    Beiträge:
    60
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Problem mit voicebox.agi

    Hi Leute!

    Leideer funkt bei mir die voicebox.agi nicht richtig.
    Hier mal die Ausgabe dazu.

    -------------------------------------------------------------------------------
    Going to extension s|1 because of Complete received
    -- Executing Answer("Zap/1-1", "") in new stack
    -- Accepting voice call from '69910551319' to 's' on channel 0/1, span 1
    -- Executing AGI("Zap/1-1", "voicebox.agi") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/voicebox.agi
    Unquoted string "unavail" may clash with future reserved word at /var/lib/asterisk/agi-bin/voicebox.agi line 13.
    calledmsn
    -- AGI Script voicebox.agi completed, returning 0
    -- Executing SetMusicOnHold("Zap/1-1", "default") in new stack
    -- Executing Dial("Zap/1-1", "SIP/11&SIP/12&SIP/10|200|m") in new stack
    -- Called 11
    -- Called 12
    -- Called 10
    -- Started music on hold, class 'default', on Zap/1-1
    -- SIP/11-8408 is ringing
    -- SIP/12-81ed is ringing
    -- SIP/10-5438 is ringing
    -- Channel 0/1, span 1 got hangup
    -- Stopped music on hold on Zap/1-1
    == Spawn extension (CAPICALL, s, 4) exited non-zero on 'Zap/1-1'
    -- Hungup 'Zap/1-1'
    ------------------------------------------------------------------------------

    Vielleicht hat irgendwer eine Ahnung warum das nicht geht
    Danke
    Macsea
     
  5. macsea

    macsea Neuer User

    Registriert seit:
    27 Dez. 2004
    Beiträge:
    60
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Problem mit Voicebox

    Argument "" isn't numeric in multiplication (*) at /var/lib/asterisk/agi-bin/voicebox.agi line 54.