zeitgesteuerter Anrufbeantworter

klingeljoe

Neuer User
Mitglied seit
11 Feb 2005
Beiträge
21
Punkte für Reaktionen
0
Punkte
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
 
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
 
Python ist mir auch sympathischer. Wenn Du was hast sag mal Bescheid, das täte mich auch interessieren.

Lars
 
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
 
Problem mit Voicebox

Argument "" isn't numeric in multiplication (*) at /var/lib/asterisk/agi-bin/voicebox.agi line 54.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.