<HTML>
<HEAD>
<TITLE>Re: [asterisk-users] Fwd: add a new queue strategy: SBR</TITLE>
</HEAD>
<BODY>
<FONT FACE="Verdana, Helvetica, Arial"><SPAN STYLE='font-size:12.0px'>I finally got around to updating my dialplan to use the new way of doing callback queues. It seems to me that if one used something like ${CUT(CHANNEL,-,1)} instead of SIP/${EXTEN:3} in the AddQueueMemeber then the device state of the device the agent logged in from, likely where you want to call them back at, will be used.<BR>
<BR>
Wouldn&#8217;t this do a better job then assuming the agent logged in from a SIP user that is the same number as the agent number?<BR>
<BR>
This is what I am using.<BR>
<BR>
; This is used to log on and off agents<BR>
exten =&gt; *20,1,Answer()<BR>
exten =&gt; *20,n,wait(.0.5)<BR>
exten =&gt; *20,n,Read(AgentNumber,agent-user)<BR>
exten =&gt; *20,n,Set(UserID=${DB(ExtenToUser/${AgentNumber})})<BR>
exten =&gt; *20,n,GotoIf($[&quot;${UserID}&quot;=&quot;&quot;]?NOUSER)<BR>
exten =&gt; *20,n,Set(AgentStatus=${DB(users/${UserID}/AgentStatus)})<BR>
exten =&gt; *20,n,GotoIf($[&quot;${AgentStatus}&quot;=&quot;1&quot;]?VERIFY)<BR>
exten =&gt; *20,n,GotoIf($[&quot;${AgentStatus}&quot;=&quot;2&quot;]?VERIFY)<BR>
exten =&gt; *20,n(NOUSER),Playback(cfmc/bad-agent)<BR>
exten =&gt; *20,n,Hangup()<BR>
exten =&gt; *20,n(VERIFY),VMAuthenticate(${AgentNumber}@ourvm)<BR>
exten =&gt; *20,n,GotoIf($[&quot;${AgentStatus}&quot;=&quot;2&quot;]?AGENTOFF)<BR>
exten =&gt; *20,n,Set(DB(users/${UserID}/AgentStatus)=2)<BR>
exten =&gt; *20,n,Set(DB(users/${UserID}/AgentDevice)=${CUT(CHANNEL,-,1)})<BR>
exten =&gt; *20,n,AddQueueMember(support,Local/Queue${AgentNumber}@ansqueue,,,,${CUT(CHANNEL,-,1)})<BR>
exten =&gt; *20,n,Playback(agent-loginok)<BR>
exten =&gt; *20,n,HangUp()<BR>
exten =&gt; *20,n(AGENTOFF),Set(DB(users/${UserID}/AgentStatus)=1)<BR>
exten =&gt; *20,n,Set(OldVal=${DB_DELETE(users/${UserID}/AgentDevice)})<BR>
exten =&gt; *20,n,RemoveQueueMember(support,Local/Queue${AgentNumber}@ansqueue)<BR>
exten =&gt; *20,n,Playback(agent-loggedoff)<BR>
exten =&gt; *20,n,HangUp()<BR>
<BR>
; This is used to call an agent from the queue<BR>
exten =&gt; _Queue.,1,Set(AgentNumber=${EXTEN:5})<BR>
exten =&gt; _Queue.,n,Set(UserID=${DB(ExtenToUser/${AgentNumber})})<BR>
exten =&gt; _Queue.,n,GotoIf($[&quot;${DEVICE_STATE(${DB(users/${UserID}/AgentDevice)})}&quot;=&quot;BUSY&quot;]?ISBUSY)<BR>
exten =&gt; _Queue.,n,GotoIf($[&quot;${GROUP_COUNT(${UserID}@phoneinfo)}&quot;=&quot;0&quot;]?DIALIT)<BR>
exten =&gt; _Queue.,n(ISBUSY),Busy()<BR>
exten =&gt; _Queue.,n(DIALIT),Set(OUTBOUND_GROUP=${UserID}@phoneinfo)<BR>
exten =&gt; _Queue.,n,Dial(${DB(users/${UserID}/AgentDevice)},,g)<BR>
exten =&gt; _Queue.,n,HangUp()<BR>
<BR>
; This is the extension call to get a support agent<BR>
exten =&gt; 201,1,Answer()<BR>
exten =&gt; 201,n,Wait(0.5)<BR>
exten =&gt; 201,n,Set(qac=${QUEUE_MEMBER(support,free)})<BR>
exten =&gt; 201,n,GotoIf($[${qac} &gt; 0]?HAVEAGNT)<BR>
exten =&gt; 201,n,Playback(cfmc/support-no-agent) &nbsp;<BR>
exten =&gt; 201,n,Voicemail(201@ourvm,u)<BR>
exten =&gt; 201,n,Playback(goodbye)<BR>
exten =&gt; 201,n,Hangup()<BR>
exten =&gt; 201,n(HAVEAGNT),Playback(cfmc/support-intro)<BR>
exten =&gt; 201,n,Queue(support,nrt,,,120)<BR>
exten =&gt; 201,n,Voicemail(201@ourvm,b)<BR>
exten =&gt; 201,n,Playback(goodbye)<BR>
exten =&gt; 201,n,Hangup()<BR>
<BR>
-- <BR>
Jim Dickenson<BR>
<a href="mailto:dickenson@cfmc.com">mailto:dickenson@cfmc.com</a><BR>
<BR>
CfMC<BR>
<a href="http://www.cfmc.com/">http://www.cfmc.com/</a><BR>
<BR>
<BR>
<BR>
<FONT COLOR="#0000FF">&gt; From: Mark Michelson &lt;mmichelson@digium.com&gt;<BR>
&gt; Reply-To: Asterisk Users Mailing List - Non-Commercial Discussion <BR>
&gt; &lt;asterisk-users@lists.digium.com&gt;<BR>
&gt; Date: Mon, 09 Mar 2009 14:39:58 -0500<BR>
&gt; To: Asterisk Users Mailing List - Non-Commercial Discussion <BR>
&gt; &lt;asterisk-users@lists.digium.com&gt;<BR>
&gt; Subject: Re: [asterisk-users] Fwd: add a new queue strategy: SBR<BR>
&gt; <BR>
&gt; nik600 wrote:<BR>
</FONT><FONT COLOR="#008000">&gt;&gt; On Mon, Mar 9, 2009 at 3:16 PM, James Sneeringer &lt;jsneerin@gmail.com&gt; wrote:<BR>
&gt;&gt; <BR>
</FONT><FONT COLOR="#FF0000">&gt;&gt;&gt; If you are using dynamic queues with Local channels (as described in<BR>
&gt;&gt;&gt; doc/queues-with-callback-members.txt in the Asterisk source), you can<BR>
&gt;&gt;&gt; also optionally implement this functionality directly in the dialplan.<BR>
&gt;&gt;&gt; This has the added benefit of allowing you to choose on a per-agent<BR>
&gt;&gt;&gt; basis who is eligible for autopause.<BR>
&gt;&gt;&gt; <BR>
&gt;&gt;&gt; -James<BR>
</FONT><FONT COLOR="#008000">&gt;&gt; <BR>
&gt;&gt; thanks for your reply, infact i've implemented the agents in the<BR>
&gt;&gt; dialplan as explained in queues-with-callback-members.txt but this<BR>
&gt;&gt; approach doesn't manage the status of the agent!<BR>
&gt;&gt; I can add / remove / pause / unpause the member interface but what<BR>
&gt;&gt; about the &quot;in use&quot; status?<BR>
&gt;&gt; The extension in the context will be every time &quot;Not in use&quot; or shall<BR>
&gt;&gt; i implement hints?<BR>
&gt;&gt; <BR>
&gt;&gt; Here there is a piece of my extensions.conf:<BR>
&gt;&gt; <BR>
&gt;&gt; [default]<BR>
&gt;&gt; ; login procedure for queue 001<BR>
&gt;&gt; exten =&gt; _001XXXX,1,Answer<BR>
&gt;&gt; exten =&gt; _001XXXX,n,AddQueueMember(001,Local/${EXTEN:3}@agents)<BR>
&gt;&gt; exten =&gt; _001XXXX,n,Set(DB(agents/${EXTEN:3})=SIP/${CALLERID(num)})<BR>
&gt;&gt; <BR>
&gt;&gt; [agents]<BR>
&gt;&gt; exten =&gt; _XXXX,hint,${DB(agents/${EXTEN})}<BR>
&gt;&gt; exten =&gt; _XXXX,1,Dial(${DB(agents/${EXTEN})})<BR>
&gt;&gt; <BR>
&gt;&gt; and there isn't an &quot;agent&quot; but only an extension on a queue.<BR>
&gt;&gt; <BR>
&gt;&gt; What do you think about that?<BR>
&gt;&gt; <BR>
&gt;&gt; maybe i should open a new post but i think that this kind of approach<BR>
&gt;&gt; isn't much better than the callback functionality, what do you think<BR>
&gt;&gt; about that?<BR>
&gt;&gt; <BR>
</FONT><FONT COLOR="#0000FF">&gt; <BR>
&gt; The reason that the member always appears to be &quot;not in use&quot; is that local <BR>
&gt; channels are optimized away once they are bridged to their real destination. <BR>
&gt; The <BR>
&gt; result of this is that since the channel does not exist anymore, the device <BR>
&gt; state engine interprets the interface to be &quot;not in use&quot; anymore. One way to <BR>
&gt; handle this issue is to change your AddQueueMember call to use <BR>
&gt; Local/${EXTEN:3}@agents/n (notice the /n at the end). The /n tells the local <BR>
&gt; channel driver to not attempt to optimize the local channel away.<BR>
&gt; <BR>
&gt; If you are using Asterisk version 1.6.0 or above, an even better method would <BR>
&gt; be <BR>
&gt; to specify a second interface to poll for device state when adding the queue <BR>
&gt; member. Assuming that the member at Local/${EXTEN:3}@agents will always call <BR>
&gt; SIP/${EXTEN:3}, then what you are really interested in when receiving device <BR>
&gt; state notifications is the SIP channel, not the local channel. You can specify <BR>
&gt; this second state interface in AddQueueMember like so:<BR>
&gt; <BR>
&gt; AddQueueMember(001,Local/${EXTEN:3}@agents,,,,SIP/${EXTEN:3})<BR>
&gt; <BR>
&gt; Doing this will tell app_queue to use the SIP channel's device state to <BR>
&gt; determine if the member is available, but when it comes time to call the <BR>
&gt; agent, <BR>
&gt; it will actually place the call to the local channel provided.<BR>
&gt; <BR>
&gt; Mark Michelson<BR>
&gt; <BR>
&gt; _______________________________________________<BR>
&gt; -- Bandwidth and Colocation Provided by <a href="http://www.api-digital.com">http://www.api-digital.com</a> --<BR>
&gt; <BR>
&gt; asterisk-users mailing list<BR>
&gt; To UNSUBSCRIBE or update options visit:<BR>
&gt; &nbsp;&nbsp;&nbsp;<a href="http://lists.digium.com/mailman/listinfo/asterisk-users">http://lists.digium.com/mailman/listinfo/asterisk-users</a><BR>
</FONT></SPAN></FONT>
</BODY>
</HTML>