home-assistant.github.io/cookbook/python_component_mqtt_basic/index.html
2017-10-21 23:33:53 +00:00

205 lines
12 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>Basic MQTT 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_mqtt_basic/">
<meta property="fb:app_id" content="338291289691179">
<meta property="og:title" content="Basic MQTT Example">
<meta property="og:site_name" content="Home Assistant">
<meta property="og:url" content="https://home-assistant.io/cookbook/python_component_mqtt_basic/">
<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 MQTT 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, print" 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 class='site-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>
<li><a href='#' class='show-search'><i class="icon-search"></i></a></li>
</ul>
</nav>
<div class='search-container' style='display: none'>
<div class='search'>
<i class="icon-search"></i>
<input id='search' placeholder='Search the docs…'>
<a href='#' class='close'><i class="icon-remove-sign"></i></a>
</div>
</div>
</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 MQTT Example
</h1>
</header>
<hr class="divider">
<p class="note">
This example requires you to have the <a href="/components/mqtt/">MQTT component</a> up and running.
</p>
<p>This is a simple hello world example to show the basics of using MQTT in a custom component. To use this example, create the file <code class="highlighter-rouge">&lt;config dir&gt;/custom_components/hello_mqtt.py</code> and copy the below example code.</p>
<p>This example follows a topic on MQTT and updates the state of an entity to the last message received on that topic. It will also register a service set_state that will publish a message to the MQTT topic that were listening to.</p>
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">homeassistant.loader</span> <span class="kn">as</span> <span class="nn">loader</span>
<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_mqtt'</span>
<span class="c"># List of component names (string) your component depends upon.</span>
<span class="n">DEPENDENCIES</span> <span class="o">=</span> <span class="p">[</span><span class="s">'mqtt'</span><span class="p">]</span>
<span class="n">CONF_TOPIC</span> <span class="o">=</span> <span class="s">'topic'</span>
<span class="n">DEFAULT_TOPIC</span> <span class="o">=</span> <span class="s">'home-assistant/hello_mqtt'</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 MQTT component."""</span>
<span class="n">mqtt</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">get_component</span><span class="p">(</span><span class="s">'mqtt'</span><span class="p">)</span>
<span class="n">topic</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="s">'topic'</span><span class="p">,</span> <span class="n">DEFAULT_TOPIC</span><span class="p">)</span>
<span class="n">entity_id</span> <span class="o">=</span> <span class="s">'hello_mqtt.last_message'</span>
<span class="c"># Listener to be called when we receive a message.</span>
<span class="k">def</span> <span class="nf">message_received</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">payload</span><span class="p">,</span> <span class="n">qos</span><span class="p">):</span>
<span class="s">"""Handle new MQTT messages."""</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="n">entity_id</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
<span class="c"># Subscribe our listener to a topic.</span>
<span class="n">mqtt</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">hass</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">message_received</span><span class="p">)</span>
<span class="c"># Set the initial state.</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="n">entity_id</span><span class="p">,</span> <span class="s">'No messages'</span><span class="p">)</span>
<span class="c"># Service to publish a message on MQTT.</span>
<span class="k">def</span> <span class="nf">set_state_service</span><span class="p">(</span><span class="n">call</span><span class="p">):</span>
<span class="s">"""Service to send a message."""</span>
<span class="n">mqtt</span><span class="o">.</span><span class="n">publish</span><span class="p">(</span><span class="n">hass</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</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="s">'new_state'</span><span class="p">))</span>
<span class="c"># Register our service with Home Assistant.</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">'set_state'</span><span class="p">,</span> <span class="n">set_state_service</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 entity should popup and there should be a new service 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_mqtt</span><span class="pi">:</span>
<span class="s">topic</span><span class="pi">:</span> <span class="s">some_mqtt/topic/here</span>
</code></pre>
</div>
<p>You can call the service with example payload:</p>
<div class="language-json highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nt">"new_state"</span><span class="p">:</span><span class="w"> </span><span class="s2">"some new state"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>
</div>
</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_mqtt_basic.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>
Basic MQTT 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>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.css" />
<script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.js"></script>
<script type="text/javascript">
docsearch({
apiKey: 'ae96d94b201c5444c8a443093edf3efb',
indexName: 'home-assistant',
inputSelector: '#search',
debug: false // Set debug to true if you want to inspect the dropdown
});
document.querySelector('.search .close').addEventListener('click', function(ev) {
ev.preventDefault();
document.querySelector('.search-container').style.display = 'none';
});
document.querySelector('.show-search').addEventListener('click', function(ev) {
ev.preventDefault();
document.querySelector('.search-container').style.display = 'block';
document.getElementById('toggle').checked = false;
document.querySelector('.search-container input').focus();
});
</script>
</body>
</html>