[Gelöst] Dialplan - Anpassen an etwas ... "Spezielles"...

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Das ist ja nicht das problem... Das kann ja recht schnell gecheckt werden...
Ich geb dann mal ne Rückmeldung...
Muss jetzt erstmal zum Dienst... ;)


So, hier dann mal die Rückmeldung...
Grundsätzlich klappt das c im dial() ganz gut... Der Anruf wird jetzt nicht mehr als verpasst sondern als angenommen angezeigt.
Das Problem hierbei ist jetzt, dass ein Anruf der nirgends angenommen wurde (also der Anrufer hat aufgelegt bevor das Gespräch angenommen werden konnte) wird nun auch nicht mehr in die Liste der verpassten Anrufe aufgenommen...

Das ist irgendwie auch doof...

Gibts da auch ein Workaround für?


Gelöst...

LG
 
Zuletzt bearbeitet:
  • Like
Reaktionen: sonyKatze

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Das ganze ist ja mehr oder weniger eine "Bastellösung"...
So wirklich gut ist das ja nicht... Es funktioniert zwar, aber das geht sicherlich auch in eleganter..

Da mein W57T & auch die W60B mit den dranhängenden W56H Mobilteilen die Möglichkeiten haben einen Start & Ende-code beim ein und ausschalten der DND Funktion zu hinterlegen, stellt sich mir doch die Frage, was kann man da eintragen?

Kann man mit einem solchen Eintrag der Sagenumwobenen Asterisk Datenbank nicht direkt mitteilen, das sich das jeweilige Telefon in den DND begeben hat um dann beim nächsten Anruf einfach aus der DB abzufragen ob das Telefon noch im DND ist und es gar nicht erst anklingeln?

Das wäre interessant zu wissen wie genau das funktioniert...

@koyaanisqatsi hast Du da schon Erfahrungen mit?

Nach einem kurzen test, ich hab einfach mal DND_ein als start & DND_aus als ende eingetragen, gespeichert & ausgeführt.

Als Ausgabe im CLI kam dort:
Code:
[May  7 00:23:45] NOTICE[636][C-00000015]: chan_sip.c:26699 handle_request_invite: Call from '1001' (192.168.1.246:12745) to extension 'DND_ein' rejected because extension not found in context 'from-my-phones'.

[May  7 00:25:56] NOTICE[636][C-00000016]: chan_sip.c:26699 handle_request_invite: Call from '1001' (192.168.1.246:12745) to extension 'DND_aus' rejected because extension not found in context 'from-my-phones'.

Was ich jetzt daraus lese, ist
1. das Telefon sendet genau das was ich da eingetippert habe ohne etwas hinzuzufügen oder zu entfernen..
2. die Extension jibbet nich... Klar, ist ja auch nur n test gewesen um zu schauen was da gesendet wird..
3. diese extension muss für diese Funktion angelegt werden, klar.. Aber was muss da drinnen stehen um "Serverseitiges DND" zu realisieren?

<edit 07.05.2021 @ 9:16>
Nach ein paar Stunden Recherche & zwischendurch etwas pennen, hab ich es nun hinbekommen, das der DND zustand der Telefone nun schonmal zuverlässig in die DB geschrieben & geändert wird...
Dazu hab ich den Start code in den Telefonen auf 4000 und den Ende Code auf 4001 gesetzt & [Server_features] in die [from-my-phones] inkludiert..

Code:
[Server_features]

;DND enable
exten => 4000,1,NoOp(Someone (${CALLERID(num)}) want to enable DND, lets do it..)
same  => n,Set(DB(dnd/${CALLERID(num)})=1)                        ; Schreibe in Family "dnd" den Key "Callerid" mit Value "1"
;same => n,Set device hint to unavailable -> how?                    ; entry for BLF
same  => n,hangup()

;DND disable
exten => 4001,1,NoOp(Someone (${CALLERID(num)}) want to disable DND, lets do it..)
same  => n,Set(DB(dnd/${CALLERID(num)})=0)                        ; schreibe in Family "dnd" den Key "Callerid" mit value "0"
;same => n,Set device hint back to idle -> how?                        ; entry for BLF
same  => n,hangup()

Jetzt fehlt mir aber noch das know how, wie ich das jetzt im dial() verknüpfen muss, damit auch jedes der 3 vorgesehenen Telefone klingelt oder auch nicht, in Abhängigkeit des dnd Eintrags in der DB..

Also aus der Gruppe alle anklingeln dessen dnd Eintrag "0" oder "nicht vorhanden" ist...




LG
 
Zuletzt bearbeitet:

sonyKatze

Aktives Mitglied
Mitglied seit
6 Aug 2009
Beiträge
2,951
Punkte für Reaktionen
269
Punkte
83
geht sicherlich auch in eleganter
Normalerweise macht man das über Presence, also einen Status wie man das von Messaging-Apps kennt. Problem ist, dass das in SIP über Notifications (hints und subscriptions) läuft. Und das Terrain ist in VoIP/SIP völlig ungetesteter Kram. Jedenfalls ich kann Dir da nicht weiterhelfen.
 

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Ich hab das jetzt mal mit meinen noch sehr schwächlichen skills versucht zusammen zu fügen...
Ich gehe davon aus das die Syntax noch massiv Fehlerhaft ist...

Code:
; test dnd Schaltung mit Datenbank

same => n,GotoIf($[${DB(dnd/1000)} =0]?true:false)
same => n(true),NoOp(1000 is available. Let it ring.)
same => n,Set(call1="SIP/1000&")
;same => n(exit)
same => n(false),NoOp(1000 is in DND state. Skipping..)
same => n(exit),Set(call1="")

same => n,GotoIf($[${DB(dnd/1001)} =0]?wahr:falsch)
same => n(wahr),NoOp(1001 is available. Let it ring.)
same => n,Set(call2="SIP/1001&")
;same => n(exit)
same => n(falsch),NoOp(1001 is in DND state. Skipping..)
same => n(raus),Set(call2="")

same => n,GotoIf($[${DB(dnd/1002)} =0]?richtig:verkehrt)
same => n(richtig),NoOp(1002 is available. Let it ring.)
same => n,Set(call3="SIP/1002")
;same => n(exit)
same => n(verkehrt),NoOp(1002 is in DND state. Skipping..)
same => n(tues),Set(call3="")

same => n,set(call=$[${call1}~~${call2}~~${call3}])    ; füge alles zusammen, dann ruf an..
same => n,Dial(${call},30 ,tT)

Ich denke mal das Problem ist die Syntax um Variablen zusammenzufügen...
Mein vorhaben ist, die variable "call" nach und nach aufzufüllen, so dass am ende (wenn alle Telefone NICHT im DND sind) der Inhalt der Variablen call so aussehen sollte: call=SIP/1000&SIP/1001&SIP/1002

Ich hoffe es ist einigermaßen verständlich rübergekommen?


<edit>
Nach obigem Beispiel funktioniert schonmal die Auswertung wer im DND ist & wer nicht...
Allerdings schreibt er anscheinend nix in die call1-3 variablen... bzw löscht es direkt wieder raus... Weil die Telefone die nicht im DND sind beide zustände annehmen... Warum auch immer...

Ich vermute mal wegen dem auskommentierten n,(exit), aber kommentiere ich das wieder ein, gibts ne Fehlermeldung nach dem motto "wird schon verwendet in Zeile xy"..


Jetzt häng ich fest...

Code:
    -- Executing [[email protected]:1] NoOp("SIP/4711-0000004e", "017xxxxxxxx ruft an (4711)") in new stack
    -- Executing [[email protected]:2] GotoIf("SIP/4711-0000004e", "0?true:false") in new stack
    -- Goto (von-voip-provider,4711,5)
    -- Executing [[email protected]:5] NoOp("SIP/4711-0000004e", "1000 is in DND state. Skipping..") in new stack
    -- Executing [[email protected]:6] Set("SIP/4711-0000004e", "call1=""") in new stack
    -- Executing [[email protected]:7] GotoIf("SIP/4711-0000004e", "1?wahr:falsch") in new stack
    -- Goto (von-voip-provider,4711,8)
    -- Executing [[email protected]:8] NoOp("SIP/4711-0000004e", "1001 is available. Let it ring.") in new stack
    -- Executing [[email protected]:9] Set("SIP/4711-0000004e", "call2="SIP/1001&"") in new stack
    -- Executing [[email protected]:10] NoOp("SIP/4711-0000004e", "1001 is in DND state. Skipping..") in new stack
    -- Executing [[email protected]:11] Set("SIP/4711-0000004e", "call2=""") in new stack
    -- Executing [[email protected]:12] GotoIf("SIP/4711-0000004e", "1?richtig:verkehrt") in new stack
    -- Goto (von-voip-provider,4711,13)
    -- Executing [[email protected]:13] NoOp("SIP/4711-0000004e", "1002 is available. Let it ring.") in new stack
    -- Executing [[email protected]:14] Set("SIP/4711-0000004e", "call3="SIP/1002"") in new stack
    -- Executing [[email protected]:15] NoOp("SIP/4711-0000004e", "1002 is in DND state. Skipping..") in new stack
    -- Executing [[email protected]:16] Set("SIP/4711-0000004e", "call3=""") in new stack
    -- Executing [[email protected]:17] Set("SIP/4711-0000004e", "call=") in new stack
    -- Executing [[email protected]:18] Dial("SIP/4711-0000004e", ",30 ,tT") in new stack
[May  7 11:23:50] WARNING[4734][C-0000002d]: app_dial.c:2261 dial_exec_full: Dial requires an argument (technology/resource)

<edit>
Wenn ich statt gotoif() einfach nur if() verwende, kann ich mit if(<expr>?<true>:<false>) auch direkt variablen schreiben?

Beispiel:
Code:
same => n,if($[${DB(dnd/1000)} =0]?Set(call1="SIP/1000&"):Set(call1=""))
same => n,if($[${DB(dnd/1001)} =0]?Set(call2="SIP/1001&"):Set(call2=""))
same => n,if($[${DB(dnd/1002)} =0]?Set(call3="SIP/1002"):Set(call3=""))


LG
 
Zuletzt bearbeitet:

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
13,437
Punkte für Reaktionen
471
Punkte
83
Moinsen

Nach einem kurzen test, ich hab einfach mal DND_ein als start & DND_aus als ende eingetragen, gespeichert & ausgeführt.
Na, da lässt sich doch was mit anfangen.
Beispiel in Pseudocodesprache ;)
1. Telefon sendet das als Extension.
2. Du hast die Extensions angelegt die dem ganz genau entsprechen.
Fehlermeldung...
Rich (BBCode):
[May  7 00:23:45] NOTICE[636][C-00000015]: chan_sip.c:26699 handle_request_invite: Call from '1001' (192.168.1.246:12745) to extension 'DND_ein' rejected because extension not found in context 'from-my-phones'.
[May  7 00:25:56] NOTICE[636][C-00000016]: chan_sip.c:26699 handle_request_invite: Call from '1001' (192.168.1.246:12745) to extension 'DND_aus' rejected because extension not found in context 'from-my-phones'.
Korrektur...
Rich (BBCode):
[from-my-phones]
; DND setzen (Keine Ausgabe, außer die Konsole ist geschwätzig)
exten => DND_ein,1,Set(DB(${CONTEXT}/DND/${CALLERID(ani)})=Activ)
; Check in der Konsole: database show from-my-phones DND
; DND löschen (Gibt aus was gelöscht wurde)
exten => DND_aus,1,Verbose(1,DND ${DB_DELETE(${CONTEXT}/DND/${CALLERID(ani)})} for ${CALLERID(ani)} DELETED)
; Wenn mehrere DNDs aktiv, verbleiben die Anderen, wird der Letzte gelöscht ist auch der komplette Baum weg
3. Diese Extensions schreiben den jeweiligen Status in die Datenbank.
4. Deine Gruppenwahl Extension wertet das aus und wählt entsprechend.

Die Channelvariablen sind halt nur solange gültig solange der Channel besteht.
Die sind also nicht global.

Es lassen sich zwar auch globale Channelvariablen definieren, die dann ihren Inhalt behalten, aber persönlich nutz ich lieber die DB().
Versuch das doch auch mal, einfach einen ensprechenden call Baum in der DB erzeugen und mit deinem Wahlplan nutzen, statt callx.

@sonyKatze - SIP NOTIFY ist einfacher als gedacht, hab ich mit meinem SNOMs schon gemacht...
sip_notify.conf
Code:
; rfc3842
; put empty "Content=>" at the end to have CRLF after last body line

[clear-mwi]
Event=>message-summary
Content-type=>application/simple-message-summary
Content=>Messages-Waiting: no
Content=>Message-Account: sip:#
Content=>Voice-Message: 0/0 (0/0)
Content=>

[test-mwi]
Event=>message-summary
Content-type=>application/simple-message-summary
Content=>Messages-Waiting: yes
Content=>Message-Account: sip:[email protected]
Content=>Voice-Message: 1/99 (99/99)
Content=>

[snom-check-cfg]
Event=>check-sync\;reboot=false

[snom-reboot]
Event=>check-sync\;reboot=true

[snom-loglevel-9]
Event=>snom-settings
Content-type=>application/xml
Content=><settings>
Content=><phone-settings>
Content=><log_level>9</log_level>
Content=></phone-settings>
Content=></settings>
Content=>

[snom-mb_trusted_hosts_set]
Event=>snom-settings
Content-type=>application/xml
Content=><settings>
Content=><phone-settings>
Content=><mb_trusted_hosts>192.168.0.1 192.168.188.9 osmc osmc.fritz.box</mb_trusted_hosts>
Content=></phone-settings>
Content=></settings>
Content=>

[snom-mb_trusted_hosts_clear]
Event=>snom-settings
Content-type=>application/xml
Content=><settings>
Content=><phone-settings>
Content=><mb_trusted_hosts></mb_trusted_hosts>
Content=></phone-settings>
Content=></settings>
Content=>

[snom-scrtimc_set]
Event=>snom-settings
Content-type=>application/xml
Content=><settings>
Content=><phone-settings>
Content=><sip_cancel_reasons_to_ignore_missed_call>text='Call completed elsewhere' text='Call was replaced' cause&lt;300</sip_cancel_reasons_to_ignore_missed_call>
Content=></phone-settings>
Content=></settings>
Content=>

[snom-scrtimc_clear]
Event=>snom-settings
Content-type=>application/xml
Content=><settings>
Content=><phone-settings>
Content=><sip_cancel_reasons_to_ignore_missed_call></sip_cancel_reasons_to_ignore_missed_call>
Content=></phone-settings>
Content=></settings>
Content=>

[snom-text]
Event=>xml
Content-Type=>application/snomxml
Content=><SnomIPPhoneText>
Content=><Fetch mil="20000">snom://mb_exit</Fetch>
Content=><Title>Menu</Title>
Content=><Prompt>Hallo</prompt>
Content=><Text>Hallo Welt</Text>
Content=></SnomIPPhoneText>
Content=>

[snom-menu]
Event=>xml
Content-Type=>application/snomxml
Content=><SnomIPPhoneMenu>
Content=><Fetch mil="20000">snom://mb_exit</Fetch>
Content=><Title>Menu</Title>
Content=><MenuItem>
Content=><Name>Server</Name>
Content=><URL>http://fritz.box:49200/5GB_Medien/cgi-bin/server.xml</URL>
Content=></MenuItem>
Content=></SnomIPPhoneMenu>
Content=>

[check-line]
Event=>xml
Content-Type=>application/snomxml
Content=><SnomIPPhoneText>
Content=><if condition="$(lines:connected)==0">
Content=><fetch mil="3000">snom://mb_exit</fetch>
Content=><led number="6">off</led>
Content=><text>LED Aus</text>
Content=><else>
Content=><fetch mil="3000">snom://mb_exit</fetch>
Content=><led number="6" color="orange">blinkfast</led>
Content=><text>LED blinkt</text>
Content=></else>
Content=></if>
Content=></SnomIPPhoneText>
Content=>

[snom-leds-ein]
Event=>xml
Content-Type=>application/snomxml
Content=><SnomIPPhoneText>
Content=><fetch mil="3000">snom://mb_exit</fetch>
Content=><led number="1" color="orange">blinkslow</led>
Content=><led number="2" color="orange">blink</led>
Content=><led number="3" color="orange">blinkfast</led>
Content=><led number="4" color="orange">blinkslow</led>
Content=><led number="5" color="orange">blink</led>
Content=><led number="6" color="orange">blinkfast</led>
Content=><led number="7" color="orange">blinkslow</led>
Content=><led number="8" color="orange">blink</led>
Content=><led number="9" color="orange">blinkfast</led>
Content=><led number="10" color="orange">blinkslow</led>
Content=><led number="11" color="orange">blink</led>
Content=><led number="12" color="orange">blinkfast</led>
Content=><text>blinkenlichten</text>
Content=></SnomIPPhoneText>
Content=>

[snom-leds-aus]
Event=>xml
Content-Type=>application/snomxml
Content=><SnomIPPhoneText>
Content=><fetch mil="3000">snom://mb_exit</fetch>
Content=><led number="1">off</led>
Content=><led number="2">off</led>
Content=><led number="3">off</led>
Content=><led number="4">off</led>
Content=><led number="5">off</led>
Content=><led number="6">off</led>
Content=><led number="7">off</led>
Content=><led number="8">off</led>
Content=><led number="9">off</led>
Content=><led number="10">off</led>
Content=><led number="11">off</led>
Content=><led number="12">off</led>
Content=><text>LEDs Aus</text>
Content=></SnomIPPhoneText>
Content=>

Den Asterisk muss ich nach einer Änderung komplett restarten mit: service asterisk restart
...damit es greift.

In der Konsole geht dann sowas...
Bildschirmfoto vom 2021-05-07 13-51-06.png
...hab aber zur Zeit kein SNOM am laufen ;)

Wenn ich statt gotoif() einfach nur if() verwende, kann ich mit if(<expr>?<true>:<false>) auch direkt variablen schreiben?
Für die DB() gibt es eine gaaanz einfache Sache um den Wert zu ermitteln/prüfen/bekommen...
Beispiel...
Code:
osmc*CLI> dialplan show [email protected]
[ Context 'whitelist' created by 'pbx_config' ]
  '_[a-z]!' =>      1. ExecIf($[${DB_EXISTS(${CONTEXT}/${EXTEN})}]?${DB_RESULT}:Hangup(17)) [extensions.conf:50]

-= 1 extension (1 priority) in 1 context. =-
Wenn der Eintrag existiert, steht dessen Inhalt in ${DB_RESULT} ansonsten wird direkt wieder aufgelegt ;)
Mit ExecIF() lässt sich alles direkt ausführen, natürlich auch: GoTo() oder noch mehr ExecIf().
Im Falle von DND kannst du statt Hangup(17) das passende Dial() absetzen.
Also die gesamte Gruppe mit Dial() nach dem Doppelpunkt, weil DND aus ist, bzw. der Eintrag von DND_aus gelöscht wurde.
Und statt ${DB_RESULT} das Dial() nur für die Mobilteile.

Ich hab in meiner selbsterstellten "whitelist" ( Einmal als Kontext und einmal als DB Baum ) komplette Anweisungen stehen.
Zum Beispiel...
Code:
osmc*CLI> database show whitelist spy
/whitelist/spy                                    : chanspy()
1 results found.
Da ( DB() ) drinne dürfen aber nur komplett gültige Anweisungen stehen, sowas wie ${EXTEN} nicht, da dass in diesem "Namespace" nicht ausgewertet werden kann.
 
Zuletzt bearbeitet:

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Ich hab das jetzt bestimmt schon 1000 mal durchgelesen...

Ich komm da nicht so ganz hinter..
Ich denke mal Du wertest nur den einen Teilnehmer aus, der DND haben könnte...
Von daher würde das passen mit

Code:
ExecIf($[${DB_EXISTS(${CONTEXT}/${EXTEN})}]?Dial(SIP/1001&SIP/1002):Dial(SIP/1000&SIP/1001&SIP/1002))

Hab ich das so richtig verstanden?

LG
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
13,437
Punkte für Reaktionen
471
Punkte
83
Wenn mehrere DND Einträge vorhanden sind/sein könnten, etwas genauer prüfen...
Rich (BBCode):
ExecIf($[${DB_EXISTS(${CONTEXT}/DND/1000)}]?Dial(SIP/1001&SIP/1002):Dial(SIP/1000&SIP/1001&SIP/1002))
...das "Activ" kann, muss aber nicht bei der Prüfung dabei sein, der Eintrag 1000 ist entscheidend und der wird ja mit DND_aus anhand der ${CALLERID(ani)} entfernt.

Wenn du statt DND_an/DND_aus eine Nummer nimmst, zum Beispiel 8* für an und 9* für aus, kannste damit jedes "Wahlgerät" in den Ruhestand schicken.
Vorausgesetzt die Gruppenwahlextension prüft das auch.



* So hab ich das hier getestet....
Rich (BBCode):
osmc*CLI> dialplan show [email protected]
[ Context 'osmc' created by 'pbx_config' ]
  '8' =>            1. Set(DB(${CONTEXT}/DND/${CALLERID(ani)})=Activ) [extensions.conf:56]

-= 1 extension (1 priority) in 1 context. =-
osmc*CLI> dialplan show [email protected]
[ Context 'osmc' created by 'pbx_config' ]
  '9' =>            1. Verbose(1,DND ${DB_DELETE(${CONTEXT}/DND/${CALLERID(ani)})} for ${CALLERID(ani)} DELETED) [extensions.conf:58]

-= 1 extension (1 priority) in 1 context. =-

Zur Verdeutlichung...
Ein Mobilteil (1005) wählt die 8 und ein Softfon (1009) auch, danach sieht es so aus...
Code:
osmc*CLI> database show osmc DND
/osmc/DND/1005                                    : Activ         
/osmc/DND/1009                                    : Activ         
2 results found.
Jetzt wählt das Mobilteil die 9 danach...
Code:
osmc*CLI> database show osmc DND
/osmc/DND/1009                                    : Activ         
1 results found.
Das Softfon wählt die 9 und damit wird der Baum "gefällt"...
Code:
osmc*CLI> database show osmc DND
0 results found.

Eine nicht Gruppenwahlextension, die Anrufe von 1000-1009 (CID match) nach 1000-1009 nach DND filtert sieht dann bei mir so aus...
Code:
exten => _100[0-9]/_100[0-9],1,ExecIf($[${DB_EXISTS(${CONTEXT}/DND/${EXTEN})}]?Hangup(19):Dial(SIP/${EXTEN}))
Edit: ^--> korrigiert ;)

Und das CDR möcht ich dir auch nicht...
Code:
"""6800"" <1005>","1005","8","osmc","SIP/1005-00000003","","Set","DB(osmc/8)=","2021-05-07 17:32:09","2021-05-07 17:32:09","2021-05-07 17:32:27","17.503009","17.492079","ANSWERED","DOCUMENTATION","","1620401529.7","",3
"""6800"" <1005>","1005","9","osmc","SIP/1005-00000004","","Verbose","1,","2021-05-07 17:33:20","2021-05-07 17:33:20","2021-05-07 17:33:29","9.711953","9.697347","ANSWERED","DOCUMENTATION","","1620401600.10","",4
"""6800"" <1005>","1005","8","osmc","SIP/1005-00000005","","Set","DB(osmc/DND)=1005","2021-05-07 17:37:53","2021-05-07 17:37:53","2021-05-07 17:37:58","4.528405","4.517942","ANSWERED","DOCUMENTATION","","1620401873.13","",5
"""6800"" <1005>","1005","9","osmc","SIP/1005-00000006","","Verbose","1,1005","2021-05-07 17:38:20","2021-05-07 17:38:20","2021-05-07 17:38:29","9.094486","9.083619","ANSWERED","DOCUMENTATION","","1620401900.16","",6
"""6800"" <1005>","1005","8","osmc","SIP/1005-00000007","","Set","DB(osmc/DND)=1005","2021-05-07 17:42:42","2021-05-07 17:42:42","2021-05-07 17:42:47","4.723124","4.712445","ANSWERED","DOCUMENTATION","","1620402162.19","",7
"""6800"" <1005>","1005","9","osmc","SIP/1005-00000008","","Verbose","1,","2021-05-07 17:43:05","2021-05-07 17:43:05","2021-05-07 17:43:14","9.190327","9.179813","ANSWERED","DOCUMENTATION","","1620402185.22","",8
"""6800"" <1005>","1005","9","osmc","SIP/1005-00000009","","Verbose","1,1005","2021-05-07 17:44:40","2021-05-07 17:44:40","2021-05-07 17:44:49","9.290448","9.279880","ANSWERED","DOCUMENTATION","","1620402280.25","",9
"""6800"" <1005>","1005","8","osmc","SIP/1005-0000000a","","Set","DB(osmc/DND)=1005","2021-05-07 19:13:36","2021-05-07 19:13:36","2021-05-07 19:13:39","3.418452","3.407533","ANSWERED","DOCUMENTATION","","1620407615.28","",10
"""6800"" <1005>","1005","9","osmc","SIP/1005-0000000b","","Verbose","1,1005","2021-05-07 19:14:01","2021-05-07 19:14:01","2021-05-07 19:14:10","8.842770","8.828966","ANSWERED","DOCUMENTATION","","1620407641.31","",11
"""6800"" <1005>","1005","8","osmc","SIP/1005-0000000c","","Set","DB(osmc/DND)=1005","2021-05-07 19:20:51","2021-05-07 19:20:51","2021-05-07 19:20:55","4.165270","4.154450","ANSWERED","DOCUMENTATION","","1620408051.34","",12
"""6800"" <1005>","1005","9","osmc","SIP/1005-0000000d","","Verbose","1,1005","2021-05-07 19:21:14","2021-05-07 19:21:14","2021-05-07 19:21:23","8.917838","8.906981","ANSWERED","DOCUMENTATION","","1620408074.37","",13
"""6800"" <1005>","1005","8","osmc","SIP/1005-0000000e","","Set","DB(osmc/DND/1005=""On""","2021-05-07 19:25:38","2021-05-07 19:25:38","2021-05-07 19:25:45","6.256840","6.245887","ANSWERED","DOCUMENTATION","","1620408338.40","",14
"""6800"" <1005>","1005","8","osmc","SIP/1005-0000000f","","Set","DB(osmc/DND/1005)=""On""","2021-05-07 19:27:53","2021-05-07 19:27:53","2021-05-07 19:28:00","6.730839","6.720163","ANSWERED","DOCUMENTATION","","1620408473.43","",15
"""6800"" <1005>","1005","9","osmc","SIP/1005-00000010","","Verbose","1,DND ""On"" DELETED","2021-05-07 19:28:26","2021-05-07 19:28:26","2021-05-07 19:28:37","10.460124","10.449571","ANSWERED","DOCUMENTATION","","1620408506.46","",16
""""" <1009>","1009","8","osmc","SIP/1009-00000011","","Set","DB(osmc/DND/1009)=Activ","2021-05-07 19:31:13","","2021-05-07 19:31:13","0.011236","0.000000","FAILED","DOCUMENTATION","","1620408673.49","",17
""""" <1009>","1009","9","osmc","SIP/1009-00000012","","Verbose","1,DND Activ DELETED","2021-05-07 19:31:32","","2021-05-07 19:31:32","0.013332","0.000000","FAILED","DOCUMENTATION","","1620408692.52","",18
"""6800"" <1005>","1005","8","osmc","SIP/1005-00000013","","Set","DB(osmc/DND/1005)=Activ","2021-05-07 19:32:17","2021-05-07 19:32:17","2021-05-07 19:32:22","5.163343","5.152525","ANSWERED","DOCUMENTATION","","1620408737.55","",19
""""" <1009>","1009","8","osmc","SIP/1009-00000014","","Set","DB(osmc/DND/1009)=Activ","2021-05-07 19:32:28","","2021-05-07 19:32:28","0.010644","0.000000","FAILED","DOCUMENTATION","","1620408748.58","",20
""""" <1009>","1009","9","osmc","SIP/1009-00000015","","Verbose","1,DND Activ DELETED","2021-05-07 19:32:43","","2021-05-07 19:32:43","0.013058","0.000000","FAILED","DOCUMENTATION","","1620408763.61","",21
"""6800"" <1005>","1005","9","osmc","SIP/1005-00000016","","Verbose","1,DND Activ DELETED","2021-05-07 19:33:10","2021-05-07 19:33:10","2021-05-07 19:33:21","10.627039","10.616117","ANSWERED","DOCUMENTATION","","1620408790.64","",22
"""6800"" <1005>","1005","8","osmc","SIP/1005-00000017","","Set","DB(osmc/DND/1005)=Activ","2021-05-07 19:40:26","2021-05-07 19:40:26","2021-05-07 19:40:32","6.204698","6.194459","ANSWERED","DOCUMENTATION","","1620409226.67","",23
"""6800"" <1005>","1005","9","osmc","SIP/1005-00000018","","Verbose","1,DND Activ DELETED","2021-05-07 19:42:00","2021-05-07 19:42:00","2021-05-07 19:42:08","8.576854","8.570749","ANSWERED","DOCUMENTATION","","1620409320.70","",24
"""6800"" <1005>","1005","8","osmc","SIP/1005-00000019","","Set","DB(osmc/DND/1005)=Activ","2021-05-07 19:45:15","2021-05-07 19:45:15","2021-05-07 19:45:18","2.948786","2.937887","ANSWERED","DOCUMENTATION","","1620409515.73","",25
"""6800"" <1005>","1005","9","osmc","SIP/1005-0000001a","","Verbose","1,DND Activ for 1005 DELETED","2021-05-07 19:45:34","2021-05-07 19:45:34","2021-05-07 19:45:44","9.469453","9.458110","ANSWERED","DOCUMENTATION","","1620409534.76","",26
""""" <1009>","1009","0","osmc","SIP/1009-0000001b","","WaitExten","7200,m","2021-05-07 20:01:56","2021-05-07 20:01:56","2021-05-07 20:28:55","1619.710251","1619.699690","ANSWERED","DOCUMENTATION","","1620410516.79","",27
""""" <1009>","1009","8","osmc","SIP/1009-0000001c","","Set","DB(osmc/DND/1009)=Activ","2021-05-07 22:25:36","","2021-05-07 22:25:36","0.012883","0.000000","FAILED","DOCUMENTATION","","1620419136.82","",28
"""6800"" <1005>","1005","8","osmc","SIP/1005-0000001d","","Set","DB(osmc/DND/1005)=Activ","2021-05-07 22:25:51","2021-05-07 22:25:51","2021-05-07 22:25:56","4.876644","4.866263","ANSWERED","DOCUMENTATION","","1620419151.85","",29
"""6800"" <1005>","1005","9","osmc","SIP/1005-0000001e","","Verbose","1,DND Activ for 1005 DELETED","2021-05-07 22:28:10","2021-05-07 22:28:10","2021-05-07 22:28:18","7.967808","7.956945","ANSWERED","DOCUMENTATION","","1620419290.88","",30
""""" <1009>","1009","9","osmc","SIP/1009-0000001f","","Verbose","1,DND Activ for 1009 DELETED","2021-05-07 22:29:55","","2021-05-07 22:29:55","0.014092","0.000000","FAILED","DOCUMENTATION","","1620419395.91","",31
"""6800"" <1005>","1005","1009","osmc","SIP/1005-00000020","SIP/1009-00000021","Dial","SIP/1009","2021-05-07 23:17:43","2021-05-07 23:17:50","2021-05-07 23:17:55","11.548632","4.972558","ANSWERED","DOCUMENTATION","","1620422263.94","",32
""""" <1009>","1009","8","osmc","SIP/1009-00000022","","Set","DB(osmc/DND/1009)=Activ","2021-05-07 23:18:05","","2021-05-07 23:18:05","0.011538","0.000000","FAILED","DOCUMENTATION","","1620422285.98","",34
"""6800"" <1005>","1005","1009","osmc","SIP/1005-00000023","","Hangup","16","2021-05-07 23:18:13","","2021-05-07 23:18:13","0.013141","0.000000","NO ANSWER","DOCUMENTATION","","1620422293.101","",35
...vorenthalten :cool: ( Vielleicht bau ich noch ein BEEP ein oder Hangup(19) oder whatever )
Yo, jeweils noch bei 8,9 und wenn DND aktiv, ein Hangup(19) für "Temporarly unavailable" rundet die Sache ab.
Code:
""""" <1009>","1009","8","osmc","SIP/1009-00000025","","Hangup","19","2021-05-07 23:39:43","","2021-05-07 23:39:43","0.008961","0.000000","NO ANSWER","DOCUMENTATION","","1620423583.107","",37
"""6800"" <1005>","1005","1009","osmc","SIP/1005-00000026","","Hangup","19","2021-05-07 23:40:04","","2021-05-07 23:40:04","0.013424","0.000000","NO ANSWER","DOCUMENTATION","","1620423604.110","",38
 
Zuletzt bearbeitet:

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Moinsen...

Du hast da schon recht... Ich denke ich werd das von 4000 & 4001 wieder auf DND_ein & DND_aus abändern... Allein schon aus dem Grund das beim manuellen wählen der Zahlen der Server zwar bescheid weiß aber das Telefon selbst eben nicht... Somit sieht man auf dem Display auch nicht, das DND aktiv ist...
Auch ein Problem: das Telefon ist im DND man wählt die 4001 der Server sagt sich DND ist aus aber das Telefon hat noch immer den DND status...
Somit geht wieder nix durch am Telefon... (erledigt)

Deine Datenbank sieht inetessant aus...

Soweit ich mich da eingelesen habe ist die Datenbank nach dem Schema <family><key><value> ("3-Teilig") aufgebaut... Wie funktioniert das da bei Dir? Du hast da ja ne "4-Teilige"????
Erstellst Du damit ne Datenbank die nur für einen einzigen Context Gültigkeit hat? <context><family><key><value>?

Was ist das für ne Geschichte mit hangup(17) und hangup(19) usw? Gibst du dem hangup() damit nen Hangupcause mit? Wozu ist das gut?



LG
 
Zuletzt bearbeitet:

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
13,437
Punkte für Reaktionen
471
Punkte
83
Auch ein Problem: das Telefon ist im DND man wählt die 4001 der Server sagt sich DND ist aus aber das Telefon hat noch immer den DND status...
Somit geht wieder nix durch am Telefon... (erledigt)
...sollst da ja auch die DND Taste drücken, ist für die ohne extra Taste gedacht.

Deine Datenbank sieht inetessant aus...
Och, mein Raspberry Pi 1.Generation mit debianbasierten OSMC-Mediacenter ist meine "Gamebox" zum Skripten und voll Experimentell.
Ich finde sogar, dass meine Datenbank eher schlank gehalten ist, hier mal die Vollständige...
Code:
osmc*CLI> database show
/SIP/Registry/1000                                : 192.168.188.1:5060:1800:1000:sip:[email protected];uniq=8FF18F863E0CD80FF357F97A6675C
/SIP/Registry/1001                                : 192.168.188.1:5060:1800:1001:sip:[email protected];uniq=8FF18F863E0CD80FF357F97A6675C
/SIP/Registry/1002                                : 192.168.188.1:5060:1800:1002:sip:[email protected];uniq=8FF18F863E0CD80FF357F97A6675C
/SIP/Registry/1003                                : 192.168.188.1:5060:1800:1003:sip:[email protected];uniq=8FF18F863E0CD80FF357F97A6675C
/SIP/Registry/1004                                : 192.168.188.1:5060:1800:1004:sip:[email protected];uniq=8FF18F863E0CD80FF357F97A6675C
/SIP/Registry/1005                                : 192.168.188.1:5060:1800:1005:sip:[email protected];uniq=8FF18F863E0CD80FF357F97A6675C
/dundi/secret                                     : <hash>
/dundi/secretexpiry                               : 1620470693           
/osmc/DND/1005                                    : Activ                
/pbx/UUID                                         : <hash>
/whitelist/#                                      : goto(whitelist,0,1)  
/whitelist/**610                                  : dial(SIP/**[email protected])
/whitelist/0                                      : waitexten(7200,m)    
/whitelist/1                                      : goto(whitelist,timecall,1)
/whitelist/1000                                   : dial(SIP/1000,120,mdtT)
/whitelist/1001                                   : dial(SIP/1001,120,mdtT)
/whitelist/1002                                   : dial(SIP/1002,120,mdtT)
/whitelist/1003                                   : dial(SIP/1003,120,mdtT)
/whitelist/1004                                   : dial(SIP/1004,120,mdtT)
/whitelist/1005                                   : dial(SIP/1005,120,mdtT)
/whitelist/1006                                   : dial(SIP/1006,120,mdtT)
/whitelist/1007                                   : dial(SIP/1007,120,mdtT)
/whitelist/1008                                   : dial(SIP/1008,120,mdtT)
/whitelist/1009                                   : dial(SIP/1009,120,mdtT)
/whitelist/600                                    : dial(SIP/**[email protected])
/whitelist/610                                    : dial(SIP/**[email protected])
/whitelist/797                                    : dial(SIP/**[email protected],5)
/whitelist/999                                    : dial(SIP/**[email protected],120)
...und eigentlich hab ich mich nur an /SIP/Registry/ orientiert.
Baum hat Äste, und am End befindet sich die Frucht ;)
Hier siehste auch die Whitelist Einträge, dass hat einige Vorteile, die 1000er zum Beispiel können so auch umgeleitet werden.
...direkt in der Konsole oder mit Code-Extensions ( *21*Ziel#, #21# zum Zurücksetzen ) ...
Code:
osmc*CLI> dialplan show *21*@osmc
[ Context 'osmc' created by 'pbx_config' ]
  '_*21*!' =>       1. set(DB(whitelist/${CALLERID(ani)})=dial(SIP/${EXTEN:4:-1})) [extensions.conf:163]
                    2. answer(17)                                 [extensions.conf:164]

-= 1 extension (2 priorities) in 1 context. =-
osmc*CLI> dialplan show #21#@osmc
[ Context 'osmc' created by 'pbx_config' ]
  '_#21#' =>        1. set(DB(whitelist/${CALLERID(ani)})=dial(SIP/${CALLERID(ani)},120,mdtT)) [extensions.conf:156]
                    2. answer(17)                                 [extensions.conf:157]

-= 1 extension (2 priorities) in 1 context. =-

Was ist das für ne Geschichte mit hangup(17) und hangup(19) usw? Gibst du dem hangup() damit nen Hangupcause mit? Wozu ist das gut?
Das Endgerät sieht/interpretiert den.
16 ist eher ein normales auflegen und 17 eher ein absichtliches abwürgen :) und 19 eben das "Zeiweise nicht erreichbar".
Zum Schalten wäre ein Bestätigungston nett, dann braucht es aber auch mehr Zeit, denn RTP muss dafür bereitstehen, also noch mindestens ein Answer() oder Progress(), verbunden mit einem kleinen Delay in Form von Wait(), dass sicherstellt das RTP Audio steht.
Ich nutze fürs Delay gleich das Answer() und geb ihn so eine Viertelsekunde Verzögerung mit: Answer(250)
So halt...
Code:
; DND setzen                                                                                                                                                                                
exten => 8,1,Answer(250)                                                                                                                                                                    
exten => 8,2,Set(DB(${CONTEXT}/DND/${CALLERID(ani)})=Activ)                                                                                                                                 
exten => 8,3,Playback(auth-thankyou)                                                                                                                                                        
exten => 8,4,Hangup(16)                                                                                                                                                                     
; DND löschen         )                                                                                                                                                                     
exten => 9,1,Answer(250)                                                                                                                                                                    
exten => 9,2,Verbose(1,DND ${DB_DELETE(${CONTEXT}/DND/${CALLERID(ani)})} for ${CALLERID(ani)} DELETED)                                                                                      
exten => 9,3,Playback(auth-thankyou)                                                                                                                                                        
exten => 9,4,Hangup(16)
...erzeugt dann auch...
Code:
"""6800"" <1005>","1005","8","osmc","SIP/1005-00000036","","Hangup","16","2021-05-08 13:23:53","2021-05-08 13:23:53","2021-05-08 13:23:59","6.149559","6.135090","ANSWERED","DOCUMENTATION","","1620473033.154","",54
"""6800"" <1005>","1005","9","osmc","SIP/1005-00000037","","Hangup","16","2021-05-08 13:24:15","2021-05-08 13:24:15","2021-05-08 13:24:26","10.160843","10.150056","ANSWERED","DOCUMENTATION","","1620473055.157","",55
 
Zuletzt bearbeitet:

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Die Datenbank Geschichte hab ich jetzt (denke ich) soweit verstanden...
Zumindest funktioniert das ein- und austragen der Telefone in die "DND Datenbank" einwandfrei...

Was ich an Deiner Datenbank sehr interessant finde ist, das Du da direkt befehle (Dial(something)) drin stehen hast...

Jetzt hängt es noch am Dialplan...

Mi fehlt wohl noch ein Puzzleteil um das so zusammen zu setzen das jeder der möglichen 3 Teilnehmer (evtl auch mal mehr) einen DND status annehmen kann und trotzdem der Dial() an die "übrigen" Teilnehmer raus geht...

Ich hatte jetzt schon überlegt jedem Teilnehmer in der Gruppe einen eigenen ExecIf() mitzugeben um dann bei false diesen Teilnehmern dann einen set(DIALGROUP(<name>,add)=SIP/100x) mitzugeben... Und am ende dann die erstellte Gruppe anrufen lasse...

Wer in der Datenbank in Verbindung mit DND steht wird halt nicht in diese Gruppe geschrieben...
Aber: soweit ich weiß bleibt die Gruppe dann auch in der Datenbank stehen... Also müsste sie nach dem Telefonat ja auch wieder gekillt werden, oder seh ich das falsch?

Alternativ dazu ginge ja auch ein Set(DIALGROUP(<name>,del)=SIP/100x) im true der ExecIf()... Somit entfällt das Killen des DIALGROUP Eintrags der DB

Code:
same  => n,ExecIf($[${DB_EXISTS(${CONTEXT}/DND/1000)}]?Set(DIALGROUP(main,del)=SIP/1000):Set(DIALGROUP(main,add)=SIP/1000))
same  => n,ExecIf($[${DB_EXISTS(${CONTEXT}/DND/1001)}]?Set(DIALGROUP(main,del)=SIP/1001):Set(DIALGROUP(main,add)=SIP/1001))
same  => n,ExecIf($[${DB_EXISTS(${CONTEXT}/DND/1002)}]?Set(DIALGROUP(main,del)=SIP/1002):Set(DIALGROUP(main,add)=SIP/1002))
same => n,Dial(${DIALGROUP(main)}, 30,tT)

Ich denke das würde auch für größere Gruppen ganz gut funktionieren, oder?
Was denkt Ihr darüber?

<edit>
Hab das gerade mal so eingebaut und getestet...
Habe dabei festgestellt das beim DB Eintrag für DND_ein & DND_aus die ${CONTEXT} entfernt werden musste, da beim Eintrag in die DB der Context 'from-my-phones' eingetragen wurde und das demzufolge nicht greift wenn ein Anruf von aussen rein kommt, der ja über 'von-voip-provider' rein kommt...

Ist jetzt auch nicht schlimm, ist der DND zustand der Telefone halt "Global" und gilt für alle extensions... - Macht ja auch Sinn...

Ebenfalls musste dann im oben gezeigten Code die ${CONTEXT} entfernt werden..

Zumindest klappt das jetzt so wie ich mir das vorstelle...
Es klingeln nur die Telefone die auch wirklich klingeln sollen, und andere werden gar nicht erst angebimmelt...
Zwischendurch kommt es im CLI zwar zu einer Warnung (weil halt bei jedem durchlauf die SIP/100x aus der Dialgroup gelöscht werden auch wenn sie gar nicht mehr drin stehen) aber ich denke damit kann man leben...

<edit @ 21:04>
Ist es möglich einen Teilstring aus der DB abzufragen?
Beispiel: aus dem Dialgroup string, der sagen wir "SIP/1000&SIP/1001&SIP/1002" lautet, abzufragen ob da "SIP/1000" drin steckt?
Wäre eine Möglichkeit um diese Warnung im CLI weg zu bekommen, indem man beim ExecIf() mit einer weiteren ExecIf() im true abfragt ob der string da halt noch mit drin steckt und nur wenn er tatsächlich noch drin ist die "DIALGROUP(<name>,del)=SIP/100x" ausführt..
</edit>

Was nun noch fehlt ist ein entsprechender hint (?) für die DND-Active-Telefone im BLF
Das war glaub ich die hangup(19) Geschichte?

Funktioniert das wenn das als zweite Anweisung im true der ExecIf() ausgeführt wird, oder wird dann aufgelegt?
Wie das so genau zusammenspielt hab ich noch nicht geblickt...

LG
 
Zuletzt bearbeitet:

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
13,437
Punkte für Reaktionen
471
Punkte
83
Was ich an Deiner Datenbank sehr interessant finde ist, das Du da direkt befehle (Dial(something)) drin stehen hast...
Na, hab ich doch weiter oben anhand von...
ExecIf($[${DB_EXISTS(${CONTEXT}/${EXTEN})}]?${DB_RESULT}:Hangup(17))
...versucht zu erklären...
Wenn der Eintrag existiert, steht dessen Inhalt in ${DB_RESULT} ansonsten wird direkt wieder aufgelegt
Wenn also ein komplettes gültiges Kommando in der Datenbank steht, kannste das ${DB_RESULT} ausführen.
Wenn das Kommando nicht ausgeführt werden soll, dann "${DB_RESULT}" in Gänsefüßchen setzen.
So werden in Asterisk Datentypen umgewandelt :cool:

Strings, beziehungsweise, Zeichenketten kannste mit "reguläre Ausdrücke" auf Gültigkeit prüfen...
...kramm wühl (uralte .conf aus Backupordner)...
Rich (BBCode):
exten => _[A-Z]!,1(capital-check),ExecIf($[${REGEX("^[A-Z]\{2\,32\}$" ${EXTEN})}]?GoTo(success):GoTo(failed))
same => n(success),Verbose(${CALLERID(all)} <->-> ${EXTEN}@${CONTEXT})
same => n(failed),Hangup(16)
Auflösung
Das REGEX ist TRUE (1) wenn nicht nur der erste Buchstabe gross is, sondern mindestens 2 bis höchstens 32
 
Zuletzt bearbeitet:

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Nur ne Notiz...

Code:
ExecIf($[${REGEX("^[A-Z]\{2\,32\}$" ${EXTEN})}]?GoTo(success):GoTo(failed))

ExecIf($[${REGEX("^[<was suche ich>]\{2<min 2 Zeichen>\,32<max 32 Zeichen>\}$" ${<suchfeld>})}]?true:false)
Kommt das hin?
 
Zuletzt bearbeitet:

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
13,437
Punkte für Reaktionen
471
Punkte
83
Grundsätzlich gilt für ein REGEX...
^ = Anfang des Strings
$ = Ende des Strings
[A-Za-z0-9] = Ein Zeichen aus den Auflistungen: A bis Z (gross), a bis z (klein), 0 bis 9 (Nummer)
\{mindestens,höchstens\} = Eine Range festlegen
( Die {} Immer mit \ maskieren/escapen, weil, sonst versucht asterisk und nicht REGEX das zu interpretieren )
. = Ein Zeichen, egal was
.* = Beliebig Viele Zeichen
Wenn du also in einem String an beliebiger Stelle suchen willst, fang einfach an, und spiel damit solange rum bis es passt...
Rich (BBCode):
ExecIf($[${REGEX("SIP[/]1000" ${STRING})}]?GoTo(success):GoTo(failed))
Das REGEX ist das rot Markierte.
...es muss als Trennzeichen zwischen SIP und 1000 existieren.
...da ^ und $ nicht verwendet, ist die Position im String egal.

Hier mal ein Beispiel, das checkt ob ein Anrufername in der Form "6800" (zwei Gänsefüßchen mit vier Ziffern aus 068 dazwischen) übertragen wird...
Rich (BBCode):
exten => 4,1,Progress()                                                                                                                              
exten => 4,2,Verbose(3,${CALLERID(all)} <-CHECK-> ${REGEX("^[\"][068]\{4,4\}[\"].*$" ${CALLERID(all)})})                                              
exten => 4,3,Hangup(16)
Konsoleausgabe mit SIP bei Treffer...
Code:
[May 10 12:54:31]     -- Executing [[email protected]:1] Progress("SIP/1005-0000004a", "") in new stack
[May 10 12:54:31]     -- Executing [[email protected]:2] Verbose("SIP/1005-0000004a", "3,"6800" <1005> <-CHECK-> 1") in new stack
[May 10 12:54:31]     -- "6800" <1005> <-CHECK-> 1
[May 10 12:54:31]     -- Executing [[email protected]:3] Hangup("SIP/1005-0000004a", "16") in new stack
[May 10 12:54:31]   == Spawn extension (osmc, 4, 3) exited non-zero on 'SIP/1005-0000004a'
[May 10 12:54:31] Scheduling destruction of SIP dialog '[email protected]' in 32000 ms (Method: INFO)
[May 10 12:54:31] set_destination: Parsing <sip:[email protected];uniq=8FF18F863E0CD80FF357F97A6675C> for address/port to send to
[May 10 12:54:31] set_destination: set destination to 192.168.188.1:5060
[May 10 12:54:31] Reliably Transmitting (no NAT) to 192.168.188.1:5060:
[May 10 12:54:31] BYE sip:[email protected];uniq=8FF18F863E0CD80FF357F97A6675C SIP/2.0
[May 10 12:54:31] Via: SIP/2.0/UDP 192.168.188.9:5060;branch=z9hG4bK626055a7;rport
[May 10 12:54:31] Max-Forwards: 70
[May 10 12:54:31] From: <sip:[email protected]>;tag=as6e3d5f33
[May 10 12:54:31] To: <sip:[email protected]>;tag=52C11EEE2D5604C6
[May 10 12:54:31] Call-ID: [email protected]
[May 10 12:54:31] CSeq: 102 BYE
[May 10 12:54:31] User-Agent: PiBX
[May 10 12:54:31] Proxy-Authorization: Digest username="1005", realm="asterisk", algorithm=MD5, uri="sip:192.168.188.9", nonce="7262345d", response="9d1400b95818799fdc5c62790b3c54cb"
[May 10 12:54:31] Reason: Q.850;cause=16
[May 10 12:54:31] X-Asterisk-HangupCause: Normal Clearing
[May 10 12:54:31] X-Asterisk-HangupCauseCode: 16
[May 10 12:54:31] Content-Length: 0
[May 10 12:54:31]
[May 10 12:54:31]
[May 10 12:54:31] ---
[May 10 12:54:31]
[May 10 12:54:31] <--- SIP read from UDP:192.168.188.1:5060 --->
[May 10 12:54:31] SIP/2.0 200 OK
[May 10 12:54:31] Via: SIP/2.0/UDP 192.168.188.9:5060;branch=z9hG4bK626055a7;rport=5060
[May 10 12:54:31] From: <sip:[email protected]>;tag=as6e3d5f33
[May 10 12:54:31] To: <sip:[email protected]>;tag=52C11EEE2D5604C6
[May 10 12:54:31] Call-ID: [email protected]
[May 10 12:54:31] CSeq: 102 BYE
[May 10 12:54:31] X-RTP-Stat: CS=72;PS=249;ES=334;OS=59760;SP=0/0;SO=0;QS=-;PR=235;ER=501;OR=37600;CR=0;SR=0;QR=-;PL=0,0;BL=0;LS=0;RB=0/0;SB=-/-;EN=G722;DE=G722;JI=24,16;DL=2,2,2;IP=192.168.188.1:7078,192.168.188.9:50002
[May 10 12:54:31] X-RTP-Stat-Add: DQ=0;DSS=0;DS=0;PLCS=27104;JS=1
[May 10 12:54:31] X-SIP-Stat: DRT=0;IR=0
[May 10 12:54:31] User-Agent: AVM FRITZ!Box 7590 (UI) 154.07.25 (May 4 2021)
[May 10 12:54:31] Supported: 100rel,replaces
[May 10 12:54:31] Allow-Events: telephone-event,refer
[May 10 12:54:31] Content-Length: 0
[May 10 12:54:31]
[May 10 12:54:31] <------------->
[May 10 12:54:31] --- (13 headers 0 lines) ---
[May 10 12:54:31] SIP Response message for INCOMING dialog BYE arrived
[May 10 12:54:31] Really destroying SIP dialog '[email protected]' Method: INFO
 
Zuletzt bearbeitet:

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Hier mal ein Beispiel, das checkt ob ein Anrufername in der Form "6800" (zwei Gänsefüßchen mit vier Ziffern aus 068 dazwischen) übertragen wird...
Code:
exten => 4,1,Progress()
exten => 4,2,Verbose(3,${CALLERID(all)} <-CHECK-> ${REGEX([B][COLOR=rgb(184, 49, 47)]"^[\"][068]\{4,4\}[\"].*$"[/COLOR][/B] ${CALLERID(all)})})
exten => 4,3,Hangup(16)
Geh ich recht in der Annahme, das die Reihenfolge & Häufigkeit der Zahlen in deinem REGEX keine Rolle spielt solange ein zusammenhängenden string mit 4 Zahlen dem gesuchten entspricht?

<edit>
Ich raffs irgendwie nich...
Ich bekomm immer nur <-check -> 0

Rich (BBCode):
exten => 4,1,NoOp(REGEX Check)
same  => n,Verbose(3,${CALLERID(num)} <-CHECK-> ${REGEX("^[\"][10]\{4,4\}[\"].*$" ${CALLERID(num)})})
same  => n,Playback(privacy-thankyou)                              
same  => n,Hangup(16)

CLI
Code:
  -- Executing [[email protected]:1] NoOp("SIP/1002-00000057", "REGEX Check") in new stack
    -- Executing [[email protected]:2] Verbose("SIP/1002-00000057", "3,1002 <-CHECK-> 0") in new stack
    -- 1002 <-CHECK-> 0
    -- Executing [[email protected]:3] Playback("SIP/1002-00000057", "privacy-thankyou") in new stack
       > 0x741275c0 -- Strict RTP switching to RTP target address 192.168.1.246:11894 as source
    -- <SIP/1002-00000057> Playing 'privacy-thankyou.gsm' (language 'de')
    -- Executing [[email protected]:4] Hangup("SIP/1002-00000057", "16") in new stack

Fehler gefunden... Manchmal stellt man sich einfach nur zu doof an... *Kopfklatsch*

So klappt dann auch mit dem Nachbarn...
Code:
exten => 4,1,NoOp(REGEX Check)
same  => n,Verbose(3,${CALLERID(num)} <-CHECK-> ${REGEX("^[102]\{4,4\}.*$" ${CALLERID(num)})})
same  => n,Playback(privacy-thankyou)                                   
same  => n,Hangup(16)

Code:
    -- Executing [[email protected]:1] NoOp("SIP/1002-0000005f", "REGEX Check") in new stack
    -- Executing [[email protected]:2] Verbose("SIP/1002-0000005f", "3,1002 <-CHECK-> 1") in new stack
    -- 1002 <-CHECK-> 1
    -- Executing [[email protected]:3] Playback("SIP/1002-0000005f", "privacy-thankyou") in new stack
       > 0x741275c0 -- Strict RTP switching to RTP target address 192.168.1.246:11908 as source
    -- <SIP/1002-0000005f> Playing 'privacy-thankyou.gsm' (language 'de')
    -- Executing [[email protected]:4] Hangup("SIP/1002-0000005f", "16") in new stack

<edit 2>
Jetzt ist der versuch dran das ganze mit der Datenbank zu verbinden und mal den DND Status abzurufen.. (Mobilteil ist in den DND versetzt & in der DB steht nun
Code:
/DND/1002                                         : DND Active

Der versuch mittels

Code:
exten => 4,1,NoOp(REGEX Check)
same  => n,Verbose(3,${CALLERID(num)} <-CHECK-> ${REGEX("^[102]\{4,4\}.*$" ${DB_EXISTS(/DND/${CALLERID(num)})}))})
same  => n,Playback(privacy-thankyou)                                    
same  => n,Hangup(16)

schlug fehl...
Eigentlich klar, DB_EXISTS gibt ja nur 0 oder 1 zurück...

Also ein neuer Versuch mittels
Code:
exten => 4,1,NoOp(REGEX Check)
same  => n,ExecIf(${DB(/DND/${CALLERID(num)})} = $[${REGEX("^[012]\{4,4\}.*$" )}]?GoTo(success):GoTo(failed))
same  => n(success),Playback(privacy-thankyou)
same  => n(failed),Playback(tt-weasels)
same  => n,Verbose(${DB_RESULT})
same  => n,Hangup(16)

CLI
Code:
    -- Executing [[email protected]:1] NoOp("SIP/1002-00000074", "REGEX Check") in new stack
    -- Executing [[email protected]:2] ExecIf("SIP/1002-00000074", " = 0?GoTo(success):GoTo(failed)") in new stack
    -- Goto (from-my-phones,4,3)
    -- Executing [[email protected]:3] Playback("SIP/1002-00000074", "privacy-thankyou") in new stack
       > 0x74167be8 -- Strict RTP switching to RTP target address 192.168.1.246:11950 as source
    -- <SIP/1002-00000074> Playing 'privacy-thankyou.gsm' (language 'de')
    -- Executing [[email protected]:4] Playback("SIP/1002-00000074", "tt-weasels") in new stack
    -- <SIP/1002-00000074> Playing 'tt-weasels.gsm' (language 'de')
    -- Executing [[email protected]:5] Verbose("SIP/1002-00000074", "") in new stack
    -- Executing [[email protected]:6] Hangup("SIP/1002-00000074", "16") in new stack
  == Spawn extension (from-my-phones, 4, 6) exited non-zero on 'SIP/1002-00000074'
  == Extension Changed 1002[intern-device-hints] new state Idle for Notify User 1000

Ging auch in die Hose...
Scheinbar ist die DB_Result leer... Oder ich hab so einen Knoten im Kopp das man damit wen erschlagen könnte... o_O

und noch ein <edit>
Neuer Versuch... Diesmal in die Richtung in die es dann tatsächlich gehen soll:
Code:
same  => n,ExecIf($[${DB_EXISTS(DND/1002)}]?ExecIf(${DB(dialgroup/main/)=$[${REGEX("^[012]\{4,4\}.*$" )}]})?Set(DIALGROUP(main,del)=SIP/1002):NoOp(nothing to do)):Set(DIALGROUP(main,add)=SIP/1002))
; wenn existiert: DND/100x dann: (wenn exisitiert REGEXP("dialgroup/main : *SIP/100x*) dann "Set(DIALGROUP(main, del)=SIP/100x:sonst "NoOp(nix zu tun)")):sonst "SET(DIALGROUP(main, add)=SIP/100x)"
Frage mich gerade obs überhaupt möglich ist mehrere ExecIf() ineinander in einer Zeile zu verschachteln... Weil irgendwie steht in der zweiten ExecIf() im CLI nix drin...

CLI
Code:
    -- Executing [[email protected]:1] NoOp("SIP/1002-0000007a", "REGEX Check") in new stack
    -- Executing [[email protected]:2] ExecIf("SIP/1002-0000007a", "1?ExecIf()?Set(DIALGROUP(main,del)=SIP/1002):NoOp(nothing to do)):Set(DIALGROUP(main,add)=SIP/1002)") in new stack
[May 10 17:52:28] WARNING[4668][C-0000005b]: pbx_variables.c:1161 pbx_builtin_setvar: Set requires an '=' to be a valid assignment.
    -- Executing [[email protected]:3] Playback("SIP/1002-0000007a", "privacy-thankyou") in new stack
       > 0x7414b418 -- Strict RTP switching to RTP target address 192.168.1.246:11962 as source
    -- <SIP/1002-0000007a> Playing 'privacy-thankyou.gsm' (language 'de')
    -- Executing [[email protected]:4] Playback("SIP/1002-0000007a", "tt-weasels") in new stack
    -- <SIP/1002-0000007a> Playing 'tt-weasels.gsm' (language 'de')
    -- Executing [[email protected]:5] Verbose("SIP/1002-0000007a", "DND Active") in new stack
DND Active
    -- Executing [[email protected]:6] Hangup("SIP/1002-0000007a", "16") in new stack
  == Spawn extension (from-my-phones, 4, 6) exited non-zero on 'SIP/1002-0000007a'
  == Extension Changed 1002[intern-device-hints] new state Idle for Notify User 1000

Aber scheinbar sitzt da wohl noch ne Klammer oder sowas falsch... Die "=" beim Set stehen alle da... Nur seh ich das gerade nich...

Und noch ein <edit>
Ich Kämpfe nun seit Stunden mit dieser verdammten REGEX nur um eine Fehlermeldung zu unterdrücken, die eigentlich vernachlässigt werden kann...
Nur um das System "sauber" zu halten...
Zweck der Geschichte ist es eigentlich nur einen Teilnehmer aus der Dialgroup zu entfernen, sobald dieser sich im DND befindet... Meine bisherigen versuche waren wohl zu engstirnig gedacht...
Dabei ist die Lösung soooooooooooooooooooooooooooooo dermaßen einfach...

Statt überdermaßen aufwändig mittels REGEX zu überprüfen ob ein DND-Teilnehmer noch in der Dialgroup drin steht - was ich ums verrecken nicht hinbekomme, hab ich nun einfach eine Zeile beim aktivieren des DND hinzugefügt, die denkbar einfach ist und genau das tut was ich mit dem ganzen REGEX beabsichtigt habe..

Somit sieht die DND_ein & _aus Geschichte nun so aus & funktioniert tadellos... (Farblich hervorgehoben die neue Zeile beim DND_ein)

Rich (BBCode):
;DND enable
exten => DND_ein,1,NoOp(Someone (${CALLERID(num)}) want to enable DND, lets do it..)
same  => n,Set(DB(DND/${CALLERID(ani)})=DND Active)
same  => n,Set(DIALGROUP(main,del)=SIP/${CALLERID(num)})   
; Ist hier evtl eine Wildcard (DIALGROUP(*,del)=SIP/$CALLERID(num)) möglich? Um den Teilnehmer direkt aus allen Dialgroups auszutragen?
;same => n,Set(DEVICE_STATE(${CALLERID(num)}:lamp1)=UNAVAILABLE)            ; entry for BLF
same  => n,hangup()

;DND disable
exten => DND_aus,1,NoOp(Someone (${CALLERID(num)}) want to disable DND, lets do it..)
same  => n,Verbose(1,DND ${DB_DELETE(DND/${CALLERID(ani)})} for ${CALLERID(ani)} DELETED)
;same => n,Set(DEVICE_STATE(${CALLERID(num)}:lamp1)=IDLE)                ; entry for BLF
same  => n,hangup()
 
Zuletzt bearbeitet:

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
13,437
Punkte für Reaktionen
471
Punkte
83
REGEX ist halt nur praktisch, wenn man kapiert hat wie die regulären Ausdrücke funktionieren.
...und darüber gibt es soooo dicke Bücher ;)
Dazu kommt dann noch die Kompliziertheit des Maskierens ( \{ \} etc.) .

DB
Wenn
DB_EXISTS = 1 Dann DB_RESULT = "DND Active"

Hast ja zum Glück noch eine andere Methode gefunden.
 
Zuletzt bearbeitet:

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
103
Punkte für Reaktionen
5
Punkte
18
Und die Unübersichtlichkeit von den 1000 klammern in jeder art und weise... o_O
Da wird man schon doof im Kopp...

Ja zum Glück..
Nichts desto trotz muss ich mir diese Regulären Ausdrücke doch mal etwas intensiver zu Gemüte führen... - Dann aber ohne "Druck" dahinter...
 

Erhalten Sie 3CX für 1 Jahr kostenlos!

Gehostet, in Ihrer privaten Cloud oder on-Premise! Ganz ohne Haken. Geben Sie Ihren Namen und Ihre E-Mail an und los geht´s:

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.
oder via