Meetings. An ever-present tenant of the average office workday that can be simultaneously a source of extraordinarily useful discussions and fuel for distressingly Dilbertesque tediousness.
As you may know, I’m a fan of efficiency, especially when it involves creating ways to have interactions with inanimate objects. The restrooms in our office are already internet-connected – so why not conference rooms? Once you have a seed of an idea like that, it’s hard for it to not run rampant. Which then gave rise to…
The Clarity Conference Companion
Part 1: Getting the Data
EWS, or Exchange Web Services, is an API that Microsoft Exchange exposes that allows you to query mailboxes, calendars, and other objects hosted by Exchange. In general, if you want to get calendar events for a mailbox, you can perform a FindAppointments request using the ExchangeService with the appropriate filters. However, for that to work, you need to have permissions granted on that account (like your own account, or someone whose calendar you manage). While this is perfect for the normal use scenario, I needed to be able to look at the availability of all the conference room accounts – which I do not have permissions to see.
Enter, the Scheduler. When you’re setting up a new meeting, the Scheduler tab can display a basic set of information for each person on the meeting to help you determine the best time to schedule so that everyone can make it. Importantly, you do not need to have permissions on any of the other mailboxes in order to see the data. By requesting from the ExchangeService GetUserAvailability and specifying a FreeBusyViewType of Detailed, I can get back from mailboxes I don’t have explicit access to all their appointments, as well as the Subjects – which generally maps to the person who organized the meeting.
Spin up a quick console application that uses EWS to grab the schedule for each room, and bam. Data acquired.
Part 2: Setting Status
Our office is heavily invested in Skype for Business, and we use it extensively for both communication and presence. Additionally, each desk has a Busylight, which is a physical representation of each person’s presence state to help real-world passers-by know who’s available to talk and who’s not.
A good first step in this application was to add in the ability to see, from outside the room, what the room’s “Presence” state is at the moment. Since I already had the calendar schedule for the room, it was a relatively trivial task to trigger “something” when a meeting was starting soon (so you don’t go into a room for an ad-hoc meeting, only to find it booked minutes later), currently in progress, or if the room was free.
But what should that “something” be, exactly?
The most obvious thing was to allow people in the office to be able to see the status using their Skype for Business client. Step one was to spin up a UCMA Platform in my application – there are tons of other posts about that, so I won’t wax on about it. Once our system administrator enabled all the room accounts for Skype, I had my UCMA platform register UserEndpoints for each room. Then, when one of those events occurred that should cause ‘something’ to happen, I updated the appropriate UserEndpoint with the new state of the room (green if available, red if booked, yellow if it will be in use shortly), as well as a tag of the current user (if applicable). If you find that resource accounts are not showing presence, try logging out of and back into your Skype client – I found that was necessary for accounts that had never been logged into using an actual Skype client.
So that covered people sitting at their desks, but what about people wandering through the office looking for an empty room? Enter: Phillips Hue.
I placed a Hue light outside the conference room, and got that hooked up so it could be updated via a simple web request. Adding a bit to my ‘something’ method, I instruct the Hue light to update to the appropriate color at the same time I update the Skype endpoint’s presence state. Then, just like the Busylights we have at desks, we now had a real-world indicator of the state of the room sitting right outside the door.
Whether virtual or physical, we had status. But now that the basics are down, what else could we do to add value?
Part 3: Notifications
Keeping track of when a meeting in a conference room is getting close to ending can be a real problem. It’s very easy to become embroiled in a discussion and completely forget what time it is, until the next people that have the room reserved are bashing down the door – or a 15 minute standup has escalated to an hour-long dialog. If only there were a way to subtly tell the people in the room that they should start wrapping up their meeting (without derailing a critical discussion…
Once again, Enter: Phillips Hue.
Placing another Hue light inside the room, I had my application set this light using notifications that would be useful to those actually in the meeting room. If the room is available, it’s green. Meeting starting soon? Flip it to yellow to give anyone having an impromptu meeting a heads up that something’s happening soon. It’s turned off while a meeting is in progress, but turns yellow when there are 5 minutes left in the scheduled meeting to remind those inside to start wrapping up. When a meeting is over, it will flash red if another meeting is scheduled immediately afterward, or to green if the room is available and extending the meeting won’t impact anyone else.
It’s a small thing, but giving people in the room a subtle heads up to start wrapping up their meeting has gotten more positive feedback than anything else.
Part 4: Interaction
It’s a simple “fact”: if you have a UserEndpoint that you’re publishing presence for, you should give it a personality too. And so the full Conference Companion was born.
I added logic that would allow each conference room to accept IMs, and respond about the availability of the room based on the request.
If you send a generic IM, it tells if you if it is currently available and the schedule for the rest of the day – including when it’s next occupied. If it’s not available, it tells you when it’s free, and also suggests other rooms that show as available at the moment.
If you include a time in your IM, it tells you about the room’s availability today at that particular time – as well as everything else previously mentioned. If you include a duration (like 30 minutes or 1 hour), it’ll tell you if the room will be free for the duration of your requested meeting – either now or at the time specified, if you did so.
Joining the restrooms, Clarity’s conference rooms gained a little bit of intelligence. What’s next?