Páginas

miércoles, 30 de diciembre de 2020

 



  

 Instalar Bot Telegram DSM de Synology NAS con Python3

Hace tiempo que no escribo porque dejé de trabajar con Arduino pero hoy os quiero traer algo diferente que os puede ser de utilidad. Vamos a ver como instalar un BOT de Telegram en nuestro NAS Synology directamente en el Sistema Operativo Linux DSM. 

Antes de empezar tenemos que instalar python3 en nuestro NAS.




Tenemos que descargar descomprimir y poner en el NAS el fichero:


Una vez hecho esto tenemos que conectarnos por SSH a nuestro Synology  e ir a la carpeta copiada. Instalamos el PIP y a continuación el módulo de Telegram para Python3.

wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py 
sudo python3 setup.py install

Ya podemos ejecutar nuestro Bot de Telegram en el NAS Synology con

python3 nombre_bot.py 

Espero que esta pequeña explicación sea de utilidad.

viernes, 5 de abril de 2019

Arduino Wemos Sensor MQTT Home Assistant



  

 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. 



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: 
  1. /* Projet d'apprentissage d'un objet connecte (IoT) pour realiser une sonde de temperature 
  2. ESP8266 + DHT22 + LED + MQTT + Home-Assistant 
  3. Projets DIY (http://www.projetsdiy.fr) - Mai 2016 
  4. Licence : MIT 
  5. Modificado por ALRO para http://arubia45.blogspot.com.es/ - Enero 2019 */ 
  6.  
  7. #include <ESP8266WiFi.h> 
  8. #include <PubSubClient.h> 
  9. #include <DHT.h> 

  10. // OTA 
  11. #include <ESP8266mDNS.h> 
  12. #include <WiFiUdp.h> 
  13. #include <ArduinoOTA.h> 

  14. const char* ssid = "SID_WIFI"; 
  15. const char* password = "CLAVE_WIFI"; 
  16.   
  17. #define mqtt_server "IP O HOST HASSIO
  18. #define mqtt_user "USUARIO_MQTT"  
  19. #define mqtt_password "CLAVE_USUARIO_MQTT"  
  20. #define temperature_topic "sensorXX/temperature"  
  21. #define humidity_topic "sensorXX/humidity"  

  22. //Buffer to decode MQTT messages 
  23. char message_buff[100]; 

  24. long lastMsg = 0;  
  25. long lastRecu = 0; 
  26. bool debug = false; //Display log message if True 

  27. #define DHTPIN D3 // DHT Pin  

  28. // Un-comment you sensor 
  29. //#define DHTTYPE DHT11 // DHT 11  
  30. #define DHTTYPE DHT22 // DHT 22 (AM2302) 

  31. // Create abjects 
  32. DHT dht(DHTPIN, DHTTYPE);  
  33. WiFiClient espClient; 
  34. PubSubClient client(espClient); 

  35. // ********************************************* 
  36. // ****************     SETUP     ******************
  37. // ********************************************* 
  38. void setup() { 
  39.   Serial.begin(115200); 
  40.   Serial.println("Arrancando"); 
  41.   WiFi.mode(WIFI_STA); 
  42.   WiFi.begin(ssid, password); 
  43.   while (WiFi.waitForConnectResult() != WL_CONNECTED) { 
  44.     Serial.println("Connection Failed! Rebooting..."); 
  45.     delay(5000); 
  46.     ESP.restart(); 
  47.   } 
  48.   ArduinoOTA.onStart([]() { 
  49.     Serial.println("Inicio"); 
  50.   }); 
  51.   ArduinoOTA.onEnd([]() { 
  52.     Serial.println("\nFin"); 
  53.   }); 
  54.   ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { 
  55.     Serial.printf("Progreso: %u%%\r", (progress / (total / 100))); 
  56.   }); 


  57.   ArduinoOTA.onError([](ota_error_t error) { 
  58.     Serial.printf("Error[%u]: ", error); 
  59.     if (error == OTA_AUTH_ERROR) Serial.println("Fallo Autenticacion"); 
  60.     else if (error == OTA_BEGIN_ERROR) Serial.println("Fallo Inicio"); 
  61.     else if (error == OTA_CONNECT_ERROR) Serial.println("Fallo de Conexion"); 
  62.     else if (error == OTA_RECEIVE_ERROR) Serial.println("Fallo de Recepcion"); 
  63.     else if (error == OTA_END_ERROR) Serial.println("Fallo de Finalizacion"); 
  64.   }); 

  65.   ArduinoOTA.begin(); 
  66.   Serial.println("Preparado"); 
  67.   Serial.print("Direccion IP: "); 
  68.   Serial.println(WiFi.localIP()); 
  69.   client.setServer(mqtt_server, 1883);    // Configure MQTT connexion 
  70.   client.setCallback(callback);           // callback function to execute when a MQTT message 
  71.  
  72. //Reconnexion 
  73. void reconnect() { 
  74.   while (!client.connected()) { 
  75.     Serial.print("Conectando con MQTT ..."); 
  76.     if (client.connect("ALROWemosSalon", mqtt_user, mqtt_password)) { 
  77.       Serial.println("OK"); 
  78.     } else { 
  79.       Serial.print("KO, error : "); 
  80.       Serial.print(client.state()); 
  81.       Serial.println(" Esperar 5 segundos antes de reintentarlo"); 
  82.       delay(5000); 
  83.     } 
  84.   } 

  85. // MQTT callback function 
  86. // D'après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio 

  87. void callback(char* topic, byte* payload, unsigned int length) { 
  88.   int i = 0; 
  89.   if ( debug ) { 
  90.     Serial.println("Message recu =>  topic: " + String(topic)); 
  91.     Serial.print(" | longueur: " + String(length,DEC)); 
  92.   } 
  93.   // create character buffer with ending null terminator (string) 
  94.   for(i=0; i<length; i++) { 
  95.     message_buff[i] = payload[i]; 
  96.   } 
  97.   message_buff[i] = '\0'; 
  98.    
  99.   String msgString = String(message_buff); 
  100.   if ( debug ) { 
  101.     Serial.println("Payload: " + msgString); 
  102.   } 

  103.   if ( msgString == "ON" ) { 
  104.     digitalWrite(D2,HIGH);   
  105.   } else { 
  106.     digitalWrite(D2,LOW);   
  107.   } 
  108.  
  109. // ********************************************* 
  110. // LOOP PRINCIPAL 
  111. // ********************************************* 
  112. void loop() { 
  113.   if (!client.connected()) { 
  114.     reconnect(); 
  115.   } 
  116.   client.loop(); 
  117.   long now = millis(); 
  118.   // Send a message every minute 
  119.   if( (now - lastMsg > 1000 * 60) or (now < 100)){ 
  120.     lastMsg = now; 
  121.     float h,t; 
  122.     h = 0; 
  123.     t = 0; 
  124.     int i; 
  125.     for (i=0; i<5; i++){   
  126.       // Read humidity 
  127.       h = h + dht.readHumidity(); 
  128.       // Read temperature in Celcius 
  129.       t = t + dht.readTemperature(); 
  130.     } 
  131.     h = h / i; 
  132.     t = t / i; 
  133.     Serial.print("humedad: "); 
  134.     Serial.println(h); 
  135.     Serial.print("temperatura: "); 
  136.     Serial.println(t); 
  137.     // Oh, nothing to send 
  138.     if ( isnan(t) || isnan(h)) { 
  139.       Serial.println("KO, Verificar sensor DHT!"); 
  140.       return; 
  141.     } 
  142.     if ( debug ) { 
  143.       Serial.print("Temperatura : "); 
  144.       Serial.print(t); 
  145.       Serial.print(" | Humedad : "); 
  146.       Serial.println(h); 
  147.     }   
  148.     client.publish(temperature_topic, String(t).c_str(), true);   // Publish temperature on temperature_topic 
  149.     client.publish(humidity_topic, String(h).c_str(), true);      // and humidity 
  150.   } 
  151.   if (now - lastRecu > 100 ) {
  152.     lastRecu = now; 
  153.     client.subscribe("homeassistant/switch1"); 
  154.   } 
  155. // Recibir actualización OTA 
  156.   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: 

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.



Buscamos MQTT y le damos a Configurar



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.