On 7/16/07, <b class="gmail_sendername">Adrian Marsh</b> &lt;<a href="mailto:Adrian.Marsh@ubiquisys.com">Adrian.Marsh@ubiquisys.com</a>&gt; wrote:<div><span class="gmail_quote"></span>&nbsp;<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Anyone know if theres a way to share a Cisco 7940 between hot-desk<br>users?<br><br>My phones get their setup via SIP .cnf files, that load at boot via<br>tftp, so I&#39;m assuming the configs a failry static. However if I want a
<br>phone to be hot-desked, I could have different users sitting there.&nbsp;&nbsp;Is<br>there any concept of &quot;logging on&quot; in these environments?</blockquote><div><br>You can set up single-person queues that you can use like extensions.&nbsp; The deskphone itself would still have to be addressable as &quot;SIP/something&quot;, and the outbound context will be the same regardless of who is logged in (unless you want to get fancy and store who is logged in in ASTdb then fork to the proper outbound context using Goto in the shared context for the peer), but it works.
<br><br>Here&#39;s my queues.conf for a single-person queue:<br><br>[queuename]<br>strategy=rrmemory<br>servicelevel=60<br>timeout=20<br>retry=5<br>wrapuptime=0<br>maxlen=1<br>announce-frequency=0<br>announce-holdtime=no<br>
joinempty=strict<br>leavewhenempty=strict<br>reportholdtime=no<br>monitor-format=wav<br>ringinuse=no<br><br>And the dialplan to enqueue:<br><br>--START--<br>[somecontext]<br>exten =&gt; ###,n,Macro(singlequeue,queuename,###)
<br><br>[macro-singlequeue]<br>; No-op to give us a 1 priority<br>exten&nbsp;&nbsp; =&gt; s,1,NoOp<br><br>; if DIAL_ANNOUNCE is set, play the &quot;please hold on while I...&quot; msg<br>exten&nbsp;&nbsp; =&gt; s,n,GotoIf($[&quot;${DIAL_ANNOUNCE}&quot; != &quot;1&quot;]?check_clid_set)
<br>exten&nbsp;&nbsp; =&gt; s,n,Playback(transfer)<br><br>; Set CLID Name if specified<br>exten&nbsp;&nbsp; =&gt; s,n(check_clid_set),GotoIf(${ISNULL(${CLID_NAME})}?enqueue)<br>exten&nbsp;&nbsp; =&gt; s,n,Set(CALLERID(name)=${CLID_NAME})<br><br>; Enqueue the caller
<br>exten&nbsp;&nbsp; =&gt; s,n(enqueue),Queue(${ARG1}|nrtW|||20)<br><br>; Jump based on status - TIMEOUT | FULL | JOINEMPTY | LEAVEEMPTY | JOINUNAVAIL |<br>&nbsp;LEAVEUNAVAIL<br>exten&nbsp;&nbsp; =&gt; s,n(branch),Goto(s-${QUEUESTATUS},1)<br><br>
; If unavailable, send to voicemail w/ unavail announce<br>exten&nbsp;&nbsp; =&gt; s-TIMEOUT,1(vmu),Voicemail(${ARG2}|uj)<br>exten&nbsp;&nbsp; =&gt; s-TIMEOUT,n,Hangup<br><br>exten&nbsp;&nbsp; =&gt; s-TIMEOUT,vmu+101,Playback(vm-theperson)<br>exten&nbsp;&nbsp; =&gt; s-TIMEOUT,n,SayDigits(${ARG2})
<br>exten&nbsp;&nbsp; =&gt; s-TIMEOUT,n,Playback(vm-isunavail)<br>exten&nbsp;&nbsp; =&gt; s-TIMEOUT,n,Hangup<br><br>; If busy, send to voicemail w/ busy announce<br>exten&nbsp;&nbsp; =&gt; s-FULL,1(vmb),Voicemail(${ARG2}|bj)<br>exten&nbsp;&nbsp; =&gt; s-FULL,n,Hangup
<br><br>exten&nbsp;&nbsp; =&gt; s-FULL,vmb+101,Playback(vm-theperson)<br>exten&nbsp;&nbsp; =&gt; s-FULL,n,SayDigits(${ARG2})<br>exten&nbsp;&nbsp; =&gt; s-FULL,n,Playback(vm-isunavail)<br>exten&nbsp;&nbsp; =&gt; s-FULL,n,Hangup<br><br>; Treat the empty, unavail as full
<br>exten&nbsp;&nbsp; =&gt; s-JOINEMPTY,1,Goto(s-FULL,1)<br>exten&nbsp;&nbsp; =&gt; s-LEAVEEMPTY,1,Goto(s-FULL,1)<br>exten&nbsp;&nbsp; =&gt; s-JOINUNAVAIL,1,Goto(s-FULL,1)<br>exten&nbsp;&nbsp; =&gt; s-LEAVEUNAVAIL,1,Goto(s-FULL,1)<br><br>; Treat anything else as timeout
<br>exten&nbsp;&nbsp; =&gt; _s-.,1,Goto(s-NOANSWER,1)<br><br>; if people star out of voicemail, send them to the top-level admin IVR<br>exten&nbsp;&nbsp; =&gt; a,1,GotoIf(${ISNULL(${IVR_CONTEXT})}?setivrcontext:gotoivr)<br>exten&nbsp;&nbsp; =&gt; a,n(setivrcontext),Set(IVR_CONTEXT=ivr-admin)
<br>exten&nbsp;&nbsp; =&gt; a,n(gotoivr),Goto(${IVR_CONTEXT},s,1)<br><br>; If they hit 0 from VoiceMail to dial the operator,<br>; after 20 seconds they go back to the top of the named context<br>exten&nbsp;&nbsp; =&gt; o,1,Macro(operator)<br>
<br>exten&nbsp;&nbsp; =&gt; h,1,Macro(loghangupcause)<br>---END---<br><br>There&#39;s some extra cruft in there you could easily cut out to suit your environment.&nbsp; Using that macro in the same way I would normally use &quot;Dial&quot;, the experience for both the caller and agent is pretty much the same.&nbsp;&nbsp; You need to have 
1.4.7 so that if the agent hits &quot;ignore&quot; or &quot;reject&quot; the call immediately exits Queue() - there was a bug surrounding the &#39;n&#39; option in 1.4.6 and earlier.&nbsp; If you don&#39;t have that version, then hitting ignore or reject will send the call back to the phone after &#39;retry&#39; seconds until the timeout runs out (in my case 20 seconds).
<br><br>All you then need is some dialplan sugar to invoke AddQueueMember and RemoveQueueMember in response to logon and logoff actions by the agent.&nbsp; If you&#39;re not worried about authenticating the users, you can just do something like:
<br><br>exten =&gt; _7000XXX,1,AddQueueMember(singlequeue_${EXTEN:4},${CUT(CHANNEL,,1)},,,${CUT(CHANNEL,,1)})<br>exten =&gt; _7001XXX,1,RemoveQueueMember(singlequeue_${EXTEN:4},${CUT(CHANNEL,,1)},,,${CUT(CHANNEL,,1)})<br>
<br>Then agent 123 can log in by dialing extension 7000123 and log off by dialing extension 7001123.&nbsp; If you attempt to enqueue the caller to the queue when there&#39;s nobody logged in, then you&#39;ll immediately get kicked to your dialplan with ${QUEUESTATUS} set appropriately.&nbsp; This may or may not be what you want, because it means that callers will go directly to voicemail if the person they&#39;re calling isn&#39;t logged in.
<br><br>HTH<br><br></div></div>-- <br>j.