686 lines
No EOL
35 KiB
HTML
686 lines
No EOL
35 KiB
HTML
<!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>Report the temperature with ESP8266 to MQTT - Home Assistant</title>
|
|
<meta name="author" content="Paulus Schoutsen">
|
|
|
|
<meta name="description" content="Step by step tutorial to use ESP8266 and a HDC1008 to .">
|
|
|
|
<meta name="viewport" content="width=device-width">
|
|
<link rel="canonical" href="https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt">
|
|
|
|
<meta property="fb:app_id" content="338291289691179">
|
|
<meta property="og:title" content="Report the temperature with ESP8266 to MQTT">
|
|
<meta property="og:site_name" content="Home Assistant">
|
|
<meta property="og:url" content="https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/">
|
|
<meta property="og:type" content="article">
|
|
<meta property="og:description" content="Step by step tutorial to use ESP8266 and a HDC1008 to .">
|
|
<meta property="og:image" content="https://home-assistant.io/images/blog/2015-10-esp8266-temp/ha-sensor.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='/images/favicon-192x192.png'> Home Assistant
|
|
</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>
|
|
<ul>
|
|
<li><a href='/getting-started/'>Installing Home Assistant</a></li>
|
|
<li><a href='/getting-started/configuration.html'>Configuration basics</a></li>
|
|
<li><a href='/getting-started/devices.html'>Adding devices</a></li>
|
|
<li><a href='/getting-started/presence-detection.html'>Presence detection</a></li>
|
|
<li><a href='/getting-started/automation.html'>Automation</a></li>
|
|
<li><a href='/cookbook'>Configuration cookbook</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href='/components/'>Components</a></li>
|
|
<li>
|
|
<a href="/developers/">Developers</a>
|
|
<ul>
|
|
<li><a href="/developers/architecture.html">Architecture</a></li>
|
|
<li><a href="/developers/frontend.html">Frontend development</a></li>
|
|
<li><a href="/developers/creating_components.html">
|
|
Creating components
|
|
</a></li>
|
|
<li><a href="/developers/add_new_platform.html">
|
|
Adding platform support
|
|
</a></li>
|
|
<li><a href="/developers/api.html">API</a></li>
|
|
<li><a href="/developers/credits.html">Credits</a></li>
|
|
</ul>
|
|
</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="post">
|
|
<header>
|
|
|
|
<h1 class="title indent">Report the temperature with ESP8266 to MQTT</h1>
|
|
|
|
|
|
|
|
<div class="meta clearfix">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<time datetime="2015-10-11T12:10:00-07:00" pubdate data-updated="true"><i class="icon-calendar"></i> October 11, 2015</time>
|
|
|
|
|
|
|
|
<span class="byline author vcard"><i class='icon-user'></i> Paulus Schoutsen</span>
|
|
|
|
<span><i class='icon-time'></i> nine minutes reading time</span>
|
|
|
|
|
|
<span>
|
|
<i class="icon-tags"></i>
|
|
<ul class="tags unstyled">
|
|
|
|
|
|
<li><a class='category' href='/blog/categories/esp8266/'>esp8266</a></li>
|
|
|
|
<li><a class='category' href='/blog/categories/how-to/'>how-to</a></li>
|
|
|
|
<li><a class='category' href='/blog/categories/mqtt/'>mqtt</a></li>
|
|
|
|
|
|
</ul>
|
|
</span>
|
|
|
|
|
|
<a class='comments'
|
|
href="#disqus_thread"
|
|
>Comments</a>
|
|
|
|
</div>
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
<p>I recently learned about the ESP8266, a $5 chip that includes WiFi and is Arduino compatible. This means
|
|
that all your DIY projects can now be done for a fraction of the price.</p>
|
|
|
|
<p>For this tutorial, I’ll walk through how to get going with ESP8266, get the temperature and humidity and
|
|
report it to MQTT where Home Asssistant can pick it up.</p>
|
|
|
|
<p class='img'>
|
|
<img src='/images/blog/2015-10-esp8266-temp/setup.png' />
|
|
Picture of the final setup (+ 2 LED for decoration)
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class='img'>
|
|
<img src='/images/blog/2015-10-esp8266-temp/ha-sensor.png' />
|
|
Home Assistant will keep track of historical values and allow you to integrate it into automation.
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<a name="read-more"></a>
|
|
|
|
|
|
<h3>Components</h3>
|
|
|
|
<p>I’ve been using Adafruit for my shopping:</p>
|
|
|
|
<ul>
|
|
<li><a href="http://www.adafruit.com/product/2471">Adafruit HUZZAH ESP8266 Breakout</a> (<a href="https://learn.adafruit.com/adafruit-huzzah-esp8266-breakout/assembly">assembly instructions</a>)</li>
|
|
<li><a href="http://www.adafruit.com/product/2635">Adafruit HDC1008 Temperature & Humidity Sensor Breakout Board</a> (<a href="https://learn.adafruit.com/adafruit-hdc1008-temperature-and-humidity-sensor-breakout/assembly">assembly instructions</a>)</li>
|
|
<li><a href="/components/mqtt.html#picking-a-broker">MQTT server</a></li>
|
|
</ul>
|
|
|
|
|
|
<p><em>Besides this, you will need the usual hardware prototype equipment: a breadboard, some wires,
|
|
soldering iron + wire, Serial USB cable.</em></p>
|
|
|
|
<h3>Connections</h3>
|
|
|
|
<p>On your breadboard, make the following connections from your ESP8266 to the HDC1008:</p>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th> ESP8266 </th>
|
|
<th> HDC1008 </th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td> GND </td>
|
|
<td> GND</td>
|
|
</tr>
|
|
<tr>
|
|
<td> 3V </td>
|
|
<td> Vin</td>
|
|
</tr>
|
|
<tr>
|
|
<td> 14 </td>
|
|
<td> SCL</td>
|
|
</tr>
|
|
<tr>
|
|
<td> #2 </td>
|
|
<td> SDA</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<p><em>I picked <code>#2</code> and <code>14</code> myself, you can configure them in the sketch.</em></p>
|
|
|
|
<h3>Preparing your IDE</h3>
|
|
|
|
<p>Follow <a href="https://github.com/esp8266/Arduino#installing-with-boards-manager">these instructions</a> on how
|
|
to install and prepare the Arduino IDE for ESP8266 development.</p>
|
|
|
|
<p>After you’re done installing, open the Arduino IDE, in the menu click on <code>sketch</code> -> <code>include library</code> ->
|
|
<code>manage libraries</code> and install the following libraries:</p>
|
|
|
|
<ul>
|
|
<li>PubSubClient by Nick ‘O Leary</li>
|
|
<li>Adafruit HDC1000</li>
|
|
</ul>
|
|
|
|
|
|
<h3>Sketch</h3>
|
|
|
|
<p>If you have followed the previous steps, you’re all set.</p>
|
|
|
|
<ul>
|
|
<li>Open Arduino IDE and create a new sketch (<code>File</code> -> <code>New</code>)</li>
|
|
<li>Copy and paste the below sketch to the Arduino IDE</li>
|
|
<li>Adjust the values line 6 - 14 to match your setup</li>
|
|
<li>Optional: If you want to connect to an MQTT server without a username or password, adjust line 63.</li>
|
|
<li>To have the ESP8266 accept our new sketch, we have to put it in upload mode. On the ESP8266 device
|
|
keep the GPIO0 button pressed while pressing the reset button. The red led will glow half bright to
|
|
indicate it is in upload mode.</li>
|
|
<li>Press the upload button in Arduino IDE</li>
|
|
<li>Open the serial monitor (<code>Tools</code> -> <code>Serial Monitor</code>) to see the output from your device</li>
|
|
</ul>
|
|
|
|
|
|
<p>This sketch will connect to your WiFi network and MQTT broker. It will read the temperature and humidity
|
|
from the sensor every second. It will report it to the MQTT server if the difference is > 1 since last
|
|
reported value. Reports to the MQTT broker are sent with retain set to <code>True</code>. This means that anyone
|
|
connecting to the MQTT topic will automatically be notified of the last reported value.</p>
|
|
|
|
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
|
|
<span class='line-number'>2</span>
|
|
<span class='line-number'>3</span>
|
|
<span class='line-number'>4</span>
|
|
<span class='line-number'>5</span>
|
|
<span class='line-number'>6</span>
|
|
<span class='line-number'>7</span>
|
|
<span class='line-number'>8</span>
|
|
<span class='line-number'>9</span>
|
|
<span class='line-number'>10</span>
|
|
<span class='line-number'>11</span>
|
|
<span class='line-number'>12</span>
|
|
<span class='line-number'>13</span>
|
|
<span class='line-number'>14</span>
|
|
<span class='line-number'>15</span>
|
|
<span class='line-number'>16</span>
|
|
<span class='line-number'>17</span>
|
|
<span class='line-number'>18</span>
|
|
<span class='line-number'>19</span>
|
|
<span class='line-number'>20</span>
|
|
<span class='line-number'>21</span>
|
|
<span class='line-number'>22</span>
|
|
<span class='line-number'>23</span>
|
|
<span class='line-number'>24</span>
|
|
<span class='line-number'>25</span>
|
|
<span class='line-number'>26</span>
|
|
<span class='line-number'>27</span>
|
|
<span class='line-number'>28</span>
|
|
<span class='line-number'>29</span>
|
|
<span class='line-number'>30</span>
|
|
<span class='line-number'>31</span>
|
|
<span class='line-number'>32</span>
|
|
<span class='line-number'>33</span>
|
|
<span class='line-number'>34</span>
|
|
<span class='line-number'>35</span>
|
|
<span class='line-number'>36</span>
|
|
<span class='line-number'>37</span>
|
|
<span class='line-number'>38</span>
|
|
<span class='line-number'>39</span>
|
|
<span class='line-number'>40</span>
|
|
<span class='line-number'>41</span>
|
|
<span class='line-number'>42</span>
|
|
<span class='line-number'>43</span>
|
|
<span class='line-number'>44</span>
|
|
<span class='line-number'>45</span>
|
|
<span class='line-number'>46</span>
|
|
<span class='line-number'>47</span>
|
|
<span class='line-number'>48</span>
|
|
<span class='line-number'>49</span>
|
|
<span class='line-number'>50</span>
|
|
<span class='line-number'>51</span>
|
|
<span class='line-number'>52</span>
|
|
<span class='line-number'>53</span>
|
|
<span class='line-number'>54</span>
|
|
<span class='line-number'>55</span>
|
|
<span class='line-number'>56</span>
|
|
<span class='line-number'>57</span>
|
|
<span class='line-number'>58</span>
|
|
<span class='line-number'>59</span>
|
|
<span class='line-number'>60</span>
|
|
<span class='line-number'>61</span>
|
|
<span class='line-number'>62</span>
|
|
<span class='line-number'>63</span>
|
|
<span class='line-number'>64</span>
|
|
<span class='line-number'>65</span>
|
|
<span class='line-number'>66</span>
|
|
<span class='line-number'>67</span>
|
|
<span class='line-number'>68</span>
|
|
<span class='line-number'>69</span>
|
|
<span class='line-number'>70</span>
|
|
<span class='line-number'>71</span>
|
|
<span class='line-number'>72</span>
|
|
<span class='line-number'>73</span>
|
|
<span class='line-number'>74</span>
|
|
<span class='line-number'>75</span>
|
|
<span class='line-number'>76</span>
|
|
<span class='line-number'>77</span>
|
|
<span class='line-number'>78</span>
|
|
<span class='line-number'>79</span>
|
|
<span class='line-number'>80</span>
|
|
<span class='line-number'>81</span>
|
|
<span class='line-number'>82</span>
|
|
<span class='line-number'>83</span>
|
|
<span class='line-number'>84</span>
|
|
<span class='line-number'>85</span>
|
|
<span class='line-number'>86</span>
|
|
<span class='line-number'>87</span>
|
|
<span class='line-number'>88</span>
|
|
<span class='line-number'>89</span>
|
|
<span class='line-number'>90</span>
|
|
<span class='line-number'>91</span>
|
|
<span class='line-number'>92</span>
|
|
<span class='line-number'>93</span>
|
|
<span class='line-number'>94</span>
|
|
<span class='line-number'>95</span>
|
|
<span class='line-number'>96</span>
|
|
<span class='line-number'>97</span>
|
|
<span class='line-number'>98</span>
|
|
<span class='line-number'>99</span>
|
|
<span class='line-number'>100</span>
|
|
<span class='line-number'>101</span>
|
|
<span class='line-number'>102</span>
|
|
<span class='line-number'>103</span>
|
|
<span class='line-number'>104</span>
|
|
<span class='line-number'>105</span>
|
|
<span class='line-number'>106</span>
|
|
<span class='line-number'>107</span>
|
|
<span class='line-number'>108</span>
|
|
<span class='line-number'>109</span>
|
|
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include <ESP8266WiFi.h></span>
|
|
</span><span class='line'><span class="cp">#include <Wire.h></span>
|
|
</span><span class='line'><span class="cp">#include <PubSubClient.h></span>
|
|
</span><span class='line'><span class="cp">#include <Adafruit_HDC1000.h></span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="cp">#define wifi_ssid "YOUR WIFI SSID"</span>
|
|
</span><span class='line'><span class="cp">#define wifi_password "WIFI PASSWORD"</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="cp">#define mqtt_server "YOUR_MQTT_SERVER_HOST"</span>
|
|
</span><span class='line'><span class="cp">#define mqtt_user "your_username"</span>
|
|
</span><span class='line'><span class="cp">#define mqtt_password "your_password"</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="cp">#define humidity_topic "sensor/humidity"</span>
|
|
</span><span class='line'><span class="cp">#define temperature_topic "sensor/temperature"</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="n">WiFiClient</span> <span class="n">espClient</span><span class="p">;</span>
|
|
</span><span class='line'><span class="n">PubSubClient</span> <span class="nf">client</span><span class="p">(</span><span class="n">espClient</span><span class="p">);</span>
|
|
</span><span class='line'><span class="n">Adafruit_HDC1000</span> <span class="n">hdc</span> <span class="o">=</span> <span class="n">Adafruit_HDC1000</span><span class="p">();</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="kt">void</span> <span class="nf">setup</span><span class="p">()</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">setup_wifi</span><span class="p">();</span>
|
|
</span><span class='line'> <span class="n">client</span><span class="p">.</span><span class="n">setServer</span><span class="p">(</span><span class="n">mqtt_server</span><span class="p">,</span> <span class="mi">1883</span><span class="p">);</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="c1">// Set SDA and SDL ports</span>
|
|
</span><span class='line'> <span class="n">Wire</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">14</span><span class="p">);</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="c1">// Start sensor</span>
|
|
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hdc</span><span class="p">.</span><span class="n">begin</span><span class="p">())</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"Couldn't find sensor!"</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="p">}}</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="kt">void</span> <span class="nf">setup_wifi</span><span class="p">()</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">delay</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="c1">// We start by connecting to a WiFi network</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">();</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">"Connecting to "</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">wifi_ssid</span><span class="p">);</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="n">WiFi</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="n">wifi_ssid</span><span class="p">,</span> <span class="n">wifi_password</span><span class="p">);</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="k">while</span> <span class="p">(</span><span class="n">WiFi</span><span class="p">.</span><span class="n">status</span><span class="p">()</span> <span class="o">!=</span> <span class="n">WL_CONNECTED</span><span class="p">)</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">"."</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="p">}</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">""</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"WiFi connected"</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"IP address: "</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">WiFi</span><span class="p">.</span><span class="n">localIP</span><span class="p">());</span>
|
|
</span><span class='line'><span class="p">}</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="kt">void</span> <span class="nf">reconnect</span><span class="p">()</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="c1">// Loop until we're reconnected</span>
|
|
</span><span class='line'> <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">client</span><span class="p">.</span><span class="n">connected</span><span class="p">())</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">"Attempting MQTT connection..."</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="c1">// Attempt to connect</span>
|
|
</span><span class='line'> <span class="c1">// If you do not want to use a username and password, change next line to</span>
|
|
</span><span class='line'> <span class="c1">// if (client.connect("ESP8266Client")) {</span>
|
|
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="s">"ESP8266Client"</span><span class="p">,</span> <span class="n">mqtt_user</span><span class="p">,</span> <span class="n">mqtt_password</span><span class="p">))</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"connected"</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">"failed, rc="</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">state</span><span class="p">());</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">" try again in 5 seconds"</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="c1">// Wait 5 seconds before retrying</span>
|
|
</span><span class='line'> <span class="n">delay</span><span class="p">(</span><span class="mi">5000</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="p">}</span>
|
|
</span><span class='line'> <span class="p">}</span>
|
|
</span><span class='line'><span class="p">}</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="kt">bool</span> <span class="nf">checkBound</span><span class="p">(</span><span class="kt">float</span> <span class="n">newValue</span><span class="p">,</span> <span class="kt">float</span> <span class="n">prevValue</span><span class="p">,</span> <span class="kt">float</span> <span class="n">maxDiff</span><span class="p">)</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="k">return</span> <span class="n">newValue</span> <span class="o"><</span> <span class="n">prevValue</span> <span class="o">-</span> <span class="n">maxDiff</span> <span class="o">||</span> <span class="n">newValue</span> <span class="o">></span> <span class="n">prevValue</span> <span class="o">+</span> <span class="n">maxDiff</span><span class="p">;</span>
|
|
</span><span class='line'><span class="p">}</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="kt">long</span> <span class="n">lastMsg</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
|
</span><span class='line'><span class="kt">float</span> <span class="n">temp</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
|
|
</span><span class='line'><span class="kt">float</span> <span class="n">hum</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
|
|
</span><span class='line'><span class="kt">float</span> <span class="n">diff</span> <span class="o">=</span> <span class="mf">1.0</span><span class="p">;</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="kt">void</span> <span class="nf">loop</span><span class="p">()</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">client</span><span class="p">.</span><span class="n">connected</span><span class="p">())</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">reconnect</span><span class="p">();</span>
|
|
</span><span class='line'> <span class="p">}</span>
|
|
</span><span class='line'> <span class="n">client</span><span class="p">.</span><span class="n">loop</span><span class="p">();</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="kt">long</span> <span class="n">now</span> <span class="o">=</span> <span class="n">millis</span><span class="p">();</span>
|
|
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="n">now</span> <span class="o">-</span> <span class="n">lastMsg</span> <span class="o">></span> <span class="mi">1000</span><span class="p">)</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">lastMsg</span> <span class="o">=</span> <span class="n">now</span><span class="p">;</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="kt">float</span> <span class="n">newTemp</span> <span class="o">=</span> <span class="n">hdc</span><span class="p">.</span><span class="n">readTemperature</span><span class="p">();</span>
|
|
</span><span class='line'> <span class="kt">float</span> <span class="n">newHum</span> <span class="o">=</span> <span class="n">hdc</span><span class="p">.</span><span class="n">readHumidity</span><span class="p">();</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="n">checkBound</span><span class="p">(</span><span class="n">newTemp</span><span class="p">,</span> <span class="n">temp</span><span class="p">,</span> <span class="n">diff</span><span class="p">))</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">temp</span> <span class="o">=</span> <span class="n">newTemp</span><span class="p">;</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">"New temperature:"</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="n">temp</span><span class="p">).</span><span class="n">c_str</span><span class="p">());</span>
|
|
</span><span class='line'> <span class="n">client</span><span class="p">.</span><span class="n">publish</span><span class="p">(</span><span class="n">temperature_topic</span><span class="p">,</span> <span class="n">String</span><span class="p">(</span><span class="n">temp</span><span class="p">).</span><span class="n">c_str</span><span class="p">(),</span> <span class="nb">true</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="p">}</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'> <span class="k">if</span> <span class="p">(</span><span class="n">checkBound</span><span class="p">(</span><span class="n">newHum</span><span class="p">,</span> <span class="n">hum</span><span class="p">,</span> <span class="n">diff</span><span class="p">))</span> <span class="p">{</span>
|
|
</span><span class='line'> <span class="n">hum</span> <span class="o">=</span> <span class="n">newHum</span><span class="p">;</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">"New humidity:"</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="n">hum</span><span class="p">).</span><span class="n">c_str</span><span class="p">());</span>
|
|
</span><span class='line'> <span class="n">client</span><span class="p">.</span><span class="n">publish</span><span class="p">(</span><span class="n">humidity_topic</span><span class="p">,</span> <span class="n">String</span><span class="p">(</span><span class="n">hum</span><span class="p">).</span><span class="n">c_str</span><span class="p">(),</span> <span class="nb">true</span><span class="p">);</span>
|
|
</span><span class='line'> <span class="p">}</span>
|
|
</span><span class='line'> <span class="p">}</span>
|
|
</span><span class='line'><span class="p">}</span>
|
|
</span></code></pre></td></tr></table></div></figure>
|
|
|
|
|
|
<h3>Configuring Home Assistant</h3>
|
|
|
|
<p>The last step is to integrate the sensor values into Home Assistant. This can be done by setting up
|
|
Home Assistant to connect to the MQTT broker and subscribe to the sensor topics.</p>
|
|
|
|
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
|
|
<span class='line-number'>2</span>
|
|
<span class='line-number'>3</span>
|
|
<span class='line-number'>4</span>
|
|
<span class='line-number'>5</span>
|
|
<span class='line-number'>6</span>
|
|
<span class='line-number'>7</span>
|
|
<span class='line-number'>8</span>
|
|
<span class='line-number'>9</span>
|
|
<span class='line-number'>10</span>
|
|
<span class='line-number'>11</span>
|
|
<span class='line-number'>12</span>
|
|
<span class='line-number'>13</span>
|
|
<span class='line-number'>14</span>
|
|
<span class='line-number'>15</span>
|
|
<span class='line-number'>16</span>
|
|
<span class='line-number'>17</span>
|
|
<span class='line-number'>18</span>
|
|
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="l-Scalar-Plain">mqtt</span><span class="p-Indicator">:</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">broker</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">YOUR_MQTT_SERVER_HOST</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">username</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">your_username</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">password</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">your_password</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="l-Scalar-Plain">sensor</span><span class="p-Indicator">:</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">platform</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">mqtt</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="s">"Temperature"</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">state_topic</span><span class="p-Indicator">:</span> <span class="s">"sensor/temperature"</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">qos</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">0</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">unit_of_measurement</span><span class="p-Indicator">:</span> <span class="s">"ºC"</span>
|
|
</span><span class='line'>
|
|
</span><span class='line'><span class="l-Scalar-Plain">sensor 2</span><span class="p-Indicator">:</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">platform</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">mqtt</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="s">"Humidity"</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">state_topic</span><span class="p-Indicator">:</span> <span class="s">"sensor/humidity"</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">qos</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">0</span>
|
|
</span><span class='line'> <span class="l-Scalar-Plain">unit_of_measurement</span><span class="p-Indicator">:</span> <span class="s">"%"</span>
|
|
</span></code></pre></td></tr></table></div></figure>
|
|
|
|
|
|
|
|
</article>
|
|
|
|
|
|
<section id="disqus">
|
|
<h3 class="indent title">Comments</h3>
|
|
<div id="disqus_thread" aria-live="polite"><noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
|
</div>
|
|
</section>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<aside id="sidebar" class="grid__item one-third lap-one-whole palm-one-whole">
|
|
<div class="grid">
|
|
|
|
|
|
|
|
|
|
<section class="sharing aside-module grid__item one-whole lap-one-half">
|
|
<h1 class="title delta">Share this post</h1>
|
|
|
|
<a href="//twitter.com/share"
|
|
class="twitter-share-button"
|
|
data-url="https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/"
|
|
data-counturl="https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/" >Tweet</a>
|
|
|
|
|
|
<div class="g-plusone" data-size="standard"></div>
|
|
|
|
|
|
<div class="fb-share-button" style='top: -6px;'
|
|
data-href="https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/"
|
|
data-layout="button_count">
|
|
</div>
|
|
|
|
</section>
|
|
|
|
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
|
|
|
|
<script src="https://apis.google.com/js/platform.js" async defer></script>
|
|
|
|
<script>
|
|
window.fbAsyncInit = function() {
|
|
FB.init({
|
|
appId : '338291289691179',
|
|
xfbml : true,
|
|
version : 'v2.2'
|
|
});
|
|
};
|
|
|
|
(function(d, s, id){
|
|
var js, fjs = d.getElementsByTagName(s)[0];
|
|
if (d.getElementById(id)) {return;}
|
|
js = d.createElement(s); js.id = id;
|
|
js.src = "//connect.facebook.net/en_US/sdk.js";
|
|
fjs.parentNode.insertBefore(js, fjs);
|
|
}(document, 'script', 'facebook-jssdk'));
|
|
</script>
|
|
<section id="recent-posts" class="aside-module grid__item one-whole lap-one-half">
|
|
<h1 class="title delta">Other Posts</h1>
|
|
<ul class="divided">
|
|
|
|
|
|
<li class="post">
|
|
<a href="/blog/2015/10/26/firetv-and-radiotherm-now-supported/">0.7.6: Amazon FireTV, Radiotherm thermostats</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
<li class="post">
|
|
<a href="/blog/2015/10/11/rfxtrx-blinkstick-and-snmp-support/">0.7.5: Blinkstick, SNMP, Telegram</a>
|
|
</li>
|
|
|
|
|
|
|
|
<li class="post">
|
|
<a href="/blog/2015/10/05/home-assistant-goes-geo-with-owntracks/">Home Assistant goes geo with OwnTracks</a>
|
|
</li>
|
|
|
|
|
|
|
|
<li class="post">
|
|
<a href="/blog/2015/09/19/alarm-sonos-and-itunes-support/">Alarms, Sonos and iTunes now supported</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</section>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</aside>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<footer>
|
|
<div class="grid-wrapper">
|
|
<div class="grid">
|
|
<div class="grid__item">
|
|
<p class="copyright">
|
|
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a>, <a href='http://jekyllrb.com/'>Jekyll</a> and the <a href='https://github.com/coogie/oscailte'>Oscalite theme</a>. Hosted by <a href='https://pages.github.com/'>GitHub</a> and served by <a href='https://cloudflare.com'>CloudFlare</a>.</span>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</footer>
|
|
|
|
<!--[if lt IE 7]>
|
|
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
|
|
<![endif]-->
|
|
|
|
|
|
|
|
|
|
<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>
|
|
|
|
|
|
|
|
<script>
|
|
var disqus_shortname = 'home-assistant';
|
|
|
|
|
|
// var disqus_developer = 1;
|
|
var disqus_identifier = 'https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/';
|
|
var disqus_url = 'https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/';
|
|
var disqus_script = 'embed.js';
|
|
|
|
(function () {
|
|
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
|
dsq.src = '//' + disqus_shortname + '.disqus.com/' + disqus_script;
|
|
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
|
}());
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</body>
|
|
</html> |