Detección de presencia de dispositivo bluetooth con nodered y domoticz

@damian_rguez del grupo de Telegram «Domoticz a lo spain» nos explica cómo introducir la presencia de los dispositivos bluetooth en domoticz.

Dividimos esta guía en varios apartados

Requisitos inciales

Para poder seguir este tutorial es necesario tener instalado Node Red en nuestra Raspberry, además de Domoticz, MQTT y demás.

También es fundamental, lógicamente, disponer de un dispositivo bluetooth y un esp32 con bluetooth en nuestro poder.

Os dejamos el listado de tutoriales para poder instalar lo que necesitéis antes de empezar esta guía:

  1. Material necesario para poner en marcha domoticz
  2. Instalación de domoticz desde cero
  3. Instalación de Mosquitto MQTT Broker en Raspberry Pi 
  4. Configurar MQTT con usuario y contraseña (opcional)
  5. Cargamos MQTT en nuestro domoticz
  6. Instalar Watchdog en domoticz (opcional)
  7. Crear usuario y contraseña para domoticz (opcional)
  8. Cómo instalar node red en nuestra raspberry pi

Descarga del software necesario

Vamos a necesitar, a parte del software necesario a consecuencia del seguimiento de los tutoriales anteriores para instalar Node red, los siguientes programas:

OJO a los que tenéis USER y PASS en MQTT de la raspberry y en MQTT de domoticz. Debéis tenerlo en cuenta a la hora de seguir el tutorial.

Flasheo del ESP32

Después de haber instalado el programa Flash Download Tool lo ejecutamos. Tardará unos segundos y seleccionaremos DEVELOPER MODE y, a continuación, ESP32 DOWNLOAD TOOL.

Enchufamos el esp32 con un cable miniUSB al ordenador y comprobamos en qué COM se ha conectado. Si no sabes cómo averiguarlo, sigue este tutorial: «Comprobación de puerto COM para los flasheos por USB TTL«

En el programa ESP32 DOWNLOAD TOOL, clicamos sobre el COM correcto, BAUD 115200 y ERASE.

Después adjuntamos los archivos que hemos descargado en el primer paso de este tutorial redactando el código que os enseñamos en las imágenes. Para seleccionar los archivos clica sobre los tres puntitos al final de cada línea.

Copiamos las características del flasheo del esp32 con los archivos que ponemos a continuación:

Una vez cubierto todo tal y como aparece en la imagen, clicaremos sobre START.

Veremos que se va completando el proceso. Puede tardar un par de minutos, no desesperes que ya casi lo tenemos.

Una vez ha completado el flasheo, nos aparecerá FINISH. 

Ya podemos desenchufar el ESP32 y enchufarlo en el lugar en que vayamos a tenerlo instalado.

Buscamos redes wifi con nuestro móvil y nos conectamos al ESP32. Si te pide contraseña (en algunos casos la solicita), deberás introducir la siguiente:

your_password
Cuidado en esta fase. Si metemos algún dato mal tendremos que reflashear para corregirlo. Fíjate bien en los datos que introduces.

Nos conectamos a él, metemos nuestro wifi y pass, nuestro mqtt con user y pass si tenemos, modificamos el nombre del gateway con el que queremos que aparezca cuando envíe la información y el topic con el q envíe la inforomación:

Al guardar se conectará a nuestra wifi y no sabremos más de él hasta más adelante.

Visualización con el programa MQTT explorer

Ejecutamos el programa MQTT explorer en el ordenador introduciendo los datos de nuestro MQTT.

Veremos que nos aparecen todos los topics que recibimos por mqtt. Entre ellos estará el nombre del gateway que le hayamos puesto al esp32 con la información que recibe de los dispositivos Bluetooth que tenga cerca:

Creamos los Dummys (sensores) en domoticz

Iniciamos domoticz, y vamos a:

Domoticz > Setup > Hardware

Creamos un Dummy virtual clicando sobre Create Virtual Sensors:

Nos vamos a:

Domoticz > Setup > Devices

Nos aparece el dummy que acabamos de crear. Anotamos su IDX.

Nos vamos a:

Domoticz > Switches

Editamos el Switch y asignamos en retardo de apagado 3 veces el tiempo de envío del dispositivo bluetooth, de esta manera mientras el dispositivo sea visible por el ESP el dummy estará encendido, pasados 3 veces el tiempo de envío el dummy se desactivará ya que no detecta presencia. Si no sabemos el tiempo de envío del dispositivo lo veremos en el siguiente paso.

El tiempo es modificable a gusto.

Localizamos el topic del dispositivo en el programa MQTT explorer

Abrimos de nuevo MQTT explorer. Buscamos el dispositivo. Debemos localizar el número MAC del dispositivo. Y, en caso de que no lo conozcas, el tiempo que tarda en refrescar la información.

Configuramos Node Red

Abrimos node red (Recuerda que accedemos a ella introduciendo la IP de nuestra raspberry seguido de :1880). Sigue las indicaciones de las imágenes:

A continuación cargamos el flow que os adjuntamos de la siguiente manera:

Introducimos en el recuadro siguiente texto (lo copiamos con control +c) y lo pegamos en el recuadro (con control + v):

[{"id":"2b5b81be.57c52e","type":"tab","label":"Xiaomi BLE","disabled":false,"info":""},{"id":"fe0f189d.6d9058","type":"mqtt in","z":"2b5b81be.57c52e","name":"","topic":"Topic del termometro","qos":"2","datatype":"auto","broker":"c79c32e0.62409","x":100,"y":20,"wires":[["219e80b1.1e741","dc17fd65.23078"]]},{"id":"dc17fd65.23078","type":"json","z":"2b5b81be.57c52e","name":"","property":"payload","action":"","pretty":false,"x":90,"y":100,"wires":[["d7b232f5.8169a","e18e775f.ac93b8"]]},{"id":"d7b232f5.8169a","type":"switch","z":"2b5b81be.57c52e","name":"Dispositivos (mac)","property":"payload.id","propertyType":"msg","rules":[{"t":"eq","v":"A4:C1:38:37:6F:FB","vt":"str"},{"t":"eq","v":"2","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":290,"y":100,"wires":[["7f8f10fa.9d4fe","b6949bd1.53b498"],[]]},{"id":"29f7ae4a.52aba2","type":"mqtt out","z":"2b5b81be.57c52e","name":"","topic":"domoticz/in","qos":"","retain":"","broker":"db11b21c.c9d5a","x":690,"y":280,"wires":[]},{"id":"67beef34.8e5a5","type":"json","z":"2b5b81be.57c52e","name":"","property":"payload","action":"","pretty":false,"x":530,"y":260,"wires":[["29f7ae4a.52aba2","4b0db05.fb4fb5"]]},{"id":"e18e775f.ac93b8","type":"debug","z":"2b5b81be.57c52e","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":110,"y":160,"wires":[]},{"id":"4b0db05.fb4fb5","type":"debug","z":"2b5b81be.57c52e","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":690,"y":220,"wires":[]},{"id":"631a5c7.18c45a4","type":"debug","z":"2b5b81be.57c52e","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":610,"y":140,"wires":[]},{"id":"7f8f10fa.9d4fe","type":"debug","z":"2b5b81be.57c52e","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":530,"y":80,"wires":[]},{"id":"219e80b1.1e741","type":"debug","z":"2b5b81be.57c52e","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":510,"y":20,"wires":[]},{"id":"b6949bd1.53b498","type":"function","z":"2b5b81be.57c52e","name":"Envio datos por mac","func":"var idx_tem=794\n var idx_hum=795\n var idx_vol=796\n var idx_bat=797\n var HUM_STAT=0;\n\n \n value_hum= msg.payload.hum\n \n \nif (value_hum < 30) {\n HUM_STAT=2;\n} else if ((value_hum >= 30) & (value_hum < 45)) {\n HUM_STAT=0;\n} else if ((value_hum >= 45) & (value_hum < 70)) {\n HUM_STAT=1;\n} else if (value_hum >= 70) {\n HUM_STAT=3;\n}\n value_tem= msg.payload.tempc.toString();\n value_vol= msg.payload.volt.toString();\n value_bat= msg.payload.batt.toString();\n value_hum_stat=HUM_STAT.toString();\n\n var msg1 ={};\nvar msg2 ={};\nvar msg3 ={};\nvar msg4 ={};\n msg1.payload = {\"command\":\"udevice\",\"idx\":idx_tem,\"nvalue\":0,\"svalue\":value_tem };\n msg2.payload = {\"command\":\"udevice\",\"idx\":idx_hum,\"nvalue\":value_hum,\"svalue\":value_hum_stat };\n msg3.payload = {\"command\":\"udevice\",\"idx\":idx_vol,\"nvalue\":0,\"svalue\":value_vol };\n msg4.payload = {\"command\":\"udevice\",\"idx\":idx_bat,\"nvalue\":0,\"svalue\":value_bat };\n \n \nreturn [[msg1,msg2,msg3,msg4]];","outputs":1,"noerr":0,"x":400,"y":180,"wires":[["67beef34.8e5a5","631a5c7.18c45a4"]]},{"id":"c79c32e0.62409","type":"mqtt-broker","z":"","name":"192.168.8.150:1883","broker":"192.168.8.150","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"db11b21c.c9d5a","type":"mqtt-broker","z":"","name":"192.168.8.150:1883","broker":"192.168.8.150","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

Y tras pegar el texto clicamos sobre IMPORT:

Veremos que se nos carga una pestaña nueva denominada Xiaomi BLE. Clicamos sobre ella:

Y veremos que se nos carga el flow completo. Vamos a configurarlo con nuestros datos:

Efectuamos doble click en Topic del termometro:

Clicamos en el lapiz:

Introducimos la IP de nuestro domoticz. Si tenemos USER y PASS de MQTT lo introducimos en Security y aceptamos con Add:

Nos aparecerá la IP correctamente cargada seguida del :1883 y clicamos en DONE.

Al volver a la pantalla anterior sustituiremos el texto «Topic del termómetro» por lo siguiente:

home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/#

Entramos en domoticz/in:

Buscaremos en el desplegable si aparece la IP de nuestra raspberry (que hemos introducido anteriormente) y lo seleccionamos:

Si no aparece clicamos sobre el lápiz y lo introducimos manualmente como en el paso anterior. Recuerda añadir el USER y PASS de MQTT si lo tienes habilitado.

Ahora clicamos sobre Dispositivos (mac):

Introducimos el número MAC copiado antes del programa MQTT explorer:

Volvemos a tener la pantalla inicial. Ahora configuramos los IDX de nuestros dummys creados anteriormente en domoticz clicando sobre Envío datos por mac y sustituimos el texto Envío datos por mac por Stratos y en el contenido de la función ponemos lo siguiente corrigiendo nuestro numero de IDX:

idx=NUESTROIDX

msg.payload = {"command":"switchlight","idx":idx,"switchcmd":'On' };

return msg;

Clicamos sobre DEPLOY arriba a la derecha.

Pueden ocurrir dos cosas, que nos cargue correctamente (lo ideal) o que nos aparezca desconectado. Si aparece desconectado revisa el server. Asegúrate de que has introducido correctamente la IP de tu raspberry- Y recuerda el USER y PASS de MQTT, tienes?  Lo has introducido correctamente?

Comprobamos el funcionamiento en domoticz

Una vez hemos clicado en DEPLOY y nos aparece domoticz/in como connected, nos vamos a domoticz y comprobamos que está funcionando correctamente.

Cómo localizar errores en node red

Os damos un truquito para vuestra información. Tenemos un node en el listado de la izquierda que se llama DEBUG. Cuando lo llevamos a la pantalla principal, lo conectamos a un node y lo activamos, nos dá mucha información (como un LOG) en la columna de la derecha del todo. Os explicamos con unas cuantas imágenes cómo conseguirlo:

Mantén el cursor pulsando la bola del final del recuadro del mqtt/in y arrástrala hasta la bola del inicio del recuadro del debug:

Clicamos sobre deploy:

Activamos la cucaracha y a la derecha nos aparecerá el debug con info de errores /( y así podremos analizar qué estamos haciendo mal) o info correcta:

Inicio automático de Node RED con Raspberry Pi

Recordar que por defecto Node RED está apagado. Podemos iniciarlo de dos formas diferentes: manual o automático.

Para inicio manual introducimos en puTTY:

node-red-start

Para que Node Red inicie de forma automática (tras caídas de red, o tras apagar y encender la raspberry) lanzamos el siguiente comando en puTTY:

sudo systemctl enable nodered.service

Script para detección de presencia BLUETOOTH

Tienes ya disponible un script específico para utilizar los dispositivos bluetooth en un sistema de detectores de presencia en: «Script para detección de presencia BLUETOOTH«.

Para cualquier duda o consulta tienes disponible el grupo de telegram «Domoticz a lo Spain» para entrar, ponerte cómodo y participar cuanto quieras.

Clica aquí para entrar en él

Cualquier duda, sugerencia o comentario será bien recibida en la web!