home-assistant.github.io/components/alexa/index.html
2016-07-30 21:23:25 +00:00

472 lines
No EOL
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Alexa / Amazon Echo - Home Assistant</title>
<meta name="author" content="Home Assistant">
<meta name="description" content="Instructions how to connect Alexa/Amazon Echo to Home Assistant.">
<meta name="viewport" content="width=device-width">
<link rel="canonical" href="https://home-assistant.io/components/alexa/">
<meta property="fb:app_id" content="338291289691179">
<meta property="og:title" content="Alexa / Amazon Echo">
<meta property="og:site_name" content="Home Assistant">
<meta property="og:url" content="https://home-assistant.io/components/alexa/">
<meta property="og:type" content="article">
<meta property="og:description" content="Instructions how to connect Alexa/Amazon Echo to Home Assistant.">
<meta property="og:image" content="https://home-assistant.io/images/default-social.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@home_assistant">
<meta name="twitter:title" content="Alexa / Amazon Echo">
<meta name="twitter:description" content="Instructions how to connect Alexa/Amazon Echo to Home Assistant.">
<meta name="twitter:image" content="https://home-assistant.io/images/default-social.png">
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet">
<link href="/atom.xml" rel="alternate" title="Home Assistant" type="application/atom+xml">
<link rel='shortcut icon' href='/images/favicon.ico' />
<link rel='icon' type='image/png' href='/images/favicon-192x192.png' sizes='192x192' />
</head>
<body >
<header>
<div class="grid-wrapper">
<div class="grid">
<div class="grid__item three-tenths lap-two-sixths palm-one-whole ha-title">
<a href="/" class="site-title">
<img width='40' src='/demo/favicon-192x192.png'>
<span>Home Assistant</span>
</a>
</div>
<div class="grid__item seven-tenths lap-four-sixths palm-one-whole">
<nav>
<input type="checkbox" id="toggle">
<label for="toggle" class="toggle" data-open="Main Menu" data-close="Close Menu"></label>
<ul class="menu pull-right">
<li><a href='/getting-started/'>Getting started</a></li>
<li><a href='/components/'>Components</a></li>
<li><a href='/cookbook/'>Examples</a></li>
<li><a href="/developers/">Developers</a></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/help/">Need help?</a></li>
</ul>
</nav>
</div>
</div>
</div>
</header>
<div class="grid-wrapper">
<div class="grid grid-center">
<div class="grid__item two-thirds lap-one-whole palm-one-whole">
<article class="page">
<header>
<h1 class="title indent">
Alexa / Amazon Echo
</h1>
</header>
<hr class="divider">
<p>There are two ways that you can use Amazon Echo and Home Assistant together.</p>
<p>No matter which method(s) you decide to use, please remember that Amazon Echo requires an active Internet connection to function. If your Internet is down or experiencing issues (or Amazons infrastructure is having issues), neither of these methods will work.</p>
<p>Amazon has released <a href="https://echosim.io/">Echosim</a>, a website that simulates the Alexa service in your browser. That way it is easy to test your skills without having access to a physical Amazon Echo.</p>
<h3><a class="title-link" name="i-just-want-to-turn-devices-on-and-off-using-echo" href="#i-just-want-to-turn-devices-on-and-off-using-echo"></a> I just want to turn devices on and off using Echo</h3>
<p>If you just want to be able to turn anything with a switch (like lights, switches, media players, etc) on and off, check out Michael Auchters <a href="https://github.com/auchter/haaska">Haaska</a> which integrates the <a href="https://developer.amazon.com/public/binaries/content/assets/html/alexa-lighting-api.html">Alexa Lighting API</a> into Home Assistant.</p>
<p>Implementing Haaska means you can turn things on and off by simply saying</p>
<blockquote>
<p>Alexa, turn the living room lights on.</p>
</blockquote>
<p>or</p>
<blockquote>
<p>Alexa, set the living room lights to twenty percent.</p>
</blockquote>
<p>instead of</p>
<blockquote>
<p>Alexa, tell Home Assistant to turn the living room lights on.</p>
</blockquote>
<p>or</p>
<blockquote>
<p>Alexa, tell Home Assistant to set the living room lights to twenty percent.</p>
</blockquote>
<p>In addition, you would need to build custom intents for each device and on/off combination using the below method, whereas everything just works without any extra work by using Haaska.</p>
<p>Please note that you can use Haaska and the built-in Alexa component side-by-side without issue if you wish.</p>
<h3><a class="title-link" name="i-want-to-build-custom-commands-to-use-with-echo" href="#i-want-to-build-custom-commands-to-use-with-echo"></a> I want to build custom commands to use with Echo</h3>
<p>The built-in Alexa component allows you to integrate Home Assistant into Alexa/Amazon Echo. This component will allow you to query information and call services within Home Assistant by using your voice. Home Assistant offers no built-in sentences but offers a framework for you to define your own.</p>
<div class="videoWrapper">
<iframe width="560" height="315" src="https://www.youtube.com/embed/1Ke3mtWd_cQ" frameborder="0" allowfullscreen=""></iframe>
</div>
<h4><a class="title-link" name="requirements-before-using" href="#requirements-before-using"></a> Requirements before using</h4>
<p>Amazon requires the endpoint of a skill to be hosted via SSL. Self-signed certificates are ok because our skills will only run in development mode. Read more on <a href="https://home-assistant.io/blog/2015/12/13/setup-encryption-using-lets-encrypt/">our blog</a> about how to set up encryption for Home Assistant. If you are unable to get HTTPS up and running, consider using <a href="https://forums.developer.amazon.com/forums/thread.jspa?messageID=18604">this AWS Lambda proxy for Alexa skills</a>.</p>
<p>To get started with Alexa skills:</p>
<ul>
<li>Log in to <a href="https://developer.amazon.com">Amazon developer console</a></li>
<li>Go to Apps &amp; Services =&gt; Alexa =&gt; Alexa Skill Kit - Get Started</li>
<li>Add a new skill
<ul>
<li>Name: Home Assistant</li>
<li>Invocation name: home assistant (or be creative, up to you)</li>
<li>Version: 1.0</li>
<li>Endpoint:
<ul>
<li>https</li>
<li>https://YOUR_HOST/api/alexa?api_password=YOUR_API_PASSWORD</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4><a class="title-link" name="configuring-your-amazon-alexa-skill" href="#configuring-your-amazon-alexa-skill"></a> Configuring your Amazon Alexa skill</h4>
<p>Alexa works based on intents. Each intent has a name and variable slots. For example, a <code>LocateIntent</code> with a slot that contains a <code>User</code>. Example intent schema:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>{
<span class="key"><span class="delimiter">&quot;</span><span class="content">intents</span><span class="delimiter">&quot;</span></span>: [
{
<span class="key"><span class="delimiter">&quot;</span><span class="content">intent</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">LocateIntent</span><span class="delimiter">&quot;</span></span>,
<span class="key"><span class="delimiter">&quot;</span><span class="content">slots</span><span class="delimiter">&quot;</span></span>: [
{
<span class="key"><span class="delimiter">&quot;</span><span class="content">name</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">User</span><span class="delimiter">&quot;</span></span>,
<span class="key"><span class="delimiter">&quot;</span><span class="content">type</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">AMAZON.US_FIRST_NAME</span><span class="delimiter">&quot;</span></span>
}]
},
{
<span class="key"><span class="delimiter">&quot;</span><span class="content">intent</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">WhereAreWeIntent</span><span class="delimiter">&quot;</span></span>,
<span class="key"><span class="delimiter">&quot;</span><span class="content">slots</span><span class="delimiter">&quot;</span></span>: []
}
]
}
</pre></div>
</div>
</div>
<p>To bind these intents to sentences said by users you define utterances. Example utterances can look like this:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>LocateIntent Where is {User}
LocateIntent Where's {User}
LocateIntent Where {User} is
LocateIntent Where did {User} go
WhereAreWeIntent where we are
</pre></div>
</div>
</div>
<p>This means that we can now ask Alexa things like:</p>
<ul>
<li>Alexa, ask Home Assistant where Paul is</li>
<li>Alexa, ask Home Assistant where we are</li>
</ul>
<h3><a class="title-link" name="configuring-home-assistant" href="#configuring-home-assistant"></a> Configuring Home Assistant</h3>
<p>Out of the box, the component will do nothing. You have to teach it about all intents you want it to answer to. The way it works is that the answer for each intent is based on <a href="/topics/templating/">templates</a> that you define. Each template will have access to the existing states via the <code>states</code> variable but will also have access to all variables defined in the intent.</p>
<p>You can use <a href="/topics/templating/">templates</a> for the values of <code>speech/text</code>, <code>card/title</code> and <code>card/content</code>.</p>
<p>Actions are using the <a href="/getting-started/scripts/">Home Assistant Script Syntax</a> and also have access to the variables from the intent.</p>
<p>Configuring the Alexa component for the above intents would look like this:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>
<span class="comment"># Example configuration.yaml entry</span>
<span class="key">alexa</span>:
<span class="key">intents</span>:
<span class="key">WhereAreWeIntent</span>:
<span class="key">speech</span>:
<span class="key">type</span>: <span class="string"><span class="content">plaintext</span></span>
<span class="key">text</span>: <span class="string"><span class="delimiter">&gt;</span><span class="content">
{%- if is_state('device_tracker.paulus', 'home') and
is_state('device_tracker.anne_therese', 'home') -%}
You are both home, you silly
{%- else -%}
Anne Therese is at {{ states(&quot;device_tracker.anne_therese&quot;) }} and
Paulus is at {{ states(&quot;device_tracker.paulus&quot;) }}
{% endif %}</span></span>
<span class="key">LocateIntent</span>:
<span class="key">action</span>:
<span class="key">service</span>: <span class="string"><span class="content">notify.notify</span></span>
<span class="key">data_template</span>:
<span class="key">message</span>: <span class="string"><span class="content">The location of {{ User }} has been queried via Alexa.</span></span>
<span class="key">speech</span>:
<span class="key">type</span>: <span class="string"><span class="content">plaintext</span></span>
<span class="key">text</span>: <span class="string"><span class="delimiter">&gt;</span><span class="content">
{%- for state in states.device_tracker -%}
{%- if state.name.lower() == User.lower() -%}
{{ state.name }} is at {{ state.state }}
{%- endif -%}
{%- else -%}
I am sorry, I do not know where {{ User }} is.
{%- endfor -%}</span></span>
<span class="key">card</span>:
<span class="key">type</span>: <span class="string"><span class="content">simple</span></span>
<span class="key">title</span>: <span class="string"><span class="content">Sample title</span></span>
<span class="key">content</span>: <span class="string"><span class="content">Some more content</span></span>
</pre></div>
</div>
</div>
<h3><a class="title-link" name="working-with-scenes" href="#working-with-scenes"></a> Working With Scenes</h3>
<p>One of the more useful applications of Alexa integrations is to call scenes directly. This is easily achieved with some simple setup on the Home Assistant side and by letting Alexa know which scenes you want to run.</p>
<p>First we will configure Alexa. In the Amazon Interaction module add this to the intent schema:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>{
<span class="key"><span class="delimiter">&quot;</span><span class="content">intent</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">ActivateSceneIntent</span><span class="delimiter">&quot;</span></span>,
<span class="key"><span class="delimiter">&quot;</span><span class="content">slots</span><span class="delimiter">&quot;</span></span>:
[
{
<span class="key"><span class="delimiter">&quot;</span><span class="content">name</span><span class="delimiter">&quot;</span></span> : <span class="string"><span class="delimiter">&quot;</span><span class="content">Scene</span><span class="delimiter">&quot;</span></span>,
<span class="key"><span class="delimiter">&quot;</span><span class="content">type</span><span class="delimiter">&quot;</span></span> : <span class="string"><span class="delimiter">&quot;</span><span class="content">Scenes</span><span class="delimiter">&quot;</span></span>
}
]
}
</pre></div>
</div>
</div>
<p>Then create a custom slot type called <code>Scenes</code> listing every scene you want to control:</p>
<p class="img">
<img src="/images/components/alexa/scene_slot.png" />
Custom slot type for scene support.
</p>
<p>The names must exactly match the scene names (minus underscores - amazon discards them anyway and we later map them back in with the template).</p>
<p>Add a sample utterance:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>ActivateSceneIntent activate {Scene}
</pre></div>
</div>
</div>
<p>Then add the intent to your Alexa Section in your HA config file:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>
<span class="key">ActivateSceneIntent</span>:
<span class="key">action</span>:
<span class="key">service</span>: <span class="string"><span class="content">scene.turn_on</span></span>
<span class="key">data_template</span>:
<span class="key">entity_id</span>: <span class="string"><span class="content">scene.{{ Scene | replace(&quot; &quot;, &quot;_&quot;) }}</span></span>
<span class="key">speech</span>:
<span class="key">type</span>: <span class="string"><span class="content">plaintext</span></span>
<span class="key">text</span>: <span class="string"><span class="content">OK</span></span>
</pre></div>
</div>
</div>
<p>Here we are using <a href="/topics/templating/">templates</a> to take the name we gave to Alexa e.g. <code>downstairs on</code> and replace the space with an underscore so it becomes <code>downstairs_on</code> as Home Assistant expects.</p>
<p>Now say <code>Alexa ask homeassistant to activate &lt;some scene&gt;</code> and Alexa will activate that scene for you.</p>
<h3><a class="title-link" name="adding-scripts" href="#adding-scripts"></a> Adding Scripts</h3>
<p>We can easily extend the above idea to work with scripts as well. As before, add an intent for scripts:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>{
<span class="key"><span class="delimiter">&quot;</span><span class="content">intent</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">RunScriptIntent</span><span class="delimiter">&quot;</span></span>,
<span class="key"><span class="delimiter">&quot;</span><span class="content">slots</span><span class="delimiter">&quot;</span></span>:
[
{
<span class="key"><span class="delimiter">&quot;</span><span class="content">name</span><span class="delimiter">&quot;</span></span> : <span class="string"><span class="delimiter">&quot;</span><span class="content">Script</span><span class="delimiter">&quot;</span></span>,
<span class="key"><span class="delimiter">&quot;</span><span class="content">type</span><span class="delimiter">&quot;</span></span> : <span class="string"><span class="delimiter">&quot;</span><span class="content">Scripts</span><span class="delimiter">&quot;</span></span>
}
]
}
</pre></div>
</div>
</div>
<p>Create a custom slot type called <code>Scripts</code> listing every script you want to run:</p>
<p class="img">
<img src="/images/components/alexa/script_slot.png" />
Custom slot type for script support.
</p>
<p>Add a sample utterance:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>RunScriptIntent run {Script}
</pre></div>
</div>
</div>
<p>Then add the intent to your Alexa Section in your HA config file:</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>
<span class="key">RunScriptIntent</span>:
<span class="key">action</span>:
<span class="key">service</span>: <span class="string"><span class="content">script.turn_on</span></span>
<span class="key">data_template</span>:
<span class="key">entity_id</span>: <span class="string"><span class="content">script.{{ Script | replace(&quot; &quot;, &quot;_&quot;) }}</span></span>
<span class="key">speech</span>:
<span class="key">type</span>: <span class="string"><span class="content">plaintext</span></span>
<span class="key">text</span>: <span class="string"><span class="content">OK</span></span>
</pre></div>
</div>
</div>
<p>Now say <code>Alexa ask homeassistant to run &lt;some script&gt;</code> and Alexa will run that script for you.</p>
<h3><a class="title-link" name="giving-alexa-some-personality" href="#giving-alexa-some-personality"></a> Giving Alexa Some Personality</h3>
<p>In the examples above, we told Alexa to say <code>OK</code> when she succesfully completed the task. This is effective but a little dull! We can again use <a href="/topics/templating/">templates</a> to spice things up a little.</p>
<p>First create a file called <code>alexa_confirm.yaml</code> with something like the following in it (go on, be creative!):</p>
<div class="highlighter-coderay"><div class="CodeRay">
<div class="code"><pre>
&gt;
{{ [
&quot;OK&quot;,
&quot;Sure&quot;,
&quot;If you insist&quot;,
&quot;Done&quot;,
&quot;No worries&quot;,
&quot;I can do that&quot;,
&quot;Leave it to me&quot;,
&quot;Consider it done&quot;,
&quot;As you wish&quot;,
&quot;By your command&quot;,
&quot;Affirmative&quot;,
&quot;Yes oh revered one&quot;,
&quot;I will&quot;,
&quot;As you decree, so shall it be&quot;,
&quot;No Problem&quot;
] | random }}
</pre></div>
</div>
</div>
<p>Then, wherever you would but some simple text for a response like<code>OK</code>, replace it with a reference to the file so that:</p>
<pre><code>text: OK
</code></pre>
<p>becomes:</p>
<pre><code>text: !include alexa_confirm.yaml
</code></pre>
<p>Alexa will now respond with a random phrase each time. You can use the include for as many different intents as you like so you only need to create the list once.</p>
</article>
</div>
<aside id="sidebar" class="grid__item one-third lap-one-whole palm-one-whole">
<div class="grid">
<section class="aside-module grid__item one-whole lap-one-half">
<div class='edit-github'><a href='https://github.com/home-assistant/home-assistant.io/tree/master/source/_components/alexa.markdown'>Edit this page on GitHub</a></div>
<div class='brand-logo-container section'>
<img src='/images/supported_brands/amazon-echo.png' />
</div>
<div class='section'>
<h1 class="title delta">Category Voice</h1>
<ul class='divided'>
<li>
Alexa / Amazon Echo
</li>
<li>
<a href='/components/conversation/'>Conversation</a>
</li>
</ul>
</div>
</section>
</div>
</aside>
</div>
</div>
<footer>
<div class="grid-wrapper">
<div class="grid">
<div class="grid__item">
<div class="copyright">
<a rel="me" href='https://twitter.com/home_assistant'><i class="icon-twitter"></i></a>
<a rel="me" href='https://facebook.com/homeassistantio'><i class="icon-facebook"></i></a>
<a rel="me" href='https://plus.google.com/110560654828510104551'><i class="icon-google-plus"></i></a>
<a rel="me" href='https://github.com/home-assistant/home-assistant'><i class="icon-github"></i></a>
<div class="credit">
Contact us at <a href='mailto:hello@home-assistant.io'>hello@home-assistant.io</a>.<br>
Website powered by <a href='http://jekyllrb.com/'>Jekyll</a> and the <a href='https://github.com/coogie/oscailte'>Oscalite theme</a>.<br />
Hosted by <a href='https://pages.github.com/'>GitHub</a> and served by <a href='https://cloudflare.com'>CloudFlare</a>.
</div>
</div>
</div>
</div>
</div>
</footer>
<script>
var _gaq=[['_setAccount','UA-57927901-1'],['_trackPageview']];
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
s.parentNode.insertBefore(g,s)}(document,'script'));
</script>
</body>
</html>