Archive for the ‘Multi-channel’ Category

How to Build a VoIP-Based Baby Monitor

Thursday, February 17th, 2011

Two members of the Phono/Tropo team, and soon a third member, have recently added new babies to their families. Congratulations Mark, Justin, and John!

All of this excitement got the hacker in me thinking…  What would a modern Baby Monitor look like today?  Armed with the Phono and Tropo APIs, I started hacking and 2 hours later had the following example application to share with you!  Here’s the link to the demo.  Let us know what you think! http://phonophone.heroku.com/babymonitor.html

Phono, the jQuery WebPhone from the Tropo team, runs in the web browser to monitor activity in the room where it is running.  Tropo is used to manage the baby monitor’s conference room (based on the access code) and the dial-in numbers to listen to the baby monitor via PSTN, Skype, SIP, or iNum.  The Phono side of the conference is unmuted so you can hear activity while the Tropo side of the conference is muted.  You can have many people (Mom, Dad, Grandparents, etc.) dialed in listening to the same baby monitor using any combination of the access channels listed above.

Check out the Phono Blog to learn more about this demo and see the source code!

Unlocking Government Data with Tropo and Open Source Software

Saturday, December 25th, 2010

This Christmas, the open government data elves have been busy.

They’ve been building useful applications with data sets from municipal governments, open source software and multi-channel communication platforms like Tropo.

With all of the data that is being released by municipal governments, there are increasing opportunities to build useful and interesting applications that can help people and make their communities better.

Sometimes, however, the format of the data that is released doesn’t always lend itself to easy use.

For example, many governments release geographic data sets in shapefile format – this can be a bit of a hinderance for some developers to work with, particularly if they don’t use it often or don’t know much about this type of format.

Fortunately, there are a growing number of open source tool available that make working with geographic data in general, and shapefiles in particular, much easier.

The video below demonstrates how to quickly create a powerful communication application for citizens in New York City to find library locations near their homes.

This demo application uses data from the New York City Data Mine, GeoCouch, a fork of CouchDB that support geospatial queries of CouchDB documents, shp2geocouch, a Ruby gem developed by Max Ogden to convert ESRI shapefiles into CouchDB databases and the Tropo Scripting platform.

This project – completed in just a few hours – demonstrates the power of Tropo to quickly build sophisticated cloud-based communication applications that can be used on a number of different channels to deliver useful government information to citizens. (Note – this demo application can easily be adapted for use with one of a half dozen different IM networks, Twitter, SMS and even voice.)

Best of all, if you’re interested in working on a project like this yourself, all of the source code for the Tropo scripting application that powers this demonstration is available on GitHub.

As more and more government begin to release geographic data in shapefile format, the opportunities to build useful applications will continue to grow.

With powerful tools like CouchDB, shp2geocouch and Tropo, developers will be limited only by their imaginations in how the use this data to make their communities better.

Get Your Node on with Tropo and Node.js

Thursday, December 9th, 2010

Node.js is a framework for writing server side JavaScript applications.

This video will provide an overview of how you can use Node.js, Tunnlr and the Tropo Node.js module to quickly and easy create powerful, sophisticated multi-channel communication applications.

Building communication apps in pure JavaScript has never been easier!

Cloud Awesomeness with Tropo and CouchDB

Wednesday, December 8th, 2010

One of the great things about Tropo is that it lets you run sophisticated communication applications in the cloud.

Tropo makes it easy to build multi-channel applications in the language of your choice and makes deployment and maintenance easy. We take care of all of the hard stuff.

But what if you want to build an application that stores information? Let’s say you want to create a survey application that sends out messages to registered users and asks them to provide the answer to a question. You’ll want to be able to store responses to your survey and examine the replies from users.

Since Tropo is a cloud communication platform, it pairs easily with other cloud infrastructures. This post will cover one way of pairing Tropo with a cloud-based instance of CouchDB.

Get on the Couch

You can get a cloud-based CouchDB instance over at CouchOne. Once you sign up and get your CouchDB, head on over to GitHub and grab the code for this simple survey application.

This application sends out a message on a specified channel and then saves the response to that question in a CouchDB instance. This example uses instant messaging as the channel, but you could easily tailor this script for other channels as well, like SMS.

Make note of the details of your CouchOne instance – make sure you modify the sample application code to use the details of your instance.

Cloud-Based Survey App

Once you get the code for this example, use it to set up an application in your Tropo account. If you want to use it as is (i.e., just using the IM channel), you’ll need to assign a Jabber IM address to your application – this is easy to do in the Tropo application settings.

Once you are ready to test, you’ll need to use one of your outbound tokens from your account. The following video demonstrates how to test the application, how to check CouchDB for new responses and how to monitor CouchDB for responses that come in from users over time (via the _changes API).

Because Tropo is a true cloud communication platform, you can use it in conjunction with other cloud-based infrastructures, like CouchDB from CouchOne.

Tropo + CouchDB = Cloud Communication Awesomeness!

Hacking Awesomeness in Baltimore

Sunday, November 21st, 2010

Tropo was in Charm City this weekend for the first Baltimore Hackathon, which took place at Beehive Baltimore – a co-working space in Baltimore’s Canton neighborhood.

This thoroughly awesome location was the appropriate setting for a get together of hardware and software hackers from around the Baltimore area to come together and bang out great ideas over the weekend.

As hackathons go, it was a really special event.

Not only was it the first hackathon in Baltimore, but it was somewhat unique in that it focused on both software development and hardware hacking as well. All of the developers in attendance were smart, passionate technologists; the location along Baltimore’s harbor was outstanding; the event was organized exceptionally well and ran smoothly; the food was great; even the beer was good.

Tropo was on hand as a sponsor of the event and also to lend a hand to developers that wanted to add phone, voice or SMS awesomeness to their apps. Tropo’s APIs were used in some really impressive projects during the event.

For example Brent Frederick of Baltimore built what he refers to as VoiceBump – an app that lets people call a phone number and create a blog post with Tropo’s recording and transcription services.

Another app – Call the Door by Mike Brenner – uses Tropo’s SMS service to unlock the door at the building where the event was held (locked doors can turn into something of a hindrance when your coding all night).

Tropo also provided a special award at the event – giving a prize to the devleoper of the app with the best use of our services. An update with the name of the winner (or winners) and a description of the project will be posted in the next day or two.

In the interim, here are some pictures from the event.

Update: all of the winners from the Baltimore Hackathon are now listed on the Startup Baltimore site. Congratulations to all the winners!

Baltimore Hackathon

Baltimore Hackathon

Baltimore Hackathon

Baltimore Hackathon

Saving the World with Tropo and Phono

Friday, November 12th, 2010

Without taking sides in the climate debate, I think most people would agree that the world would be a better place if our roads and highways were less crowded.

Everyone benefits when more people avail themselves of public transit options – less crowded roadways, cleaner air, shorter commutes…

Savvy transit agencies are starting to realize the potential of leveraging the growing ranks of civic coders to build helpful applications by releasing all of their fare, schedule and route information in open formats like GTFS. This let’s developers use public transit data to build sophisticated applications that give transit riders more options in how the consume transit services.

Tropo

On my personal blog – Vox Populi – I recently wrote a series of posts going step-by-step through the process of building a transit application using GTFS data released by my home state of Delaware, and using Apache, PHP and MySQL. That series culminated in a post on how to build an IM application for searching transit locations and route times using Tropo.

You can test out this Tropo application by adding findthebus@tropo.im to your contact list in any Jabber client and sending an address or stop number.

After completing my Tropo application, I wanted to take it a step further and give people the ability to query transit information with a tie back to a map. I also wanted to give people the ability to call the state transit agency with questions they might have about a particular transit stop (for example, some bus stops have a shelter and some don’t – some might be more conducive to handicapped access than others, etc.)

Ideally, I wanted to do this all within the context of a browser.

Enter Phono!

Phono is a jQuery plugin that makes it simple to add phone or IM functionality to a web page. It’s incredibly easy to use, open source, and is very powerful when paired with a complimentary Tropo application. Phono

My cross between Tropo, Phono and Google Maps is now working and can be viewed at findthebus.com.

This app is a mashup of Google Maps, my already existing Tropo application for Delaware transit locations and Phono. Since all of the Phono, Google Maps and jQuery pieces run in the client, there is no server-side logic need to make this application work. It’s all JavaScript.

The IM functionality added via Phono uses the same Tropo application I built in my previous series of blog posts. That piece is all PHP running on Apache with MySQL – 100% open source, 100% awesome!

If you want to give findthebus.com a try, keep in mind that the app is built using transit information specific to the State of Delaware. (However, if you want to build your own Tropo/Phono based transit apps with PHP, Apache and MySQL you can simply read my series and use the example code I provide.)

Give it a whirl with some notable Delaware addresses:

  • George Read House: 42 The Strand New Castle, DE 19720
  • Woodburn, the official residence of Delaware’s Governor: 151 Kings Highway, Dover, DE 19901
  • Dogfish Head Brewpub and Restaurant: 320 Rehoboth Avenue Rehoboth Beach, DE 19971

(For aspiring history buffs, George Read was one of the signers of the Declaration of Independence.)

One of the godfathers of the open data movement – Vivek Kundra, the CIO of the United States – has described the release of government data in open formats as the “democratization of public data.”

Tools like Tropo and Phono are examples of the democratization of application development – they make it easy for developers to do things that used to be very hard, and they add significant value to the apps that use them.

With tools like these and open data from forward looking governments and transit agencies, we truly can make the world a better place.

Or at least find the closest transit location to our favorite brewpub. ;-)

How to Add Phono and Tropo to CCXML

Thursday, November 4th, 2010

Dan York recently posted a really nice example of how to combine Phono – the new hotness in cloud telephony that turns any web browser into a phone – and good old fashioned enterprise-grade CCXML.

Dan’s piece inspired me to think about new ways to combine cloud telephony tools like Tropo and Phono with the bedrock of enterprise telephony – CCXML. Turns out, there are some very interesting and powerful combinations possible when you merge these different ways of building phone applications.

Connecting Phono to CCXML

Dan’s piece provided a nice summary of how use Phono as a web front-end to a CCXML application. The approach he describes is a great way to extend the reach of a CCXML application to a whole new group of users – those who are viewing your web site in a browser.

There is an equally exciting way of combining CCXML with the Tropo platform – using Tropo to send IM-based “screen pops” to service agents or others within your organization when a call comes in.

In the call center and customer service industries, screen pops are a way of providing notice to a customer service agent that a call is coming in. The actual content of a screen pop can range from simply displaying the caller ID of the incoming call, to actually pulling information out of a Customer Relationship Management (CRM) system about the caller to display it to the agent before they answer.

In this post, I want to show a simple example of how Tropo can be used to compliment CCXML applications to quickly and easily add screen pop capability. After we run through the details, I want to provide some additional insights on how both Phono and Tropo can be used to significantly enhance the power of enterprise CCXML.

A Simple Tropo Screen Pop Application

The first step in our example is to set up a very simple Tropo script that will send a screen pop message to the IM network and user of our choice. To keep things simple, we’ll use PHP for this example (but you could use any of the languages supported in Tropo Scripting to do this).

Here is the code for our example script:

<?php
message($screenPopMessage, 
	array( 'network'=>$network,'to'=>$sendTo));
?>

As you can see, this is a simple Tropo scripting application that does one thing – it sends an IM message to a user on a specified network. All of the variables in this script (everything preceded by a ‘$’) will be populated when we invoke it from CCXML.

For now, go to your Tropo account and set up a new Tropo Scripting application. Give your application a name, and when filling in the field “What URL powers your app?” select “Hosted File” and opt to create a new hosted file. Click “Create Application” when done.

Once this is done, you will notice your app has several different numbers automatically provisioned. Directly beneath that, you will see the Outbound Tokens provisioned for your new application. Make note of the token for messaging, as later you will need to copy it and paste it into your CCXML script.

The last step is to provision an instant messaging network for the application. This is the IM user that will send the screen pop when an incoming call is received in CCXML (i.e., the IM message will come appear to come from this user). To keep things simple, you can just set up a Jabber account using the tropo.im domain. If you do this, you can add the user you assign to your application to your buddy list in any Jabber client, including Google Chat.

Connecting Tropo to CCXML

In order to invoke our simple Tropo screen pop application, we need to make some changes to the CCXML introduced in the Dan’s post. Our revised CCXML looks like this:

<?xml version="1.0" encoding="UTF-8"?> 
<ccxml version="1.0" xmlns:voxeo="http://community.voxeo.com/xmlns/ccxml">

  <var name="inboundID"/> 
  <var name="outboundID"/> 
  <var name="initState" expr="'state1'" />

  <!-- Tropo API information -->
  <var name="tropoAPIToken" expr="'your-tropo-session-token'"/>
  <var name="tropoAPIEndPoint" expr="'http://api-internal.tropo.com/1.0/sessions?action=create&amp;token=' + tropoAPIToken"/>
  <var name="TropoSendURL"/>

  <var name="screenPopMessage" expr="encodeURIComponent('This is a screen pop!')"/>
  <!-- Any valid IM network name such as AIM, GTALK, MSN, JABBER, TWITTER and YAHOO. -->
  <var name="network" expr="'JABBER'"/>
  <var name="sendTo" expr="'your-im-user-name'"/>

  <eventprocessor statevariable="initState">

    <transition state="state1" event="connection.alerting"> 
      <log expr="'*** INBOUND CONNECTION ALERTING ***'"/> 
      <assign name="inboundID" expr="event$.connectionid" /> 
      <assign name="initState" expr="'state2'"/> 
      <assign name="TropoSendURL" expr="tropoAPIEndPoint + '&amp;screenPopMessage=' + screenPopMessage"/>
      <assign name="TropoSendURL" expr="TropoSendURL + '&amp;network=' + network"/>
      <assign name="TropoSendURL" expr="TropoSendURL + '&amp;sendTo=' + sendTo"/>
      <send name="'http.get'" target="TropoSendURL" targettype="'basichttp'"/>
    </transition>

    <transition event="send.successful" state="state2">
      <log expr="'*** Screen pop information sent to Tropo. Accept inbound call. ***'"/>   
      <assign name="initState" expr="'state3'"/>
      <accept connectionid="inboundID" /> 
    </transition>

    <transition event="error.send.failed" state="state2">
      <log expr="'*** ERROR: Could not send screen pop information. ***'"/>
      <assign name="initState" expr="'state3'"/>
      <accept connectionid="inboundID" /> 
    </transition>

    <transition state="state3" event="connection.connected"> 
      <assign name="initState" expr="'state4'"/> 
      <!-- 4079651112 is Voxeo Sales line -->
      <createcall dest="'tel:4079651112'" callerid="'1112223333'" connectionid="outboundID" timeout="'30s'"/> 
    </transition> 

    <transition state="state4" event="connection.progressing"> 
      <log expr="'*** CONNECTION.PROGRESSING ***'"/>  
      <assign name="initState" expr="'state5'"/> 
    </transition> 

    <transition state="state5" event="connection.connected"> 
      <assign name="initState" expr="'state6'"/> 
      <log expr="'*** CONNECTION.CONNECTED: INBOUND ***'"/>  
      <join id1="inboundID" id2="outboundID" duplex="'full'"/> 
    </transition> 

    <transition state="state6" event="conference.joined"> 
      <log expr="'*** CONFERENCE JOINED: INBOUND LEG TO OUTBOUND LEG ***'"/>  
    </transition> 

    <transition event="connection.disconnected"> 
      <log expr="'*** CONNECTION.DISCONNECTED ***'"/>  
      <exit/> 
    </transition> 

    <transition event="error.*">
      <log expr="'*** AN ERROR HAS OCCURED: ' + event$.reason  + ' ***'"/>
      <exit/>
    </transition>

  </eventprocessor> 
</ccxml>

You’ll notice a few differences from the CCXML example used in Dan’s piece. It includes a variable to hold a special URL to the Tropo Session API. There are also variables to hold the IM network and user that you want to send a screen pop to when a call comes into CCXML. Make sure you enter the details of the network on line 15 and the username on line 16 to whom you want to send the screen pop. Also, enter the messaging token from your Tropo application on line 9 in this CCXML script.

Set this script up in your Evolution account (as described in Dan’s post). Now, when a call comes into CCXML from Phono, the user that you have designated gets a screen pop with the value of the screenPopMessage variable in the CCXML script.

You can obviously change this message to anything you want, but it must be URL encoded before sending to the Tropo Session API.

<var name="screenPopMessage" 
       expr="encodeURIComponent('This is a screen pop!')"/>

Icing on the Cake!

Although this example is admittedly simple, coupled with Dan’s previous piece on connecting Phono to CCXML, it demonstrates how easy it is to augment CCXML with both Phono and Tropo. But that’s not all, it gets even better…

Phono allows developers to append information to a phone call, via the Phone API. in other words, before making a Phono call from your web page, you could add information to it via a header collection – this information could be obtained from prompting the user and getting input that way, or by examining what they did on a page (i.e., clicking a link). When the call connects to CCXML, this information is then available in standard SIP headers.

What this would let you do is to add inforamtion to a Phono call via client-side jQuery, and then use that inforamtion to craft the screen pop message in CCXML. This would allow you to customize the screen pop message to a customer service agent for each caller. You could even route calls differently based on the iformation added via Phono headers.

In addition, Tropo allows for the easy creation of IM applications (and other types of communication applications). In our simple example, we are just sending a message one way, from a CCXML script to a customer service agent through an instant message. But Tropo allows developers to build interactive IM applications. So with a little more work, we could create a screen pop application that asks an agent if they want to take an incoming call, send the call to another agent, or even send it to voice mail.

Because it’s possible to inject events into a running CCXML session, a Tropo application could control how a call is routed in CCXML based on an interaction with an agent. In this way it is possible to create more sophisticated, interactive screen pops using Tropo.

Hopefully, this post and the one it was inspired by give you a sense of how Phono and Tropo can compliment standards-based CCXML.

When it comes to getting more out of your CCXML applications, Phono and Tropo are the icing on the cake!

Heroku and Tropo Like Peanut Butter and Chocolate!

Tuesday, September 28th, 2010

Peanut butter and chocolate!

Who doesn’t love peanut butter and chocolate? By themselves, they are equally delicious but together, they are irresistible!

The same can now be said about Heroku and Tropo.  Heroku is the super simple cloud hosting platform for Ruby and Ruby on Rails web applications.  While Tropo is the super simple cloud hosting platform for communications applications including Voice, SMS, IM, and Twitter.

While Tropo works with any web programming language, we have been seeing more and more Ruby applications being developed using Tropo’s WebAPI. Traditionally deploying an application took just about as much time as actually writing the application.  This is no longer true with Heroku’s cloud hosting platform.

Deploying a Ruby application to Heroku is as simple as issuing the following commands from your terminal window:

> heroku create

> git push heroku master

Equally as simple to deploying your application to Heroku is writing your multi-channel communications application using Tropo like this hello world application that can be accessed via the telephone using Voice or SMS or via Instant Message or Twitter:

answer

say “Yes, Tropo is this easy!”

hangup

Now on to the how-to video and Heroku deployment instructions located at http://tropo.heroku.com!

Heroku & TropoTo demonstrate this yummy combination of technologies (Heroku and Tropo), Mark Silverberg (student and talented freelance Tropo developer) built a powerful Voice and IM application using Ruby and the Sinatra Framework and walks us through his 3.5 minute start-to-finish deployment of this application on the Heroku platform!

Mark’s multi-channel application is a volunteer finder service that provides information on volunteer opportunities in your zipcode.  The application can be accessed by calling +99000936 9991456957 via Skype or by IMing volunteer1234@tropo.im.  Mark’s Ruby code can be found on GitHub along with deployment instructions hosted on Heroku at http://warm-spring-38.heroku.com/

Now follow along with this video at http://tropo.heroku.com to learn how to build and deploy your next billion dollar idea using Heroku and Tropo!  Leveraging Heroku and Tropo gives you the best of advancements in cloud technology available today.  Heroku’s cloud technology allows you to scale your web application while Tropo’s cloud technology allows you to scale your communications applications.  These hybrid cloud technologies provide you, the web developer, with peace of mind and assurance that when your new application goes viral, we can easily scale to meet your demand.  Best of all, both cloud platforms offer free entry points to kick our tires and try us out.

So what are you waiting for?  Taste our peanut butter and chocolate now at Heroku and Tropo!

Customer Testimonials Make Everything Worth It!

Wednesday, September 22nd, 2010

Rolling out the red carpets for our customers

We receive many testimonials from customers who love our cloud communications services.  With each testimonial, you realize just how lucky you are to be part of an organization that is consistently hitting the mark customer by customer and sustaining growth based on our 24/7 customer service, ease-of-use, proven ability to scale, and our breadth of technologies.

Today we received an email from a customer using Tropo’s Voice and SMS API for their mission critical “FlightRecordAir” (as in Black Box) product, an On-Air audio automation system, AirForce(tm).   Tropo forms the notification component of a broadcast transmitter remote control and monitoring program.  The program monitors power output, various temperatures, currents and voltages and if any points fall above or below “warning” or “danger” setpoint levels, the application uses Tropo to begin calling a list of engineers until it reaches someone that can acknowledge the alarm and take action. Similarly, lesser warnings generate SMS text messages that are sent to another call list, and Tropo’s simple scripting structure allowed them to use the same code to send text messages and place voice calls.  This use case demonstrates the power of Tropo’s multi-modal capabilities!

Below is the testimonial quote from the Founder of MacroMedia, Inc., Tim Valley:

“Tropo is the right choice for us because it offers 24/7 support, very high reliability and repeatability, extensive error and status logging, and the implementation was painless and fast.  Security is transparent yet bulletproof.  It only took a couple of hours (from sign-up to fully functional) to build a relatively complex system with branching, parameters, voice recognition, calling and SMS.  Our implementation uses PHP scripts, hosted on our own site, along with a Delphi front-end.  No libraries or binaries needed to be installed on the server.”

Please continue to keep your feedback coming in to us.  We appreciate all the you help us become.

Sincerely, Team Tropo

What is Multi-modal?

Tuesday, May 18th, 2010

We’ve talked a bit about how text communications are on the rise, replacing a lot of the voice self service that companies have traditionally offered. Text doesn’t always replace voice, however. With platforms that can work over both voice and text, it’s possible for text to augment the voice channel.

Take the example of directory assistance. Back when I was a kid, you called directory assistance, gave a business name (to a real human!) and they gave you the phone number. You wrote down the number and gave the business a call. Over time, companies started offering a service where they’d transfer you to the number, letting you skip writing it down and dialing yourself. With mobile phones, this service became even more important, as you’re often calling for assistance when you can’t stop and write something down.

An issue sometimes arises, however, when the number is busy. Or you get disconnected and have to call back. Since you didn’t pick up the number from the directory assistance but were transferred by them, you end up having to call back, ask for the business again, and get transferred again.

Multi-modal to the rescue.

Imagine if your phone company didn’t just transfer you to the number, but also sent you a text message with the business name, number, and address. That’s a multimodal conversation. You start out communicating in one channel (voice) and end up finishing the conversation or getting supplementary information via another (text).

As an example of multimodal applications, I’ve updated our Tropo Local Search demo. If you call from a mobile phone and look up a restaurant, you’ll get a text message containing the contact information of the listing you selected. Give it a try by calling (415) 894-9965 and finding coffee, pizza, or some other type of food in your neighborhood. And of course, the code is available in our documentation or on Github.