Wie kann ich im Dialplan festlegen, dass es einen Counter 1-3 gibt?

GWire

Neuer User
Mitglied seit
9 Apr 2023
Beiträge
69
Punkte für Reaktionen
5
Punkte
8
[Edit Novize: Gelöschten/zerstörten Beitrag wieder hergestellt - Threadvandalismus wird nicht geduldet]

Hallo,

wie kann ich im Dialplan festlegen, dass es einen Counter 1-3 gibt?
Ich möchte pro Anruf den Counter um +1 erhöhen.

Start = 1
Ende =3

Es soll bei Start angefangen werden, also 1 und dann +1.
Wenn Ende, bzw. 3 erreicht ist, soll wieder auf Start, bzw. 1 zurückgekehrt werden.

Weiss Jemand, wie das in Asterisk funktioniert?

Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:
Code:
Set(MyVar=1)
...
Set(MyVar=${INC(MyVar)}
...
ExecIf($["${MyVar}"="4"]?Set(MyVar=1)

So in etwa.
 
  • Like
Reaktionen: GWire
[Edit Novize: Gelöschten/zerstörten Beitrag wieder hergestellt - Threadvandalismus wird nicht geduldet]

Aber wie rechnet das immer +1?

Ich habe es nun über eine .txt Datei gelöst, aber finde ich nicht sonderlich professionell:


Code:
[extern]
exten => 1234567810,1,Set(counter_file=/etc/asterisk/counter/counts.txt)
 same => n,System(cat ${counter_file} > /etc/asterisk/counter/counter_value)
 same => n,Set(counter_value=${SHELL(cat /etc/asterisk/counter/counter_value)})
 same => n,GotoIf($[${counter_value} = 3]?reset_counter:increment_counter)
 same => n(reset_counter),Set(counter=0)
 same => n,Set(command=echo ${counter} > ${counter_file})
 same => n,System(${command})
 same => n,Set(audio_file=$[${counter_value} - 3])
 same => n,Answer()
 same => n,Wait(2)
 same => n,Playback(/etc/asterisk/${audio_file})
 same => n,Hangup()
 same => n(increment_counter),Set(counter=$[${counter_value}+1])
 same => n,Set(command=echo ${counter} > ${counter_file})
 same => n,System(${command})
 same => n,Set(audio_file=$[${counter_value} + 1])
 same => n,Answer()
 same => n,Wait(2)
 same => n,Playback(/etc/asterisk/${audio_file})
 same => n,Hangup()

Jedenfalls wir mir nacheinander 0.gsm, 1.gsm, 2.gsm, 3.gsm abgespielt und funktioniert.
 
Zuletzt bearbeitet von einem Moderator:
[Edit Novize: Gelöschten/zerstörten Beitrag wieder hergestellt - Threadvandalismus wird nicht geduldet]

Also ich habe das hier versucht:

Code:
[extern]
exten => 1234567811,1,Set(DB(counter=1234567811)=${IF($[${DB_EXISTS(counter)}]? $[ ${DB(counter)} + 1 ]:1)})
same => n,NoOp(Counter is now ${DB(counter)})
same => n,Playback(/etc/asterisk/1)

Das ist die Fehlermeldung:


Code:
[Feb 29 19:33:58] WARNING[9510][C-00000017]: func_db.c:233 function_db_exists: DB_EXISTS requires an argument, DB(<family>/<key>)
[Feb 29 19:33:58] WARNING[9510][C-00000017]: func_db.c:163 function_db_read: DB requires an argument, DB(<family>/<key>)
[Feb 29 19:33:58] WARNING[9510][C-00000017]: ast_expr2.fl:468 ast_yyerror: ast_yyerror():  syntax error: syntax error, unexpected '+', expecting $end; Input:
  + 1
  ^
[Feb 29 19:33:58] WARNING[9510][C-00000017]: ast_expr2.fl:472 ast_yyerror: If you have questions, please refer to https://docs.asterisk.org/Configuration/Dialplan/Variables/Channel-Variables/
    -- Executing [1234567811@extern:1] Set("PJSIP/12345-0000001c", "DB(counter=1234567811)=") in new stack
[Feb 29 19:33:58] WARNING[9510][C-00000017]: func_db.c:163 function_db_read: DB requires an argument, DB(<family>/<key>)
    -- Executing [1234567811@extern:2] NoOp("PJSIP/12345-0000001c", "Counter is now ") in new stack
    -- Executing [1234567811@extern:3] Playback("PJSIP/12345-0000001c", "/etc/asterisk/1") in new stack
       > 0x7f64b80c0fe0 -- Strict RTP learning after remote address set to: 94.16.121.115:7894
    -- <PJSIP/12345-0000001c> Playing '/etc/asterisk/1.gsm' (language 'en')
       > 0x7f64b80c0fe0 -- Strict RTP switching to RTP target address 94.16.121.115:7894 as source
    -- Auto fallthrough, channel 'PJSIP/12345-0000001c' status is 'UNKNOWN'
root@xxx*CLI>
 
Zuletzt bearbeitet von einem Moderator:
Korrigiere einfach was dir in den Fehlermeldungen angezeigt wird. Halte dich einfach an die Syntax :)
Set(DB(counter=1234567811)

Das Set hört ja gar nicht auf. DB ist eine Funktion, Set auch, also brauchst du da schon mal zwei Klammerpaare.
Dann übergibst du der Funktion DB als Variablenname
counter=1234567811

Asterisk weist dich direkt auf kaputte Syntax hin bzw. wie sie richtig ist:
DB requires an argument, DB(<family>/<key>)

Also eher:
Set(DB(allgemein/counter)=1234)

DB_EXISTS erübrigt sich, sorge einfach dafür dass der Wert initial mal geschrieben wird bevor du ihn liest (vulgo initialisieren) dann passt das.
 
[Edit Novize: Gelöschten/zerstörten Beitrag wieder hergestellt - Threadvandalismus wird nicht geduldet]

Danke dir. Also ich habe folgendes versucht:

Code:
[extern]
exten => 1234567811,1,Set(DB(allgemein/counter=1234567811)=${IF($[${DB_EXISTS(allgemein/counter)}]? $[ ${DB(allgemein/counter)} + 1 ]:1)})
same => n,NoOp(Counter is now ${DB(allgemein/counter)})
same => n,Playback(/etc/asterisk/1)

Nun erhalte ich

Code:
[Feb 29 19:50:47] WARNING[2655][C-0000001b]: ast_expr2.fl:468 ast_yyerror: ast_yyerror():  syntax error: syntax error, unexpected '+', expecting $end; Input:
  + 1
  ^
[Feb 29 19:50:47] WARNING[2655][C-0000001b]: ast_expr2.fl:472 ast_yyerror: If you have questions, please refer to https://docs.asterisk.org/Configuration/Dialplan/Variables/Channel-Variables/
    -- Executing [1234567811@extern:1] Set("PJSIP/12345-00000020", "DB(allgemein/counter=1234567811)=1") in new stack
    -- Executing [1234567811@extern:2] NoOp("PJSIP/12345-00000020", "Counter is now ") in new stack
    -- Executing [1234567811@extern:3] Playback("PJSIP/12345-00000020", "/etc/asterisk/1") in new stack
       > 0x561e5a42e660 -- Strict RTP learning after remote address set to: 94.16.121.115:7910
    -- <PJSIP/12345-00000020> Playing '/etc/asterisk/1.gsm' (language 'en')
       > 0x561e5a42e660 -- Strict RTP switching to RTP target address 94.16.121.115:7910 as source
    -- Auto fallthrough, channel 'PJSIP/12345-00000020' status is 'UNKNOWN'
root@xxx*CLI>

Dieses Problem hatte ich vorhin schon mal und weiß aber nicht mehr, wie ich es gelöst habe. Jedenfalls kommt die DB Fehlermeldung nicht mehr.

EDIT:

Code:
[extern]
exten => 1234567811,1,NoOp(Incrementing counter for extension 1234567811)
   same => n,Set(counter_val=${IF($[${DB_EXISTS(allgemein/counter)}]? $[ ${DB(allgemein/counter)} + 1 ]:1)})
   same => n,Set(DB(allgemein/counter)=${counter_val})
   same => n,NoOp(Counter is now ${counter_val})
   same => n,Playback(/etc/asterisk/1)
   same => n,Hangup()

Sieht schon mal besser aus. Nun will ich nur noch, dass 0-3 gezählt wird und immer bei 3 zurücksetzt, nachdem 4 käme.
 
Zuletzt bearbeitet von einem Moderator:
Dein Set-Aufruf ist immer noch kaputt...

Set(DB(allgemein/counter=1234567811)

Du versuchst auf die Variable mit dem Namen
allgemein/counter=1234567811

zuzugreifen...
Richtig wäre:
Set(DB(allgemein/counter)=1234567811)
 
[Edit Novize: Gelöschten/zerstörten Beitrag wieder hergestellt - Threadvandalismus wird nicht geduldet]

Das hat aber verursacht, dass 1234567811 + 1 gerechnet wurde dann dann 1234567812 ausgegeben wird.
 
Zuletzt bearbeitet von einem Moderator:
Ich dachte genau darum gehts, eine persistente Variable zu inkrementieren ?!
 
[Edit Novize: Gelöschten/zerstörten Beitrag wieder hergestellt - Threadvandalismus wird nicht geduldet]

Ich will einfach einen Counter, der sich zwischen 0-3 pro Anruf bewegt.

Anruf 1 -> setzt Counter von 0 auf 1.
Anruf 2 -> setzt Counter von 1 auf 2.
Anruf 3 -> setzt Counter von 2 auf 3
Anruf 4 -> setzt Counter wieder auf 0 zurück.

Es wurde aber immer eine +1 auf die letzte Zahl der Extension gerechnet.

-- Zusammenführung Doppelpost gemäß Boardregeln by stoney

Wie ich aber schon merke. Diese Variante ist um EINIGES unzuverlässiger. Mal funktioniert es, mal nicht. Keine Ahnung, was dort eingetragen wird. Ich hatte einen Fehler im Dialplan, habe den alten wiederhergestellt, neu geladen und trotzdem will es nicht mehr. Das ist also keine Lösung im produktiven Einsatz, in meinen Augen. Da kann ich mir keine Fehler erlauben, weil mir dann der Callflow wegen einer doofen Berechnung ausfällt. Da bleibe ich doch leider bei der amateur-txt Datei.
 
Zuletzt bearbeitet von einem Moderator:
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.