Environment requirements
- CentOS 5 (32bit or 64bit)
- FreeSwitch 1.0.trunk revision 15056 + patch from http://jira.freeswitch.org/browse/MODSOFIA-27
- PHP ESL wrapper compiled and installed
- Module dependencies
- mod_console
- mod_logfile
- mod_event_socket
- mod_sofia
- mod_loopback
- mod_commands
- mod_dptools
- mod_expr
- mod_dialplan_xml
- mod_voipcodecs
- mod_sndfile
- mod_native_file
- mod_local_stream
- mod_tone_stream
- mod_xml_curl
- mod_fifo
| This one is critical - do not try to run the ACD prototype with stock FreeSwitch bundled in sipXecs 4.0.X |
Prototype installation
Import YUM repository
wget -P /etc/yum.repos.d/ http://www.voiceworks.pl/pub/sipxworks.repo
Install stuff
service sipxecs stop yum -y install sipxworks-acd service sipxecs start
Configure ACD
Activate config
- Just go to ACD Server panel and activate the server
Enable realtime CTI and Archive server integration (optional)
- Go to sipXconfig and enable VoiceWorks Call Center Extras bundle
- restart sipXecs
Check it's working
[root@urtho200 autoload_configs]# sipxproc|grep vw "vwACDRouter"=>"Running", "vwACDESBAgentStatus"=>"Running", "vwACDESBQueueStatus"=>"Running", "vwACDMediaServer"=>"Running", "vwACDArchClient"=>"Running",
Caveats
- This works only when ACD is configured on the primary server
- You can have only one ACD instance per sipX installation
- No support for custom ports (SIP, XML/RPC, ...)
- No automated uninstallation (restoration of original ACD)
- FIFO overflow (on queue full) not implemented (only LIFO)

Original sipXecs 4.0 ACD does not implement any kind of overflow in queue full condition !! Queue call counters are not reset upon FreeSwitch restart. This can lead to phantom call states and false full queue events.
Extra features
Behaviour changes
- Config activation is done online without ACD restarting. New config is activated for new calls only.
- Distinct tones for login/out from phones
- Presence is persistent across all components restarts
- SIP transfers should work* for all SIP destinations (agents, different queues, other extentions, PSTN)
- Queue length limits are respected
*This is as reliable as SIP transfers are.
Queue configuration
Queue config is stored in Postgres in sipxworksacd database.
All extra features are persistent across ACD config activation (even delete/undelete)
Columns with extra features include:
sipxworksacd=# \d queues;
Table "public.queues"
Column | Type | Modifiers
---------------+------------------------+--------------------------------------------------------------------------------------------------
lang | character(2) |
priority | smallint | default 1
depth_over | character varying(128) |
wait_over | character varying(128) |
ringing_rb | character varying(128) | default 'tone_stream://v=-10;%(400,200,400,450);%(400,2200,400,450);loops=-1'::character varying
connect_rb | character varying(128) | default 'tone_stream://v=-10;%(1000,3000,425,0);loops=-1'::character varying
connect_tone | character varying(128) | default 'tone_stream://v=-10;%(150,100,400,450);loops=2'::character varying
f_weighted | boolean | default true
wav_moh | character varying(255) |
term_tone | character varying(128) | default 'tone_stream://v=-16;%(250,250,480,620);loops=-1'::character varying
record_prob | integer | default 0
pos_announce | integer |
f_aa | boolean | default false
Distinct timeout/LIFO(queue full) overflows destinations
One can update wait_over and depth_over columns of a queue to get different destinations for both events.
True MOH
With wav_moh defined ACD plays the selected file (uploaded manually) while call is queued.
When wav_moh is not defined the ringing_rb tone is played.
Above is true only for queues types that answer the call before routing it to an agent.
MOH is interrupted every now and then by a wav file as defined in sipXconfig
Custom tones
connect_rb is played when a call is routed to a specific agent (agent's phone is ringing)
connect_tone is played once the call is bridged to a live agent (and for every successful transfer)
term_tone is played to when the other party disconnects
Recording
record_prob reflects the recording probability (0-100) of all calls routed by this queue.
The effective recording probability is a max of queues.record_prob, calls.record_prob, agents.record_prob
Priority
Queues have open ended priority setting defined in priority column.
Effective priority is derived from queue.priority, line.priority, call.priority and available agent's skills (agent's priority in a queue)
f_weighed can be turned on to have effective priority multiplied by the time time spent i a queue. This allows to give precedence to customers waiting longer even if other calls/lines have higher base priority. This way there is no need for overflow queues as a mean to avoid customers waiting forever because of high VIP inbound rate. (think fair queuing)
Announce position in a queue
pos_announce turns on accounting of current position in a queue every pos_announce seconds. The position can go up and down because a call with higher priority might appear ahead of the call.
Debugging
[root@urtho ~]# tail -f /usr/local/sipxworks-acd/logs/sipxworks-acdrouter.log 2009-06-26 14:43:05.152:DBG[25]:evt:Scheduled event 'checkagents' firing 2009-06-26 14:43:05.152:DBG:sql:SELECT[0]: "SELECT uri,state FROM agents WHERE state in ('W','S','P','T') AND pause_till < NOW()" 2009-06-26 14:43:07.172:DBG[25]:evt:Scheduled event 'checkagents' firing 2009-06-26 14:43:07.172:DBG:sql:SELECT[0]: "SELECT uri,state FROM agents WHERE state in ('W','S','P','T') AND pause_till < NOW()" 2009-06-26 14:43:09.176:DBG[25]:evt:Scheduled event 'checkagents' firing
Add Comment