The key values UC provides are
- reduced communications latency for communications we want, realtime communication is
obviously the best
- delayed or blocked communications we don’t want (eg annoying sales person calling me)
- simple user interface(s).
To achieve these we must integrate the various modes of communication where it makes user
sense:
- Presence/IM (PC and smart-phone)
- E-mail
- Find Me/Follow me
- Telephony (mobile and wire-line)
- MeetMe conferencing
- Fax
In a business environment we partition those we communicate with into the following user types:
- others within the company/organization. We will call these internal friends
- those outside the company/organization but in our buddy/contacts list such as customers,
partners, suppliers. These we will call external friends
- those not in our buddy/contacts list such as people calling us for the first time, those we
infrequently communicate with via voice or e-mail etc. We will call these acquaintances
- those that are very important to us. Kids, kid’s school, most important customer, boss,
maybe even wife/husband! These can be internal or external. Will call these close friends.
And finally, our communication preferences/style will be influenced by our device:
- smart-phone – long distance, roaming and air time charges can definitely add up. More
and more users have smartphones (iPhone, BlackBerry, Google G1, Palm, Nokia). More
and more users are mobile. Cellular networks are getting faster, WiFi zones are
everywhere
- desktop – PC, SIP Phone and corporate network result in few constraints that influence
UC preferences and styles
The following are high runner scenarios we wish to address with Personal Assistant functionality
that provides a fast and easy UI
- Receive too many calls while I am idle, busy and/or on the phone, want to screen/filter
calls somehow. Want to decide to take a call based on IM or phone announcement mode
- Find Me/Follow Me is great but I need to dynamically easily and quickly change my call
routing. Eg going into a one hour customer meeting. Ie. Need to delay my
communications
- On the phone or talking to someone at my desk and receive a call from an internal or
external friend .. want to easily/quickly send an IM to caller indicating something like
“talking to Joe, call you back in 5 minutes”
- I am traveling and need to login to a conference call, or need to make some quick calls to
internal friends. Don’t want to incur cellular long distance charges.
- Have a smart phone and am in a country (eg UK) what uses CPP (Calling party pays).
Want to “initiate” calls from my smartphone where the PBX calls me, calls the called party
then bridges the calls together. This way I don’t use up airtime. Want this to be very
simple to do
- Want to easily change modes: ie. Use IM to do (pre) screen pop “can I call you to discuss
our sales results” and if the answer is “yes” then to an IM click to call
- On my smartphone , want to talk to Joe but see that he is on the phone. Want to be
informed via IM or call when Joe is available.
- In an important meeting, want to block all calls and after the meeting want to know who
(friends and acquaintances) tried to call and when. Want to do an IM click to call for those
I want to call back (if on mobile) don’t want to incur long distance charges)
- When an friend or acquaintance calls me I want to provide them with my presence and
status. Eg. “on the phone”, “away – at the dentist until 3pm”.
- Want to avoid voicemail tag. Eg. friend leaves a message that says “its John, call me
back when you can”.
- Want to start an adhoc conference more quickly and easily. Currently I need to send an
IM to the three people I want to talk to that says “join me on my MeetMe bridge right now:
393-1234, 4353”. Doing this on a mobile device is almost impossible.
- Want to receive faxes and have them deposited in my e-mail account
- When reading an email want to click to call. If on mobile don’t want to incur long distance
charges
- Want to provide preferential call routing for my close friends. Eg. if my kid’s school is
calling want to Call Server to fork call to my cell phone regardless of time of day. Want to
block (send to voicemail) for 1-800 numbers, pesky sales people (my spouse?).
The solution to the above is to have a human personal assistant per employee. I give my PA
instructions/status via natural conversation or IM. Since this is not cost effective want to provide a
software based Personal Assistant.
The Personal Assistant (PA) is a freeswitch java application that would emulate what a human
Personal assistant would do to enable and enhance unified communications and reduce
communications latency.
Here is the caller telephony UI .. Expressed as pseudo code
if, at any time, fax tone is detected or .. this PA is setup to only
receive fax (user’s virtual fax machine) then {
receive fax (via mod_fax Freeswitch module) and send e-mail with
TIFF file attached to user's e-mail address
}
play “I'm the personal assistant for . (use TTS to play name so all speech in
one voice)”
if John's presence is "Available or "Free to Chat" and no special user instructions then {
if user has call screening enabled and call is external {
if no recorded name found (system wide) corresponding to the calling number {
play "may I say who is calling"
record name (for up to 5 seconds)
save as .wav in system wide directory
}
play "one moment while I try to locate "
call user (and find me, follow me DNs) and play " is calling, to accept call, press 1,
to ignore, press 2" and/or
if user is not "away" or "extended away" then {
send IM to user: "John Doe (phone: xxx-yyy-zzzz) is calling. Do you want to take
this call?" (PA has an Openfire account with user name "My Assistant")
User sends back IM with answer of yes, y, no, n (case insensitive)
}
if user answers yes via telephone or IM then {
transfer call to John's phone
}
if user answers no {
play " is unavailable, I'll transfer you to his voicemail"
transfer to voicemail box
}
} else {
"I'll transfer you to "
transfer to John's phone
// since this is a higher runner case, perhaps don’t even answer the call and
// deflect the call to John instead
}
play John's presence indicator if not available or free to chat.
eg " is away", " is on the phone", cannot be disturbed"
play John's status message if set. eg "He is at the dentist until 3pm"
(SipX will need to know if the user is male or female)
If John’s presence is not available or free to chat {
if PA can map the CLID number to a IM address via OpenFire user database then {
play "to receive an instant message when is available, press 1"
}
play "to have return your call, press 2"
// PA would then send an IM and/or SMS (based on user preference)
// to John with the caller details and time.
// Modern version of : “would you like me to page john” ..
// no body carries pagers anymore
play “to transfer to voicemail, press 3”
}
play “to transfer to , press 4
play “to speak with assistant, press 0”
// transfers to user’s personal assistant DN/URI
The User UI is not via the telephone or web UI. Want it to be quicker and more natural as if
user was communicating with a human personal assistant in which case user would use speech
or IM. Since IM is easy and quick (for software development and the user) I’ll stick with that.
There will be a system wide OpenFire IM account called “My Assistant” (would use the Smack
Java package to login to this account, be online always, accept all subscriptions, and
Receive presence/status info for all SipX users
User uses favorite XMPP client to “converse” with My Assistant using a simple command
structure that Woof has proposed. The User may well be using an XMPP client on his/her
smartphone!
Here is an example “conversation” (text in bold sent by user)
status
Jane Smith (phone: XXX-YYYY called at 12:04, you received a fax
at 3:15, you have three new voice messages, one is urgent from
(CLID Name/Number).
You are at 613-234-2345 until 2pm.
Currently sending all calls to voice mail until 3pm. To change
reply with:
accept (to accept calls again)
announce (to have me IM you for a choice for each call)
voicemail (if you do not want to accept any calls)
announce
Ok. Now announcing all calls with IM
Is there a time when I should stop doing this. Reply with:
Yes or no
Etc ..
at 613-234-5678
Ok. Reply with:
until eg. until 3pm or until 9:30am
for eg. for 2 hours or for 2.5 hours
Need to be careful here about toll fraud issues since the number
specified might be in Africa!!!
For two hours
System will only call you at the number specified instead of
calling you desktop set.
Call 6-393-0170
Personal assistant calls me (leveraging Find Me/Follow Me or my
current number specified via “at” command), calls 6-393-0170 and
joins the two calls together
Call Jane Smith
Same as above but uses name dialing, searching through PA’s
roster (all SipX users), if not found searches call history.
Perhaps a toll fraud issue is lurking here if the XMPP account is
hijacked by someone!
Call Jane Smith, George Bush, Barack Obama (discuss sales data)
User clearly wants an adhoc conference call to discuss the sales
data. PA calls you and transfers its end of the call to your
meeting conferencing DN. PA then calls each of the three parties
and announces “ would like you to join a conference to
, to accept, press 1, to decline press 2.” If
party accepts then near end of the call is transferred to the
users MeetMe Conference DN. Now each of the called parties may
have a personal assistant as well. In this case the IM screen pop
would convey the additional information (“discuss sales data”).
You have a call from John Doe at 613-234-5543. Reply with:
Ok (or just answer the call)
IM text to send to John Doe (eg. talking with Sandy, call you in 5 minutes)
Or .. if this is for an adhoc conference:
John Doe would like you to join a conference call to discuss
sales data. Reply with:
Ok (or just answer the call)
IM text to send to John Doe (eg. will join in a minute or so)
Instant Message to back to caller is text that user has entered.
IM option is provided only if a CLID Number to IM account lookup
is successful. Not all users/systems convey the user’s contact
phone numbers. Yahoo Messenger apparently does not.
If the call was for an adhoc conference call (see immediately
above) then the response IM will be conveyed to the conference
initiator. Eg. “I’ll join your adhoc conference in a minute”
The caller who declines the conference call will be sent an IM
with the conference DN to call. Eg. “if you wish to join later,
call XXX-YYYY-ZZZZ, 33423”
[this is an IM screen pop where the user can either just answer
the call or respond with a quick IM. This is quite different
from call screening since the caller is ringing at your set at
this point. Indeed if the call was already screened then the PA
would not send this IM.
IM reply option is provided for callers who are Sipx users since
PA cannot send an IM to someone that is not in its roster. As
well, may public IM systems do not convey user contact number
information via vCard or some other mechanism.
Command syntax/semantics
- help
- status
- at {until } - system will present user’s incoming
calls to this number instead of desktop set and find me/follow me
numbers
- accept {until } – don’t screen calls
- voicemail {until } – send all calls to voicemail
- announce {IM} {no | until } - screen calls. If “IM” included
then calls will be “announced” via IM otherwise announced by
calling the user.
- history - responds with last 30 calls originated or
received. If a number is provided than that number of calls is
presented to user
- find - searches directory for prefix matches (based on
last or first name) and presents those matches. Eg. entering find
fowl will find the “Peter Fowler” entry. Find Pete
will find perhaps two entries “Peter Fowler”, “Peter Smith”. If no
matches found find will use the same algorithm to search user’s
call history list
- call me | number | name {} – name will be searched
using the find command. If more than one match found all matches
will be displayed and user asked to add more letters to resolve the
ambiguity. Call will be made to the user’s desktop set or the
number specified using the “at” command. If the called party is a
sipX user and also uses a personal assistant then the IM screen pop
will include the call subject.
- call number | name, number | name, number | name .. {} – initiate an adhoc conference call with the specified
subject. Each name is resolved to a phone number via the find
command. Each party is called and presented with a voice prompt
announcing the conference, subject and option to accept or decline.
For each accept, call is transferred to initiators MeetMe
conference bridge. Initiator is also called and then transferred to
his/her MeetMe conference bridge.
While on a conference call or a MeetMe conference call, user can
add more participants by using the call command again. If a
conference reason is not specified then the previous reason will be
used.
A high runner case would involve turning a simple two party call
into a conference call .. hmmmm not sure how to do this since SipX
can’t control either end of the call unless the PA stays in the
call as a silent participant (three way call).
- block - blocks the number of any prefix match. Eg
block 1-800 will send all 1-800 calls to voicemail.
If My Assistant doesn’t understand an IM it responds “I don’t
understand” followed by a help IM.
If a caller has selected option to “have return my call”
My Assistant sends IM to regardless of his presence indicating
Who called, when and that he/she wishes to call them back.
User can enter short forms for commands as long as there is no ambiguity. Eg. “f” can be entered
instead of “find”
Flexible call routing
Users want preferential routing for close friends. To achieve this today, a user would give out
his/her cell phone number or cottage number or home number only to select people. Then these
people end up calling the office phone number, give up, then call the cell phone etc. The user
may not want to include his/her cell phone or home phone in his/her call forwarding rules.
The most flexible approach would have the user specify call forwarding rules based on IM groups.
Clearly this is too complex for an IM interface. Even for the user portal it is perhaps too much
trouble and complexity.
The higher case is you want to specific additional calling number targets for close friends in your
call routing rules.
So, within the user portal, the user defines a list of CLID numbers that represent close friends.
User can add to this list by optionally defining the IM group name(s) that represents his/her close
friends (default would be “Close Friends”). Sipx can determine who is in these groups since the
OpenFire data base stores the roster and group information on a per user basis.
In the Call Forwarding phone number setup page add an additional check box titled “Only if close
friend”. By default this is unchecked. If checked then for the rule to trigger it needs to match both
the time (when) criteria AND the close friend criteria (who). Implementation of this would require
some SipX proxy work to determine if the caller is a close friend based on the CloseFriends.xml
file stored on a per user basis.
Open question: should the Personal Assistant screen calls from close friends?
Future extensions
Google Calendar supports CalDav (RFC 4791) for querying and updating calendar information.
A caldav4j opensource java library exists that uses this protocol to provide a high level calendar
API that the Personal Assistant could use to see if the called user is in a meeting and if so
announce to the caller “In a meeting until 3pm”.