Those of us with a telephony background have been rejoicing of late with the release of several Call Pickup solutions for Lync. Long conspicuous by its absence from the OCS and Lync feature list, it’s been at the top of the Cisco competitive playbook for those aiming to shoot down a Lync Enterprise Voice opportunity. No more.
Several third-party vendors have plugged this hole in the past, with their software add-ons generally running server-side MSPL scripts to redirect a call that’s been “picked up”. German developer partner Colima has what I consider the best solution in the market. It’s the only one (to my knowledge) that requires no client-side plugin, and is thus also fully supported on the Aries series of handsets from Aastra, HP and Polycom. (I’ve not tested it with a SoundPoint, Snom or VVX, although Colima tells me it has been heavily tested with Snom).
Lync 2013 finally brings Call Pickup in from the cold with its inclusion in CU1, with a tweaked CallPark commandlet and an extension to SEFAUtil.
I thought I’d compare both and see how they rate.
What is Call Pickup?
Prior to the evolution to “Stored Program Control” (SPC) PABXs in the late 70s and early 1980s, PABXs were based on relays, perhaps banks of them in Crossbar switches, or even (going back to the 60s) bimotional switches. (Here’s a Strowger link – the best I could do). They were relatively primitive creatures, but they did the job.
Come the computerised revolution and we became able to program them to do all sorts of things, including simple features we’ve long since taken for granted like redirect calls to another destination when the called party was already on the phone or failed to answer.
Call Pickup is the name of the feature whereby a user was able to lift their telephone handset and either press a fixed key or dial a numeric code and be connected to the caller presently ringing to another person’s extension. Etiquette would dictate you greeted the caller with something akin to “Greig’s phone, this is Glen speaking”, so they realise they’ve not reached the person they were seeking/expecting. (Being greeted by a voice in the other gender would often help convey that message quite adequately!).
If there were multiple calls ringing to phones in the one group, it was usually a lottery as to whose call you would answer. In some systems it appeared random, in others it followed the order in which the phones were configured in the pickup group.
The telephone numbers of those in a team or defined area would be pre-configured by the PABX Engineer or Administrator into a list – a “Call Pickup Group”. Depending upon the PABX type, a user could usually only belong to one group.
There were up to three different variants on the Call Pickup theme, and all could be active in the system. The Nortel / “Avaya Blue” PABX referred to these as Ringing Number, Directed, and Group. Other manufacturers might have chosen different names, but the functions of each are relatively universal.
Ringing Number Pickup
When the phone of someone in your group is ringing, you can dial a code or press a key to answer that call.
If you know the number of the phone that is ringing, you can dial a code or press a key, followed by the number of the ringing phone to answer that call. e.g. You might not belong to your manager’s pickup group, but if you hear the phone ringing in their office, you could pick it up using this feature. In some systems this feature became a handy way to answer a Night Bell. With a “Directed Pickup” code of “1” and the Night Bell having the extension number “1”, all it took was “11” to answer the bell.
If you know your team is configured in Pickup Group 1, and the adjoining team is in Pickup Group 2, it’s a simple process to answer a call ringing to someone in that team. If the Group Pickup code is “2”, it’s just “22” to answer a call ringing to a phone in Group 2. This feature presents a superior way of implementing the Night Bell scenario referenced above, as it imposes a lesser burden on the dial (numbering) plan.
Cerebro Universal Call Pickup
Universal Call Pickup is an app that uses MSPL, Server-side API *and* UCMA to handle the call re-routing. You install it on all your FEs in the pool, so you don’t need to add any more server hardware. It includes an optional “Busy on Busy” module that will suppress new calls when you’re already on the phone. (More on that later).
The installation process was quite simple, with the installer doing the bulk of the work:
- Unzip the installation package and run CerebroServicesSetup.exe. It will install itself to “%PROGRAMFILES%\colima\Cerebro” where-ever it goes to ensure a consistent installation path across multiple FE servers (assuming an EE pool). The installation process creates a Cerebro database in the RTCLOCAL instance on the FE Server.
- Depending on your OS, you might need to install .NET Framework version 4.0, 64bit, Full Profile (the Client Profile is not enough). The installer will grab this from the internet and install it for you if it’s not already present.
- Installation also involves the creation of a TrustedApplicationPool on the FE. You’ll be prompted to supply a unique SIP Address for the TrustedApplicationEndpoint. I just went with “cerebro@<MySipDomain>”.
- Once it’s installed, you’ll see four new services, and they all should be running:
- Next step is to load the Cerebro PowerShell module:
This adds the following commands to the Lync PowerShell:
PS> get-command *cerebro* CommandType Name ModuleName ----------- ---- ---------- Function Export-CerebroUserPolicy CerebroUserPolicies Function Get-CerebroUserPolicy CerebroUserPolicies Function Import-CerebroUserPolicy CerebroUserPolicies Function Set-CerebroUserPolicy CerebroUserPolicies PS>Get-CerebroUserPolicy gilligan Name BusyOnBusy CallPickup ---- ---------- ---------- gilligan True True PS>
They’re well-crafted, with the usual help and auto-complete, which I found a great pleasure, given my addiction to the Tab key in PowerShell to spare me the tedium of actually having to type anything.
- Some global commands (like configuring the call pickup code and e-mail server settings) are done from the Cerebro Configuration management application that you’ll probably only ever run once:
If you don’t run it elevated, it’ll pop a box telling you of this requirement, which I think many other apps would benefit from!
- The final piece of the puzzle is to setup the Call Pickup Groups. For that, you need to jump to AD, create some security groups with the word “Pickup” in their name, and add your users.
A nice benefit of this approach is that (unlike many PABXs), a user can be a member of multiple pickup groups.
The User Experience
Whilst the feature works quite well, I was surprised to find that it doesn’t quite operate as I was expecting:
- When you hear a phone / Lync Client ringing, go off-hook or otherwise dial the CallPickup code. (The default value, as shown in the image above, is “*5”)
- The phone’s display (on my CX600) toggled from Calling / Cerebro / Connected / Ended
- The phone now rings with the “picked up” call. Nicely, it shows a subject on-screen to indicate that it’s the transferred call
This brief video on Vine shows the process. How well users adapt to this might be interesting. I guess it was a necessary evil forced by something in MSPL.
The product’s well-documented, with helpful User and Admin guides.
Busy on Busy
Colima also offers the “Busy on Busy” (BoB) module with Cerebro. If you’ve ever wanted to suppress additional calls when you’re on the phone, BoB will do that for you. It’s administered with the Cerebro PowerShell module described above, and can be enabled and disabled for individual users. When you’re on a call and with BoB enabled, callers receive busy tone and if calling from the Lync Client they’re told you’re on the phone:
This image represents a quirk in the Lync presence states. At the time I took that screen-grab, a call was ringing to me, so I wasn’t yet actually “On A Call”, thus Lync reports I’m “Available”. A second call to me at the same time was rejected, leading to the contradictory on-screen messaging. There’s nothing we can do about that one, but it’s likely to result in the odd HelpDesk call. (I am however pleased that Cerebro does grab and bounce the second call, even though I’m not yet really on the first).
The option to send the rejected caller to your unanswered calls destination – which would typically be voicemail – is apparently coming in the next release.
A global setting in BoB can be set to send the “recipient” an e-mail each time it rejects a call on their behalf:
There is no apparent throttling of messages, so every repeated attempt at calling you will generate an e-mail. Accordingly, I think that feature will find itself disabled VERY quickly when it starts to FILL people’s Inboxes with notification spam. And being a global, it only needs to annoy someone higher up the food chain for it to be deleted for everyone. (Or in reverse, if someone higher-up likes it, everyone beneath is going to be stuck with it. Outlook and/or Exchange Transport rules to the rescue I guess!)
I don’t know if Lync/MSPL supports it, but a better option surely would have been to replace the “Retry” button with the offer to Tag the recipient for Status Change Alerts and ditch the e-mail. Or send them to voicemail.
Lync 2013 CU1 Call Pickup
The official Lync 2013 version of CallPickup is based around a hybrid of SEFAUtil and CallPark number ranges. (It wouldn’t surprise me in the least if there’s some MSPL magic making it work under the hood).
Lync uses a new CallParkOrbit range that serves dual purposes: it’s both the Group number a user belongs to, and also the code you dial to pickup their calls. As such, it’s closest in operation to the Group Pickup described earlier. It also means that everyone has to know and dial the right code to pickup a call, rather than just use a generic code (as you do for Ringing Number / Cerebro). This is likely to result in some training and/or user adoption pain. I also can’t see a way of finding out just WHO belongs to a specific Group, which I would have thought an obvious inclusion. Let’s hope that’s in CU2, or it’s here somewhere and I’ve just missed it. Anyone? Anyone? Bueller?
It is perhaps worth noting that Lync’s Call Pickup contains no authorisation mechanism to determine your suitability to pickup a call. If you know their Orbit/Group number (and know their phone is ringing), you can pick up the GM’s calls from the courtesy phone at Reception.
- Install CU1 on your FE server(s). Don’t forget the database updates!
- Install the Reskit on your preferred server. In my Lab I used the FE, but in the wild you might prefer to quarantine it to a separate “Applications” server.
- Lync uses a new CallParkOrbit range that serves dual purposes: it’s both the Group number a user belongs to, and also the code you dial to pickup their calls. Let’s create the range now, and later we’ll assign users to specific Orbits / Groups:
New-CsCallParkOrbit -Identity “Minneapolis” -NumberRangeStart “#100” -NumberRangeEnd “#199” -CallParkService pool.domain.com –Type GroupPickup e.g. New-CsCallParkOrbit -Identity “CallPickup” -NumberRangeStart “#120” -NumberRangeEnd “#149” –CallParkService lync2013se.contoso.com –Type GroupPickup Identity : CallPickup NumberRangeStart : #120 NumberRangeEnd : #149 CallParkServiceId : ApplicationServer:lync2013se.contoso.com CallParkServerFqdn : lync2013se.contoso.com Type : GroupPickup
- Create a trusted application pool. As luck would have it, I could skip this step, as my FE was already a trusted pool, as it also hosts Cerebro.
New-CsTrustedApplicationPool –id <Pool FQDN> –Registrar <Pool Registrar FQDN> -site Site:<Pool Site> e.g. New-CsTrustedApplicationPool –id lync2013se.contoso.com–Registrar lync2013se.contoso.com -site Site:4
- Add SEFAUtil as the trusted application:
New-CsTrustedApplication –ApplicationId sefautil –TrustedApplicationPoolFqdn <Pool FQDN> –Port 7489 e.g. New-CsTrustedApplication –ApplicationId sefautil –TrustedApplicationPoolFqdn lync2013se.contoso.com –Port 7489
- If you’re successful, Lync will output the config of the app, and advise you have to Enable the Topology. So let’s:
- Now take SEFAUtil for a test drive to see if it’s working. Navigate to the folder it’s in: “C:\Program Files\Microsoft Lync Server 2013\ResKit”
- Run a query on a random SIP account just to see if it’s working:
SEFAUtil.exe <user SIP address> /server:<Lync Server/Pool FQDN> e.g. PS C:\> .\SEFAUtil.exe sip:email@example.com /server:lync2013se.contoso.com User Aor: sip:firstname.lastname@example.org Display Name: Greig Sheridan UM Enabled: True Simulring enabled: False User Ring time: 00:00:15 Call Forward No Answer to: voicemail PS C:\Program Files\Microsoft Lync Server 2013\ResKit>
- OK, that was successful, so now let’s see if we can add some members to a pickup group:
SEFAUtil.exe /server:<Lync Server/Pool FQDN> sip:email@example.com /enablegrouppickup:199 e.g. PS C:\> .\SEFAUtil.exe /server:lync2013se.contoso.com sip:firstname.lastname@example.org /enablegrouppickup:#120
The User Experience
While the Admin side of Lync Call Pickup is slow (with SEFAUtil taking around 10s to respond to every command), the user experience is MUCH more like you’d expect of a traditional Call Pickup: Lift the handset / dial code / say hello to the person at the other end.
In my lab I found Lync fast to answer and connect the call, although it’s not quite perfect. Hyper-caffeinated users will notice Lync jump through the following two screens on the way to connecting the call (the third image).
|Feature||Cerebro||Lync 2013 CU1|
|System requirements||No server required: It’s installed on every FE||Lync 2013 CU1 installed on every FE. New/separate server recommended for SEFAUtil|
|Lync 2010 servers?||Yes||No|
|Lync 2013 servers?||Yes||Yes|
|Lync 2010 & 2013 Hybrid?||Supported installed on the Lync 13 FE only in a Hybrid environment||??|
|Management||PowerShell module (provided). Groups are based around AD Security Groups||Lync PowerShell commands for initial setup. SEFAUtil for Group Management|
|Pickup from Lync Client||Yes||Yes|
|Pickup from Aries Phone||Yes||Yes|
|Pickup users homed to SBA?||Yes (if Cerebro is installed on the SBA and both the “picker” and “pickee” are homed to the SBA)||??|
|Pickup Ringing Number||Yes||No|
|Pickup Directed||Yes. A pre-requisite is that both parties belong to at least one common pickup group||No|
|Pickup priority / sequencing||FIFO. The first phone ringing is picked-up first||??|
||Private Line, Delegation, Team Call, Sim-Ring, Response Group and Personal Contact calls cannot be picked up|
|Busy On Busy||Optional module ($)||No|
|Price||Licenced by functionality & user count. Generate a quote here||Free|
If you have Lync 2010, Cerebro is clearly your only option here. Whilst it works a little differently than the traditional feature, it does what it’s meant to, seems to pick up just about everything, and you get the option of BoB too. (For some customers, BoB alone might be enough to win you over).
For a Lync 2013 deployment, each has their strengths and weaknesses, but I think ultimately it’s a text-book example of “you get what you pay for”. The free offer from Microsoft is a basic pickup experience. It’s true to the traditional expectations at the user-level – you dial the code, you get the call – but it will only pickup a ‘vanilla’ call to the other party. Admin is slow through SEFAUtil and you can’t easily determine who belongs to a group. It’s also open-slather – the moment you know someone’s pickup group you have free rein to answer their calls.
Conversely, with its “ring back” call operation, Cerebro’s is a peculiar user experience, but gains points for being able to pickup all(?) call types and offering a consistent Pickup code as well as the ability to do a Directed pickup. It also has the advantage of being more secured than the official Lync version, with you needing to belong to the same pickup group as someone before you’re able to retrieve their calls. Add the neat PowerShell interface with Pickup groups maintained in AD and it comes across as a very Enterprise-friendly utility.
Being early versions of a new software feature the bugs and quirks in each application will hopefully be soon ironed out. I found Colima a very responsive and enthusiastic vendor, so some of the rough edges are likely to be improved in a very short timeframe, whereas the Goliath in the picture often moves at a glacial pace, such that I wouldn’t expect anything much to change except in ~quarterly increments as each CU is released. I wouldn’t be surprised if Microsoft does nothing further with Call Pickup. It’s a boutique feature only relevant to some regions, and like with the Response Group, if their basic offering is insufficient you have partner solutions like Cerebro to fill in the gaps.
Price and Availability