Alexa, ask home theater to put on Mr. Robot

Plex for Alexa

Recently, I have started playing around with Alexa skill services. I currently use plex for my media content and found a project on github that has built an alexa skill already. (thanks to @overloadut)

https://overloadut.github.io/alexa-plex/

As a pet project, I decided to get this up and running.

Below I will go into detail on the steps involved.

Process

Alexa flow

Prerequisites

  • Plex media server running
  • AWS account
  • Plex Home theater (PHT) client
  • Have basic knowledge of aws services, nodeJS and setting IAM roles.
  • Enable remote access for Plex

Locally

Install node, npm and git

Clone the github repo https://github.com/OverloadUT/alexa-plex

Run

npm install  

to install dependencies Create a .env file in project root with similar properties as below:

APP_PRODUCT=Alexa Plex  
APP_VERSION=2.0  
APP_DEVICE=Amazon Echo  
APP_DEVICE_NAME=Alexa  
APP_IDENTIFIER=  
ALEXA_APP_ID=  
AWS_ACCESS_KEY_ID=<your own key>  
AWS_SECRET_ACCESS_KEY=<your own secret key>  

There is a deploy script at the root of the project. Before you run this and update your lambda function, you need to first create it.

AWS Lambda

Create IAM role that has access to lambda and to dynamodb.

If you have aws cli setup try the sample script below.
NB: Make sure and change the role val.

aws lambda create-function --function-name alexa-plex --region us-east-1 --runtime  nodejs4.3 --role arn:aws:iam::xxxxxx:role/lambda_basic_execution --handler  index.handler  

Verify you can view the lambda function in the aws console.

Change to trigger to be "Alexa skills kit".

DynamoDB

Create a table named AlexaPlexUsers with a primary string key of userid.

Create alexa skill

Navigate to Amazon Developer Portal to begin the Alexa Skill process.

Sign In >> Alexa >> Alexa Skills Kit >> Add new skill

Skill Information

Fill in the Alexa Skill store details. Define the invocation name as home theater.

Interaction Model

This will setup what commands "Plex" can process. The sample utterances enable Alexa to process a variety of phrases for the same interaction.

Copy in the intent schema, sample utterances and custom slot. The files are located under directory ask_configuration.

Configuration

You'll want to fill in your Lambda ARN here.
Set Account Linking to No.

Test

Now the fun part... 😛

Use the service simulator to test it out.

You'll need to link Alexa to your Plex account. Open your web browser to http://plex.tv/link and ask Alexa:

"Alexa, tell home theater to continue setup"

Alexa will guide you through the steps to link your account. Simply keep saying that same command and it should move to the next step.

Once all is good, try playing a tv show

"Alexa, tell home theater to play Mr. Robot"

Troubleshooting

  • If you receive no response from lambda function, make sure you increase the timeout greater than ten seconds.

  • Any errors in the function, review the cloudwatch logs.

  • I had an issue where the default player was Plex Web for Chrome and not my Rasplex. So I needed to change this entry in the dynamodb table.
    You will see there is a player object. You need to change the machine identifier to the client that is running plex home theater. How you find that out, is by logging into plex.tv, launching the webapp and inspecting the network requests.
    You can do this in Chrome by launching developer tools. You will see a XHR request similar to https://plex.tv/devices.xml. If you review the response you will find the client identifier value for the device you need. For me it was rasplex.

Versions

  • PMS Version 1.0.3.2461
  • Rasplex Version 1.6.2.123-e23a7eef

TODO Add in video showing how it plays