Arduino Wemos Sensor MQTT Home Assistant
Vamos a ver cómo podemos hace un sensor de temperatura y humedad con un Wemos D1 y enviar los datos de dichos sensores a nuestro Home Assistant o Hassio.
Para realizar estoy voy a utilizar un Wemos D1 R2
Puedes comprarlo aquí WeMos® D1 R2 V2.1.0 WiFi Uno
Un sensor DHT 22, el cual ya he comentado en entradas anteriores como utilizarlo:
Y 3 cables de conexiones macho-hembra:
Ya de forma opcional puedes imprimir una caja con una impresora 3D de forma que quede todo protegido, yo he impreso esta que es para Arduino pero sirve perfectamente:
Lo puedes descargar de: Thingiverse
La conexión es sencilla, alimentamos el sensor desde el Wemos a 3.3V, conectamos las Tierras (GND) y utilizamos la entrada/salida digital 3 (D3) para comunicarnos con el sensor, hay que tener en cuenta que hay distintos acabados del DHT22 por lo que las patillas del sensor no tienen porqué estar en el orden que os pongo.
La conexión es sencilla, alimentamos el sensor desde el Wemos a 3.3V, conectamos las Tierras (GND) y utilizamos la entrada/salida digital 3 (D3) para comunicarnos con el sensor, hay que tener en cuenta que hay distintos acabados del DHT22 por lo que las patillas del sensor no tienen porqué estar en el orden que os pongo.
Hasta aquí la parte software, ahora vamos a ver que código necesitamos, para ello he utilizado un código que encontré navegando por Internet en la web:
Web Francesa
De aquí cogí este programa ino y lo cambié un poco quedando de la siguiente manera:
Para realizar estoy voy a utilizar un Wemos D1 R2
Un sensor DHT 22, el cual ya he comentado en entradas anteriores como utilizarlo:
Ya de forma opcional puedes imprimir una caja con una impresora 3D de forma que quede todo protegido, yo he impreso esta que es para Arduino pero sirve perfectamente:
Lo puedes descargar de: Thingiverse
La conexión es sencilla, alimentamos el sensor desde el Wemos a 3.3V, conectamos las Tierras (GND) y utilizamos la entrada/salida digital 3 (D3) para comunicarnos con el sensor, hay que tener en cuenta que hay distintos acabados del DHT22 por lo que las patillas del sensor no tienen porqué estar en el orden que os pongo.
Wemos
|
DNT 22
|
3.3V
|
1 - VCC
|
D3
|
2- DATA
|
3- NC
| |
GND
|
4- GND
|
La conexión es sencilla, alimentamos el sensor desde el Wemos a 3.3V, conectamos las Tierras (GND) y utilizamos la entrada/salida digital 3 (D3) para comunicarnos con el sensor, hay que tener en cuenta que hay distintos acabados del DHT22 por lo que las patillas del sensor no tienen porqué estar en el orden que os pongo.
Hasta aquí la parte software, ahora vamos a ver que código necesitamos, para ello he utilizado un código que encontré navegando por Internet en la web:
Web Francesa
De aquí cogí este programa ino y lo cambié un poco quedando de la siguiente manera:
- /* Projet d'apprentissage d'un objet connecte (IoT) pour realiser une sonde de temperature
- ESP8266 + DHT22 + LED + MQTT + Home-Assistant
- Projets DIY (http://www.projetsdiy.fr) - Mai 2016
- Licence : MIT
- Modificado por ALRO para http://arubia45.blogspot.com.es/ - Enero 2019 */
- #include <ESP8266WiFi.h>
- #include <PubSubClient.h>
- #include <DHT.h>
- // OTA
- #include <ESP8266mDNS.h>
- #include <WiFiUdp.h>
- #include <ArduinoOTA.h>
- const char* ssid = "SID_WIFI";
- const char* password = "CLAVE_WIFI";
- #define mqtt_server "IP O HOST HASSIO"
- #define mqtt_user "USUARIO_MQTT"
- #define mqtt_password "CLAVE_USUARIO_MQTT"
- #define temperature_topic "sensorXX/temperature"
- #define humidity_topic "sensorXX/humidity"
- //Buffer to decode MQTT messages
- char message_buff[100];
- long lastMsg = 0;
- long lastRecu = 0;
- bool debug = false; //Display log message if True
- #define DHTPIN D3 // DHT Pin
- // Un-comment you sensor
- //#define DHTTYPE DHT11 // DHT 11
- #define DHTTYPE DHT22 // DHT 22 (AM2302)
- // Create abjects
- DHT dht(DHTPIN, DHTTYPE);
- WiFiClient espClient;
- PubSubClient client(espClient);
- // *********************************************
- // **************** SETUP ******************
- // *********************************************
- void setup() {
- Serial.begin(115200);
- Serial.println("Arrancando");
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- while (WiFi.waitForConnectResult() != WL_CONNECTED) {
- Serial.println("Connection Failed! Rebooting...");
- delay(5000);
- ESP.restart();
- }
- ArduinoOTA.onStart([]() {
- Serial.println("Inicio");
- });
- ArduinoOTA.onEnd([]() {
- Serial.println("\nFin");
- });
- ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
- Serial.printf("Progreso: %u%%\r", (progress / (total / 100)));
- });
- ArduinoOTA.onError([](ota_error_t error) {
- Serial.printf("Error[%u]: ", error);
- if (error == OTA_AUTH_ERROR) Serial.println("Fallo Autenticacion");
- else if (error == OTA_BEGIN_ERROR) Serial.println("Fallo Inicio");
- else if (error == OTA_CONNECT_ERROR) Serial.println("Fallo de Conexion");
- else if (error == OTA_RECEIVE_ERROR) Serial.println("Fallo de Recepcion");
- else if (error == OTA_END_ERROR) Serial.println("Fallo de Finalizacion");
- });
- ArduinoOTA.begin();
- Serial.println("Preparado");
- Serial.print("Direccion IP: ");
- Serial.println(WiFi.localIP());
- client.setServer(mqtt_server, 1883); // Configure MQTT connexion
- client.setCallback(callback); // callback function to execute when a MQTT message
- }
- //Reconnexion
- void reconnect() {
- while (!client.connected()) {
- Serial.print("Conectando con MQTT ...");
- if (client.connect("ALROWemosSalon", mqtt_user, mqtt_password)) {
- Serial.println("OK");
- } else {
- Serial.print("KO, error : ");
- Serial.print(client.state());
- Serial.println(" Esperar 5 segundos antes de reintentarlo");
- delay(5000);
- }
- }
- }
- // MQTT callback function
- // D'après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio
- void callback(char* topic, byte* payload, unsigned int length) {
- int i = 0;
- if ( debug ) {
- Serial.println("Message recu => topic: " + String(topic));
- Serial.print(" | longueur: " + String(length,DEC));
- }
- // create character buffer with ending null terminator (string)
- for(i=0; i<length; i++) {
- message_buff[i] = payload[i];
- }
- message_buff[i] = '\0';
- String msgString = String(message_buff);
- if ( debug ) {
- Serial.println("Payload: " + msgString);
- }
- if ( msgString == "ON" ) {
- digitalWrite(D2,HIGH);
- } else {
- digitalWrite(D2,LOW);
- }
- }
- // *********************************************
- // LOOP PRINCIPAL
- // *********************************************
- void loop() {
- if (!client.connected()) {
- reconnect();
- }
- client.loop();
- long now = millis();
- // Send a message every minute
- if( (now - lastMsg > 1000 * 60) or (now < 100)){
- lastMsg = now;
- float h,t;
- h = 0;
- t = 0;
- int i;
- for (i=0; i<5; i++){
- // Read humidity
- h = h + dht.readHumidity();
- // Read temperature in Celcius
- t = t + dht.readTemperature();
- }
- h = h / i;
- t = t / i;
- Serial.print("humedad: ");
- Serial.println(h);
- Serial.print("temperatura: ");
- Serial.println(t);
- // Oh, nothing to send
- if ( isnan(t) || isnan(h)) {
- Serial.println("KO, Verificar sensor DHT!");
- return;
- }
- if ( debug ) {
- Serial.print("Temperatura : ");
- Serial.print(t);
- Serial.print(" | Humedad : ");
- Serial.println(h);
- }
- client.publish(temperature_topic, String(t).c_str(), true); // Publish temperature on temperature_topic
- client.publish(humidity_topic, String(h).c_str(), true); // and humidity
- }
- if (now - lastRecu > 100 ) {
- lastRecu = now;
- client.subscribe("homeassistant/switch1");
- }
- // Recibir actualización OTA
- ArduinoOTA.handle();
- }
Pero para que esto funcione tenemos que configurar nuestro Hassio para que pueda recibir los datos de los sensores, para la comunicación vamos a utilizar el protocolo MQTT, podéis leer más aquí:
¿Qué es el MQTT?
Una vez que sabéis que es el MQTT necesitamos un servidor para poder recoger los datos de todos los sensores, el Home Assistant trae un plug-in que se instala de forma muy sencilla y que hace las funciones de servidor para instalarlo y configurarlo tenemos que ir a Home Asssitant al menú de:
¿Qué es el MQTT?
Una vez que sabéis que es el MQTT necesitamos un servidor para poder recoger los datos de todos los sensores, el Home Assistant trae un plug-in que se instala de forma muy sencilla y que hace las funciones de servidor para instalarlo y configurarlo tenemos que ir a Home Asssitant al menú de:
Y de ahí a ADD-ON STORE y buscamos uno que se llama Mosquitto broker, lo instalamos y lo configuramos de la siguiente forma:
Le damos a SAVE y a START. Una vez hecho esto y si el log a bajo no nos dice nada raro lo tenemos instalado y funcionando.
El servidor de MQTT está instalado pero ahora lo tenemos que integrar en el Hassio como cualquier otro servidor o dispositivo. Nos vamos al menú Configuración a la opción Integraciones.
Aquí configuramos de la siguiente forma, de manera que utilicemos el usuario y contraseña que pusimos al instalar el servidor de MQTT Mosquitto.
Le damos a Submit, ahora sólo faltaría definir los sensores en el fichero configuration.yaml tal que así (lo podemos poner al final):
#Sensores MQTT
#Wemos ALRO
sensor 1:
platform: mqtt
state_topic: "sensorXX/temperature"
name: "Temperatura"
qos: 0
unit_of_measurement: "°C"
sensor 2:
platform: mqtt
state_topic: "sensorXX/humidity"
name: "Humedad"
qos: 0
unit_of_measurement: "%"
Donde las XX se pueden susutituir por un número tanto aquí como en el programa que cargamos en el Wemos.
y ya los datos que nos lleguen al servidor de MQTT nos aparecerán en nuestro Hassio
Bueno, creo que esto es todo espero que os sea muy útil.
Mi agradecimiento a los compañeros de Telegram que me han ayudado mucho.
Mi agradecimiento a los compañeros de Telegram que me han ayudado mucho.
No hay comentarios:
Publicar un comentario