diff --git a/_deploy b/_deploy index 0cadd801b97..917e54f9d62 160000 --- a/_deploy +++ b/_deploy @@ -1 +1 @@ -Subproject commit 0cadd801b97d43356af5cf1bc02a6e041ccbebb0 +Subproject commit 917e54f9d6257ae93a7976ed1daedc013a4af9f9 diff --git a/source/_posts/2015-09-11-different-ways-to-use-mqtt-with-home-assistant.markdown b/source/_posts/2015-09-11-different-ways-to-use-mqtt-with-home-assistant.markdown index d08787fcc20..49f336d48a9 100644 --- a/source/_posts/2015-09-11-different-ways-to-use-mqtt-with-home-assistant.markdown +++ b/source/_posts/2015-09-11-different-ways-to-use-mqtt-with-home-assistant.markdown @@ -6,7 +6,7 @@ date: 2015-09-11 11:19:38 +0200 date_formatted: "September 11, 2015" author: Fabian Affolter comments: true -categories: how-to +categories: how-to mqtt og_image: /images/blog/2015-09-mqtt/arduino.png --- diff --git a/source/_posts/2015-10-11-measure-temperature-with-esp8266-and-report-to-mqtt.markdown b/source/_posts/2015-10-11-measure-temperature-with-esp8266-and-report-to-mqtt.markdown new file mode 100644 index 00000000000..1cbad7a32ac --- /dev/null +++ b/source/_posts/2015-10-11-measure-temperature-with-esp8266-and-report-to-mqtt.markdown @@ -0,0 +1,217 @@ +--- +layout: post +title: "Report the temperature with ESP8266 to MQTT" +description: "Step by step tutorial to use ESP8266 and a HDC1008 to ." +date: 2015-10-11 12:10:00 -0700 +date_formatted: "October 11, 2015" +author: Paulus Schoutsen +comments: true +categories: how-to mqtt esp8266 +og_image: /images/blog/2015-10-esp8266-temp/ha-sensor.png +--- + +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. + +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. + +

+ +Home Assistant will keep track of historical values and allow you to integrate it into automation. +

+ + + +### Components + +I've been using Adafruit for my shopping: + + - [Adafruit HUZZAH ESP8266 Breakout](http://www.adafruit.com/product/2471) ([assembly instructions](https://learn.adafruit.com/adafruit-huzzah-esp8266-breakout/assembly)) + - [Adafruit HDC1008 Temperature & Humidity Sensor Breakout Board](http://www.adafruit.com/product/2635) ([assembly instructions](https://learn.adafruit.com/adafruit-hdc1008-temperature-and-humidity-sensor-breakout/assembly)) + - [MQTT server](/components/mqtt.html#picking-a-broker) + +_Besides this, you will need the usual hardware prototype equipment: a breadboard, some wires, +soldering iron + wire, Serial USB cable._ + +### Connections + +On your breadboard, make the following connections from your ESP8266 to the HDC1008: + +| ESP8266 | HDC1008 | +| ------- | ------- | +| GND | GND +| 3V | Vin +| 14 | SCL +| #2 | SDA + +_I picked `#2` and `14` myself, you can configure them in the sketch._ + +### Preparing your IDE + +Follow [these instructions](https://github.com/esp8266/Arduino#installing-with-boards-manager) on how +to install and prepare the Arduino IDE for ESP8266 development. + +After you're done installing, open the Arduino IDE, in the menu click on `sketch` -> `include library` -> +`manage libraries` and install the following libraries: + +- PubSubClient by Nick 'O Leary +- Adafruit HDC1000 + +### Sketch + +If you have followed the previous steps, you're all set. + + - Open Arduino IDE and create a new sketch (`File` -> `New`) + - Copy and paste the below sketch to the Arduino IDE + - Adjust the values line 6 - 14 to match your setup + - Optional: If you want to connect to an MQTT server without a username or password, adjust line 63. + - 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. + - Press the upload button in Arduino IDE + - Open the serial monitor (`Tools` -> `Serial Monitor`) to see the output from your device + +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 `True`. This means that anyone +connecting to the MQTT topic will automatically be notified of the last reported value. + +```cpp + +#include +#include +#include +#include + +#define wifi_ssid "YOUR WIFI SSID" +#define wifi_password "WIFI PASSWORD" + +#define mqtt_server "YOUR_MQTT_SERVER_HOST" +#define mqtt_user "your_username" +#define mqtt_password "your_password" + +#define humidity_topic "sensor/humidity" +#define temperature_topic "sensor/temperature" + +WiFiClient espClient; +PubSubClient client(espClient); +Adafruit_HDC1000 hdc = Adafruit_HDC1000(); + +void setup() { + Serial.begin(115200); + setup_wifi(); + client.setServer(mqtt_server, 1883); + + // Set SDA and SDL ports + Wire.begin(2, 14); + + // Start sensor + if (!hdc.begin()) { + Serial.println("Couldn't find sensor!"); + while (1); + }} + +void setup_wifi() { + delay(10); + // We start by connecting to a WiFi network + Serial.println(); + Serial.print("Connecting to "); + Serial.println(wifi_ssid); + + WiFi.begin(wifi_ssid, wifi_password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + + Serial.println(""); + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); +} + +void reconnect() { + // Loop until we're reconnected + while (!client.connected()) { + Serial.print("Attempting MQTT connection..."); + // Attempt to connect + // If you do not want to use a username and password, change next line to + // if (client.connect("ESP8266Client")) { + if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) { + Serial.println("connected"); + } else { + Serial.print("failed, rc="); + Serial.print(client.state()); + Serial.println(" try again in 5 seconds"); + // Wait 5 seconds before retrying + delay(5000); + } + } +} + +bool checkBound(float newValue, float prevValue, float maxDiff) { + return newValue < prevValue - maxDiff || newValue > prevValue + maxDiff; +} + +long lastMsg = 0; +float temp = 0.0; +float hum = 0.0; +float diff = 1.0; + +void loop() { + if (!client.connected()) { + reconnect(); + } + client.loop(); + + long now = millis(); + if (now - lastMsg > 1000) { + lastMsg = now; + + float newTemp = hdc.readTemperature(); + float newHum = hdc.readHumidity(); + + if (checkBound(newTemp, temp, diff)) { + temp = newTemp; + Serial.print("New temperature:"); + Serial.println(String(temp).c_str()); + client.publish(temperature_topic, String(temp).c_str(), true); + } + + if (checkBound(newHum, hum, diff)) { + hum = newHum; + Serial.print("New humidity:"); + Serial.println(String(hum).c_str()); + client.publish(humidity_topic, String(hum).c_str(), true); + } + } +} +``` + +### Configuring Home Assistant + +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. + +```yaml +mqtt: + broker: YOUR_MQTT_SERVER_HOST + username: your_username + password: your_password + +sensor: + platform: mqtt + name: "Temperature" + state_topic: "sensor/temperature" + qos: 0 + unit_of_measurement: "ÂșC" + +sensor 2: + platform: mqtt + name: "Humidity" + state_topic: "sensor/humidity" + qos: 0 + unit_of_measurement: "%" +``` diff --git a/source/images/blog/2015-10-esp8266-temp/ha-sensor.png b/source/images/blog/2015-10-esp8266-temp/ha-sensor.png new file mode 100644 index 00000000000..be8bf1ae5ca Binary files /dev/null and b/source/images/blog/2015-10-esp8266-temp/ha-sensor.png differ