Reportar la temperatura con ESP8266 a MQTT

{::opciones coderay_line_numbers=“tabla” /}

Hace poco me enteré del ESP8266, un chip de 5 euros que incluye WiFi y es compatible con Arduino. Esto significa que ahora puedes realizar todos tus proyectos de bricolaje por una fracción del precio.

Para este tutorial, explicaré cómo comenzar con ESP8266, obtener la temperatura y la humedad e informarlo a MQTT, donde Home Assistant puede recogerlo.

Imagen del montaje final (+ 2 LED para decoración)

Home Assistant realizará un seguimiento de los valores históricos y le permitirá integrarlos en la automatización.

Componentes

He estado usando Adafruit para mis compras:

Además de esto, necesitará el equipo prototipo de hardware habitual: una placa de pruebas, algunos cables, soldador + cable, cable USB serie.

Alternativas

Desde que se publicó este artículo, el HDC1008 ha sido descontinuado. Se encuentran disponibles bocetos actualizados para las siguientes alternativas:

Conexiones

En su placa de pruebas, realice las siguientes conexiones desde su ESP8266 al HDC1008:

ESP8266 HDC1008

Tierra Tierra
3V vino
14 SCL
#2 ASD

elegí #2 y 14 Yo mismo, puedes configurarlos en el boceto.

Preparando su IDE

Siga estas instrucciones sobre cómo instalar y preparar el IDE de Arduino para el desarrollo de ESP8266.

Una vez que haya terminado la instalación, abra el IDE de Arduino, en el menú haga clic en sketch -> include library -> manage libraries e instale las siguientes bibliotecas:

  • PubSubClient por Nick ‘O Leary
  • Adafruit HDC1000

Bosquejo

Si has seguido los pasos anteriores, ya está todo listo.

  • Abra Arduino IDE y cree un nuevo boceto (File -> New)
  • Copie y pegue el siguiente boceto en el IDE de Arduino
  • Ajuste los valores de las líneas 6 a 14 para que coincidan con su configuración.
  • Opcional: si desea conectarse a un servidor MQTT sin nombre de usuario ni contraseña, ajuste la línea 62.
  • Para que el ESP8266 acepte nuestro nuevo boceto, debemos ponerlo en modo de carga. En el dispositivo ESP8266 mantenga presionado el botón GPIO0 mientras presiona el botón de reinicio. El LED rojo brillará hasta la mitad para indicar que está en modo de carga.
  • Presione el botón de carga en Arduino IDE
  • Abra el monitor serie (Tools -> Serial Monitor) para ver la salida de su dispositivo

Este boceto se conectará a su red WiFi y al corredor MQTT. Leerá la temperatura y la humedad del sensor cada segundo. Lo informará al servidor MQTT si la diferencia es> 1 desde el último valor informado. Los informes al corredor MQTT se envían con la retención configurada en True. Esto significa que cualquier persona que se conecte al tema MQTT recibirá automáticamente una notificación sobre el último valor informado.

#include <ESP8266WiFi.h> #include <Wire.h> #include <PubSubClient.h> #include <Adafruit_HDC1000.h>  #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 !isnan(newValue) &&          (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);     }   } } 

Configurar el asistente doméstico

El último paso es integrar los valores del sensor en Home Assistant. Esto se puede hacer configurando Home Assistant para conectarse al corredor MQTT y suscribirse a los temas del sensor.

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: "%"