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

Info : LCR mit Preisansage und Fallback

Dieses Thema im Forum "Asterisk Skripte" wurde erstellt von DerDominic, 21 Dez. 2004.

  1. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    Nach einigen Änderungen... am besten gleich auf Seite 2 weiterlesen ;)


    Dominic
     
  2. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Sieht recht nett aus, bastele aber gerade selbst mit telefonsparbuch zusammen an einer loesung mit fallback, voip, forbidden und preselection. Erste Ergebnisse zwischen den Tagen dann hier im Forum.
     
  3. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    @DerDominic:
    Das cron-script liefert leider nur noch eine leere lcr.txt (zumindest bei mir).
    Da ich von awk keine Ahnung habe ... hast du eine neue angepasste version?

    Gruß
    Thorsten
     
  4. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    Auch HI,
    ja, da gab es ständig Probleme mit Teltarif und habe ein neus Skript geschrieben, welches auf Telefonsparbuch zugreift.
    Ist zwar noch nicht ganz so fertig wie ich will, kansnt Du aber auch verwenden, unterteilung zwischen Ort, Fern, Mobil und Ausland gibt es nicht mehr, dafür kansnt Du nun ein Fallback über mehrere Stufen machen.
    Demnächst, wenn ich Lust und Laune habe werde ich das dann mal erweitern....

    Gruß
    Dominic

    #!/bin/bash
    wget 'http://www.telefon-sparbuch.de/tmpl/calc/telephone/std/profi/index.htm?type=Telephone&jscript=1&FORM=profi&ZNAME=ZNAME&
    zone=a&zone=d&zone=e&zone=fi&day=%2B&time=%2B&submit=Anfrage+senden&MAX_RESULT=5&CBC0=1&_190=1&CONNECT=ANALOG&PERCENT_SAVED=1
    &COSTS_SORT=DFT&COSTS_EXTRA=0&COSTS=3%3A01&comment=1&CENTS=1&PRICE_ONCE=1&PULSE_EXTRA=1&PULSE_EXTRA_CHOICE=60%2F60&CBC_AT=1&D
    _TIME=6-18+%2F+18-21+%2F+21-6&DWEEK_TIME=&DWEEKEND_TIME=wie+bei+Werktag' -O /tmp/ttt.txt
    grep Rangliste /tmp/ttt.txt | awk -F '<td nowrap>' '{print $2}' | awk -F '
    ' '{print $1}' | cat > /tmp/lcr-all.txt
    grep Rangliste /tmp/ttt.txt | awk -F '<td nowrap>' '{print $6}' | awk -F '
    ' '{print $1}' | cat >> /tmp/lcr-all.txt
    grep Rangliste /tmp/ttt.txt | awk -F '<td nowrap>' '{print $10}' | awk -F '
    ' '{print $1}'| cat >> /tmp/lcr-all.txt
    grep Rangliste /tmp/ttt.txt | awk -F '<td nowrap>' '{print $14}' | awk -F '
    ' '{print $1}'| cat >> /tmp/lcr-all.txt
     
  5. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    >unterteilung zwischen Ort, Fern, Mobil und Ausland gibt es nicht mehr

    Das verstehe ich nicht?!
    Dass es keine Unterteilung für kurz&lang gibt kann ich ja noch nachvollziehen...
    Die erstelle lcr-all.txt datei hat 4 Zeilen - wobei mir nicht klar ist wonach diese liste erstellt wurde!
    Gruß
    Thorsten
     
  6. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    es gibt doch ein fertiges LCR fuer telefonsparbuch ... sucht doch mal nach 'LCR komplett'
     
  7. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    hi
    @allesok: ist klar - aber so ein einfaches LCR hat auch seinen reiz. ich wollte nicht die komplexe LCR-geschichte installieren....
    aber wenn mir nichts anderes übrig bleibt schaue ich mir das mal an.

    Gruß
    Thorsten
     
  8. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    So, im Falle des Interesses weil einem die AllesOK-Lösung zu gewaltig/groß/sonstwas ist......
    Hier ein neues LCR, die Daten werden von Billiger-Telefonieren.de gezogen, dabei reichtes einmal am Tag diese zu holen.


    bla bla bla... alter kram entfernt .....
     
  9. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    wie bindet man den das Pacal ein? (bin in diese rrichtung ein anfänger). Unter debian gibt es den gpc (GNU Pascal Compiler) - ist das ok?
    wie sieht das bt.agi aus? ist das direkt das ausführbare compilat?

    Gruß
    Thorsten
     
  10. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    1. Mit apt-get install fp-compiler den fpc installieren.
    2. fpc bt.pas
    3. cp bt /var/lib/asterisk/agi-bin/bt.agi

    Gruß
    Dominic
     
  11. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi Dominic,
    das ganze sieht soweit sehr gut aus!
    Frage: wie stelle ich sicher dass der Download nach 0:00 Uhr stattfindet? Sonst habe ich ja am Samstag die Liste vom Freitag?
    Ist das sichergestellt wenn ich das Downloadscript einfach ein cron.daily ablege?

    2 Kleine Wünsche:
    a) dein Script wählt ja automatisch die Vorwahl sofern die Nummer nicht mit 0 beginnt. Wenn ich die Vorwahl mitwähle (bin es halt schon gewohnt) nimmt dein Script aber den Tarif für Fern - kann man das ändern?
    b) Da die Preise ja mit runtergeladen werden - währe eine Übergabe an das Script genial. So könnte man seine eigene Preisansage machen...

    Ansonsten: DANKE! Gutes Script.

    Gruß
    Thorsten
     
  12. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    Hi Thorsten,
    füge einfach in Zeile 89 folgendes ein :
    if pos (paramstr(2),callerString)> 0 then Distance := local;

    Ja, an die Preisgeschichte habe ich auch schon gedacht, die könnte man dann vorher ansagen...
    Mal kucken wie man das macht...
    Vorschlag, ich setze eine Varibale Costs und Du kuckst nach wie man das Ansagt ;)


    Gruß
    Dominic
     
  13. TinTin

    TinTin Aktives Mitglied

    Registriert seit:
    6 Mai 2004
    Beiträge:
    1,864
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
  14. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    Wenn ich mir recht erinnere gibt es doch das was mit Saynum, geht das damit nicht einfacher ?
     
  15. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    Dann auf ein neues :
    Hier unser kleiner Pascal :

    program lcr;

    uses Dos;

    const
    fallback : boolean = false;
    pre : string = '';

    Type
    t_Distance = (none,local,DE,Mobile,Foreign);

    var
    infile : Text;
    tString : string;
    Distance : t_Distance;
    CallerString : String;

    procedure trim(var is :string);
    begin
    while (pos (' ',is) > 0) do delete (is,pos (' ',is),1);
    end;

    function timeOK:boolean;
    var
    h,m,s,hund : word;
    fromT,toT : byte;
    temp : string[5];
    begin
    timeOK:=false;
    if pos('Uhr',tString) > 0 then
    begin
    GetTime (h,m,s,hund);
    temp := copy (tString,1,pos('-',tString)-1);
    trim (temp);
    val (temp,fromT,hund);
    temp := copy (tString,pos('-',tString)+1,2);
    trim (temp);
    val (temp,toT,hund);
    timeOK:= (h>=fromT) and (h<=toT);
    { writeln (tString);}
    end;
    end;

    procedure workOn;
    const
    start = 7;
    var
    count : byte;
    cost,
    lcr : string[12];
    startp : byte;
    endp : byte;
    begin
    if Distance = local then count := start;
    if Distance = DE then count := start+1;
    if Distance = Mobile then count := start+2;
    if Distance = Foreign then count := start+3;
    if fallback then count:=count+4;
    while (not EOF(infile)) do
    begin
    readln (infile,tString);
    if count = 0 then begin
    writeln (tString);
    lcr := copy (tString,1,pos(' ',tString)-1);
    startp := pos('>',tString)+1;
    endp := pos (' c',tString);
    writeln ('Start : ',startp, ' Ende : ',endp);
    cost := copy (tString,startp, endp-startp);
    writeln ( 'SET VARIABLE LCR ',lcr,pre);
    writeln ( 'SET VARIABLE COSTS ',cost);
    end;
    dec(count);
    end;
    end;

    function setDistance:boolean;
    begin
    Distance := none;
    if callerString[1] <> '0' then Distance := local;
    if callerString[1] = '0' then Distance := DE;
    if pos ('01',callerString) = 1 then Distance := Mobile;
    if pos ('00',callerString) = 1 then Distance := Foreign;
    if pos (paramstr(2),callerString)> 0 then Distance := local;
    if Distance = local then pre := paramstr(2);
    setDistance := Distance <> none;
    end;

    begin
    { Parameter
    1 : gewaehlte Nummer
    2 : lokale Vorwahl
    3 : Fallback
    }
    Assign (infile, '/tmp/bt-call-cost.txt');
    Reset(infile);
    callerString := paramstr(1);
    fallback := paramstr(3) = 'fallback';
    if setDistance then
    begin
    while (not EOF(infile)) do
    begin
    readln (infile,tString);
    if timeOK then workOn;
    end;
    end;
    writeln;
    end.

    Der mit diesem Script gefüttert wird :
    #!/bin/bash
    #wget 'http://www.billiger-telefonieren.de/tarife/tagesuebersicht.php3?maxanzeige=2&inlandszone%5B%5D=Ort&inlandszone%5B%5D=Fern&inlandszone%5B%5D=D1&inlandszone%5B%5D=NULL&inlandszone%5B%5D=NULL&auslandszonen%5B%5D=Frankreich&auslandszonen%5B%5D=&zeitraum=wt&tageszeitraum=0-24&kompakt=y&ids%5B%5D=8378&taktmax=60&tarif_ansage=n&inc_190=on&berechnen=berechnen&ids%5B%5D=8516&ids%5B%5D=8494&ids%5B%5D=8636&ids%5B%5D=8621&ids%5B%5D=8614&ids%5B%5D=8610&ids%5B%5D=8580&ids%5B%5D=8345&ids%5B%5D=8058&ids%5B%5D=8639&ids%5B%5D=8343&ids%5B%5D=8496&ids%5B%5D=8633&ids%5B%5D=8561&ids%5B%5D=8254&ids%5B%5D=8619&ids%5B%5D=8550&ids%5B%5D=8061&ids%5B%5D=8563&ids%5B%5D=8638&ids%5B%5D=8604&ids%5B%5D=8611&ids%5B%5D=7775&ids%5B%5D=8059&ids%5B%5D=8634&ids%5B%5D=8562&ids%5B%5D=8377&ids%5B%5D=8615&ids%5B%5D=8605&ids%5B%5D=8057&ids%5B%5D=8631&ids%5B%5D=7765&ids%5B%5D=7732&ids%5B%5D=7513&ids%5B%5D=8612&ids%5B%5D=8632&ids%5B%5D=8635&ids%5B%5D=8616&ids%5B%5D=8624&ids%5B%5D=8599&ids%5B%5D=8592&printversion=yes' -O /tmp/bt.txt

    grep fbbb /tmp/bt.txt | awk -F 'fbbb">' \
    '{ split ($2,ar,"<"); print ar[1] " " ar[3]; \
    split ($3,ar,"<"); print ar[1] " " ar[3]; \
    split ($4,ar,"<"); print ar[1] " " ar[3]; \
    split ($5,ar,"<"); print ar[1] " " ar[3]; \
    }' > /tmp/bt-call-cost.txt

    Es werden die Variablen LCR und COSTS gesetzt, nun muß man das nur noch irgendwie ausgeben.....

    Dominic
     
  16. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    Um die ganze Sache dann zu vervollständigen :
    exten => _XXX.,1,SetLanguage(de)
    exten => _XXX.,2,Ringing
    exten => _XXX.,3,Macro(Tel${PRI_NETWORK_CID})
    exten => _XXX.,4,SetCIDNum(${outMSN})
    exten => _XXX.,5,agi(bt.agi,${EXTEN},06897)
    exten => _XXX.,6,SayPhonetic,${COSTS} ;
    exten => _XXX.,7,Dial(${ISDNEXT}/${LCR}${EXTEN},60,Tr)
    exten => _XXX.,8,Congestion
    exten => _XXX.,107,agi(bt.agi,${EXTEN},06897,'fallback')
    exten => _XXX.,108,SayPhonetic,${COSTS} ;
    exten => _XXX.,109,Dial(${ISDNEXT}/${LCR}${EXTEN},60,Tr)
    exten => _XXX.,110,Congestion
    exten => h,1,Hangup


    Hmmm, hab ich eigentlich nix besseres zu tun ?????

    Gruß
    Dominic
     
  17. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    danke für den genial schnellen service!
    Das SayPhonetic scheint bei mir noch nicht richtig zu laufen - obwohl meine gebristuffte 1.0.7 den Befehl schon kennt. Ich denke ich werde mir das irgendwie noch zurechtbiegen mit
    "Dieses Gespräch Kostet"
    Saynumber( Zahl vor dem Komma)
    "Komma"
    SayNumber (Zahl nach dem Komma)
    "cent pro Minute"

    Das krieg ich aber auch selbst gebacken...
    Gruß
    Thorsten
     
  18. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    Keine Ursache,

    wenn Du dann das nette Ansagegespräch zusammengeschaubt hast, bitte zukommen lassen...

    Gruß
    Dominic
     
  19. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    ein kleiner Fehler den ich gerade Festgestellt habe:
    wir haben nun 23:15 - das Script verwendet die Preise die für 22-23 Uhr angegeben sind!
    Keine Ahnung ob das nur in diesem Zeitfenster so ist (vielleicht weil das Fenster von 23 bis 0 geht?)

    Meine Preisansage sieht so aus:

    exten => _8.,3,agi(bt.agi,${EXTEN:1},06027)
    exten => _8.,4,Wait(0.5)
    exten => _8.,5,SayNumber(${COSTS}) <-- Das sagt die Zahl von dem Komma
    exten => _8.,6,Playback(comma)
    exten => _8.,7,SayNumber(${COSTS:-2,2}) <-- Das sagt die letzten beiden Ziffern
    exten => _8.,8,Playback(cent)

    Gruß
    Thorsten
     
  20. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    LCR mit Preisansage und Fallback

    Hoppla, dummer Fehler hier nun korrigiert :
    Code:
    program lcr;
    
    uses Dos;
    
    const 
      fallback : boolean = false;
      pre : string = '';
    
    Type
      t_Distance = (none,local,DE,Mobile,Foreign);
    
    var
      infile : Text;
      tString : string;
      Distance : t_Distance;
      CallerString : String;
    
    procedure trim(var is :string);
    begin
    	while (pos (' ',is) > 0) do delete (is,pos (' ',is),1);
    end;
    
    function timeOK:boolean;
    var
    	h,m,s,hund : word;
    	fromT,toT  : byte;
    	temp	   : string[5];
    begin
    	timeOK:=false;
    	if pos('Uhr',tString) > 0 then
    	begin
    		GetTime (h,m,s,hund);
    		temp := copy (tString,1,pos('-',tString)-1);
    		trim (temp);
    		val (temp,fromT,hund);
    		temp :=  copy (tString,pos('-',tString)+1,2);
    		trim (temp);
    		val (temp,toT,hund);
    		if toT = 0 then toT := 24;
    		timeOK:= (h>=fromT) and (h<toT);
    {		writeln (tString);}
    	end;
    end;
    
    procedure workOn;
    const
      start = 7;
    var
      count : byte;
      cost,
      lcr : string[12];
      startp : byte;
      endp : byte;
    begin
      if Distance = local then count := start;
      if Distance = DE then count := start+1;
      if Distance = Mobile then count := start+2;
      if Distance = Foreign then count := start+3;
      if fallback then count:=count+4;
      while (not EOF(infile)) do
      begin
      	readln (infile,tString);
    	if count = 0 then begin
    		writeln (tString);
    		lcr  := copy (tString,1,pos(' ',tString)-1);
    		startp := pos('>',tString)+1;
    		endp := pos (' c',tString);
    		writeln ('Start : ',startp, ' Ende : ',endp);
    		cost := copy (tString,startp, endp-startp);
    		writeln ( 'SET VARIABLE LCR ',lcr,pre);
    		writeln ( 'SET VARIABLE COSTS ',cost);
    	end;
    	dec(count);
      end;
    end;
    
    function setDistance:boolean;
    begin
    	Distance := none;
    	if callerString[1] <> '0' then Distance := local;
    	if callerString[1] = '0'  then Distance := DE;
    	if pos ('01',callerString) = 1 then Distance := Mobile;
    	if pos ('00',callerString) = 1 then Distance := Foreign;
    	if pos (paramstr(2),callerString)> 0 then Distance := local;
    	if Distance = local then pre := paramstr(2);
    	setDistance := Distance <> none;
    end;
    
    begin
    { Parameter 
      1 : gewaehlte Nummer
      2 : lokale Vorwahl
      3 : Fallback
     }
      Assign  (infile, '/tmp/bt-call-cost.txt');
      Reset(infile);
      callerString := paramstr(1);
      fallback     := paramstr(3) = 'fallback';  
      if  setDistance then
      begin
    	  while (not EOF(infile)) do
    	  begin
    		readln (infile,tString);
    		if timeOK then workOn;
    	  end;
      end;
      writeln;
    end.