Site updated at 2017-05-14 00:58:19 UTC

This commit is contained in:
Travis CI 2017-05-14 00:58:19 +00:00
parent 75aa88c06d
commit d228062eac
82 changed files with 1528 additions and 170 deletions

View file

@ -131,15 +131,7 @@ A great place to find popular configurations is on this <a href="https://github.
</ul>
<h3><a class="title-link" name="custom-python-component-examples" href="#custom-python-component-examples"></a> Custom Python Component Examples</h3>
<ul>
<li>
<p><a href="/cookbook/python_component_mqtt_basic/">Basic MQTT Example</a></p>
</li>
<li>
<p><a href="/cookbook/python_component_basic_service/">Basic Service Example</a></p>
</li>
<li>
<p><a href="/cookbook/python_component_basic_state/">Basic State Setting Example</a></p>
</li>
<li><a href="/cookbook/python_component_mqtt_basic/">Basic MQTT Example</a></li>
</ul>
<h3><a class="title-link" name="example-configurationyaml" href="#example-configurationyaml"></a> Example configuration.yaml</h3>
<ul>

View file

@ -1,160 +0,0 @@
<!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>Basic Service Example - Home Assistant</title>
<meta name="author" content="Home Assistant">
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<link rel="canonical" href="https://home-assistant.io/cookbook/python_component_basic_service/">
<meta property="fb:app_id" content="338291289691179">
<meta property="og:title" content="Basic Service Example">
<meta property="og:site_name" content="Home Assistant">
<meta property="og:url" content="https://home-assistant.io/cookbook/python_component_basic_service/">
<meta property="og:type" content="article">
<meta property="og:description" content="">
<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="Basic Service Example">
<meta name="twitter:description" content="">
<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="/docs/">Docs</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">
Basic Service Example
</h1>
</header>
<hr class="divider">
<p>This is a simple “hello world” example to show the basics of registering a service. To use this example, create the file <code class="highlighter-rouge">&lt;config dir&gt;/custom_components/hello_service.py</code> and copy the below example code.</p>
<p>Services can be called from automation and from the service “Developer tools” in the frontend.</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="c"># The domain of your component. Should be equal to the name of your component.</span>
<span class="n">DOMAIN</span> <span class="o">=</span> <span class="s">'hello_service'</span>
<span class="n">ATTR_NAME</span> <span class="o">=</span> <span class="s">'name'</span>
<span class="n">DEFAULT_NAME</span> <span class="o">=</span> <span class="s">'World'</span>
<span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="n">hass</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
<span class="s">"""Set up is called when Home Assistant is loading our component."""</span>
<span class="k">def</span> <span class="nf">handle_hello</span><span class="p">(</span><span class="n">call</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">call</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ATTR_NAME</span><span class="p">,</span> <span class="n">DEFAULT_NAME</span><span class="p">)</span>
<span class="n">hass</span><span class="o">.</span><span class="n">states</span><span class="o">.</span><span class="nb">set</span><span class="p">(</span><span class="s">'hello_service.hello'</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="n">hass</span><span class="o">.</span><span class="n">services</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">DOMAIN</span><span class="p">,</span> <span class="s">'hello'</span><span class="p">,</span> <span class="n">handle_hello</span><span class="p">)</span>
<span class="c"># Return boolean to indicate that initialization was successfully.</span>
<span class="k">return</span> <span class="bp">True</span>
</code></pre>
</div>
<p>Load the component by adding the following to your <code class="highlighter-rouge">configuration.yaml</code>. When your component is loaded, a new service should be available to call.</p>
<div class="language-yaml highlighter-rouge"><pre class="highlight"><code><span class="c1"># configuration.yaml entry</span>
<span class="s">hello_service</span><span class="pi">:</span>
</code></pre>
</div>
<p>Open the frontend and in the sidebar, click the first icon in the developer tool section. This will open the Call Service developer tool. On the right, find your service and click on it. This will automatically fill in the correct values.</p>
<p>Pressing “Call Service” will now call your service without any parameters. This will cause your service to create a state with the default name World. If you want to specify the name, you have to specify parameters. Add the following JSON as Service Data and press “Call Service again”.</p>
<div class="language-json highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Planet"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>
</div>
<p>The service will now overwrite the previous state with “Planet”.</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.github.io/tree/current/source/_cookbook/python_component_basic_service.markdown'>Edit this page on GitHub</a></div>
<div class='section'>
<a href='/cookbook'>Back to the cookbook</a>
</div>
<div class='section'>
<h1 class="title delta">Custom Python Component Examples</h1>
<ul class='divided'>
<li>
<a href='/cookbook/python_component_mqtt_basic/'>Basic MQTT Example</a>
</li>
<li>
Basic Service Example
</li>
<li>
<a href='/cookbook/python_component_basic_state/'>Basic State Setting Example</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> (no support!).<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>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">home-assistant.io</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
</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>

View file

@ -1,218 +0,0 @@
<!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>Basic State Setting Example - Home Assistant</title>
<meta name="author" content="Home Assistant">
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<link rel="canonical" href="https://home-assistant.io/cookbook/python_component_basic_state/">
<meta property="fb:app_id" content="338291289691179">
<meta property="og:title" content="Basic State Setting Example">
<meta property="og:site_name" content="Home Assistant">
<meta property="og:url" content="https://home-assistant.io/cookbook/python_component_basic_state/">
<meta property="og:type" content="article">
<meta property="og:description" content="">
<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="Basic State Setting Example">
<meta name="twitter:description" content="">
<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="/docs/">Docs</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">
Basic State Setting Example
</h1>
</header>
<hr class="divider">
<p>This is a simple tutorial/example on how to write a component for <a href="https://home-assistant.io/">Home Assistant</a>. We will work on a component called “hello_state” to begin with. The purpose of this component is to display a given text in the frontend.</p>
<p>The setup of a development environment is described in the <a href="/developers/#starting-development">Developers section</a> of the documentation.</p>
<h2><a class="title-link" name="component" href="#component"></a> Component</h2>
<p>To get started, create the file <code class="highlighter-rouge">&lt;config dir&gt;/custom_components/hello_state.py</code> and copy the below example code.</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="s">"""
Support for showing text in the frontend.
For more details about this component, please refer to the documentation at
https://home-assistant.io/cookbook/python_component_basic_state/
"""</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="n">_LOGGER</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
<span class="n">DOMAIN</span> <span class="o">=</span> <span class="s">'hello_state'</span>
<span class="n">DEPENDENCIES</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="n">hass</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="s">"""Setup the Hello State component. """</span>
<span class="n">_LOGGER</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">"The 'hello state' component is ready!"</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">True</span>
</code></pre>
</div>
<ol>
<li>In the file header we decided to add some details: A short description and the link to the documentation.</li>
<li>We want to do some logging. This means that we import the Python logging module and create an alias.</li>
<li>The component name is equal to the domain name.</li>
<li>At the moment this component has no dependencies. For detail check <a href="/developers/creating_components/#dependencies">dependencies</a> section.</li>
<li>
<p>The <code class="highlighter-rouge">setup</code> function will take care of the initialization of our component.
The component will only write a log message. Keep in mind for later that you have several options for the severity:</p>
<ul>
<li><code class="highlighter-rouge">_LOGGER.info(msg)</code></li>
<li><code class="highlighter-rouge">_LOGGER.warning(msg)</code></li>
<li><code class="highlighter-rouge">_LOGGER.error(msg)</code></li>
<li><code class="highlighter-rouge">_LOGGER.critical(msg)</code></li>
<li><code class="highlighter-rouge">_LOGGER.exception(msg)</code></li>
</ul>
</li>
<li>We return <code class="highlighter-rouge">True</code> if everything is ok.</li>
</ol>
<p>Add the component to your <code class="highlighter-rouge">configuration.yaml</code> file.</p>
<div class="language-yaml highlighter-rouge"><pre class="highlight"><code><span class="s">hello_state</span><span class="pi">:</span>
</code></pre>
</div>
<p>After a start or a restart of Home Assistant the component will create an entry in the log.</p>
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>16-03-12 14:16:42 INFO <span class="o">(</span>MainThread<span class="o">)</span> <span class="o">[</span>custom_components.hello_state] The <span class="s1">'hello state'</span> component is ready!
</code></pre>
</div>
<p>The next step is the introduction of configuration options. Most configuration details are coming out of the <code class="highlighter-rouge">configuration.yaml</code> file. To do that we need to update the <code class="highlighter-rouge">def setup()</code> method to accept configuration information and access the configuration variable in the <code class="highlighter-rouge">setup</code> method.</p>
<p>More details about this topic can be found in the <a href="/developers/creating_components/#config-user-given-configuration">User given configuration</a> section.</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">logging</span>
<span class="n">_LOGGER</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
<span class="n">DOMAIN</span> <span class="o">=</span> <span class="s">'hello_state'</span>
<span class="n">DEPENDENCIES</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">CONF_TEXT</span> <span class="o">=</span> <span class="s">'text'</span>
<span class="n">DEFAULT_TEXT</span> <span class="o">=</span> <span class="s">'No text!'</span>
<span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="n">hass</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
<span class="s">"""Set up the Hello State component. """</span>
<span class="c"># Get the text from the configuration. Use DEFAULT_TEXT if no name is provided.</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="n">DOMAIN</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">CONF_TEXT</span><span class="p">,</span> <span class="n">DEFAULT_TEXT</span><span class="p">)</span>
<span class="c"># States are in the format DOMAIN.OBJECT_ID</span>
<span class="n">hass</span><span class="o">.</span><span class="n">states</span><span class="o">.</span><span class="nb">set</span><span class="p">(</span><span class="s">'hello_state.Hello_State'</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">True</span>
</code></pre>
</div>
<p>To add the latest feature of our component, update the entry in your <code class="highlighter-rouge">configuration.yaml</code> file.</p>
<div class="language-yaml highlighter-rouge"><pre class="highlight"><code><span class="s">hello_state</span><span class="pi">:</span>
<span class="s">text</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Hello,</span><span class="nv"> </span><span class="s">World!'</span>
</code></pre>
</div>
<p>Thanks to <code class="highlighter-rouge">DEFAULT_TEXT</code> variable the component will launch even if no <code class="highlighter-rouge">text:</code> field is used in the <code class="highlighter-rouge">configuration.yaml</code> file. Quite often there are variables which are required. Its important to check if all mandatory configuration variables are provided. If not, the setup should fail. We will use <code class="highlighter-rouge">voluptuous</code> as a helper to achive this. The next listing shows the essential parts.</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">voluptuous</span> <span class="kn">as</span> <span class="nn">vol</span>
<span class="kn">import</span> <span class="nn">homeassistant.helpers.config_validation</span> <span class="kn">as</span> <span class="nn">cv</span>
<span class="p">[</span><span class="o">...</span><span class="p">]</span>
<span class="n">PLATFORM_SCHEMA</span> <span class="o">=</span> <span class="n">PLATFORM_SCHEMA</span><span class="o">.</span><span class="n">extend</span><span class="p">({</span>
<span class="n">vol</span><span class="o">.</span><span class="n">Required</span><span class="p">(</span><span class="n">CONF_TEXT</span><span class="p">):</span> <span class="n">cv</span><span class="o">.</span><span class="n">string</span><span class="p">,</span>
<span class="p">})</span>
</code></pre>
</div>
<p>If <code class="highlighter-rouge">text:</code> is missing, there will be a warning in the log file.</p>
<p>After a start or a restart of Home Assistant the component will be visible in the frontend if the <code class="highlighter-rouge">configuration.yaml</code> file is up-to-date.</p>
<p class="img">
<img src="/images/screenshots/create-component01.png" />
</p>
<p>To get your component included in the Home Assistant releases, follow the steps described in the <a href="https://home-assistant.io/developers/#submitting-improvements">Submitting improvements</a> section. Basically you only need to move your component in the <code class="highlighter-rouge">homeassistant/component/</code> directory of your fork and create a Pull Request.</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.github.io/tree/current/source/_cookbook/python_component_basic_state.markdown'>Edit this page on GitHub</a></div>
<div class='section'>
<a href='/cookbook'>Back to the cookbook</a>
</div>
<div class='section'>
<h1 class="title delta">Custom Python Component Examples</h1>
<ul class='divided'>
<li>
<a href='/cookbook/python_component_mqtt_basic/'>Basic MQTT Example</a>
</li>
<li>
<a href='/cookbook/python_component_basic_service/'>Basic Service Example</a>
</li>
<li>
Basic State Setting Example
</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> (no support!).<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>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">home-assistant.io</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
</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>

View file

@ -140,12 +140,6 @@ This example requires you to have the <a href="/components/mqtt/">MQTT component
<li>
Basic MQTT Example
</li>
<li>
<a href='/cookbook/python_component_basic_service/'>Basic Service Example</a>
</li>
<li>
<a href='/cookbook/python_component_basic_state/'>Basic State Setting Example</a>
</li>
</ul>
</div>
</section>