Hace tiempo que llevaba tiempo queriendo hacer este tutorial para poder controlar nuestra presencia en Home Assistant por habitación. De esta forma, podemos evitar tener que usar tiempo para algunas automatizaciones así como evitar que a mitad de la ducha se te apague la luz (no digo que me pase….me lo han contando :P).
El caso es que después de mucho buscar, hay diferentes formas de hacerlo, pero creo que la que más me ha gustado es la que al final voy a montar en casa. De momento ya lo he hecho funcionar y no va mal, aunque, tampoco podemos pedir una precisión de la nasa, pero para una casa, nos sirve más que de sobra. De hecho, podemos controlar por habitaciones o zonas de la casa si queremos para evitarnos tener en cada habitación un ESP32, aunque, en mi caso, es lo que más me ha gustado.
Funcionamiento del device tracker por habitación
La forma en la que el sistema funciona es sencilla. Tenemos dispositivo que llevemos encima siempre como puede ser una Mi Band, Amazfit Bip, etc. que sea capaz de mandar su identificador por medio de Bluetooth
Lista de la compra
La parte fundamental para poder hacer el tutorial es el ESP32, pero, voy a poner dispositivos con los que podéis hacerlo para que podáis elegir el que más os guste. si habéis probado con algún otro, podéis ponerlo en los comentarios y lo añadiré a la lista.
Necesario
- ESP32 que puedes conseguir aquí.
Dispositivos que funcionan
- Xiaomi Mi Band 3 que puedes conseguir aquí (usad el cupón BG18B3)
- Xiaomi Mi Band 4 que puedes conseguir aquí.
- Amazfit bip que puedes conseguir aquí.
Opcional
Si queréis cubrir bien el ESP32, podéis optar por alguna caja como esta.
Flasheamos el ESP32
Lo primero que tenemos que tener es el editor Atom con el plugin de platformIO instalado, para ello os podéis descargar de aquí Atom y luego dentro, en “Edit” / “Preferences” podéis ir a “+ Install” y buscamos “platformio”. Instalamos el platformio-ide y es posible que os pida algunas dependencias. Después de la instalación, os pedirá reiniciar y cuando abrís de nuevo Atom, veréis algo como esto:
¡Comenzamos!
Ahora toca descargar la última versión del software que vamos a meter en el ESP32, podéis descargar el zip desde aquí o bien clonáis el repositorio este. Una vez descargado el zip lo descomprimimos dentro de una carpeta o directamente, si lo hemos clonado, entramos a la carpeta.
Ahora cogemos el fichero Settings.h y lo copiamos con el nombre Settings_local.h.
Dentro de Atom, le damos a Open Folder (abrir carpeta) y buscamos la carpeta donde tenemos el proyecto (donde ha clonado el repositorio o donde hemos descomprimido el zip). Nos aparecerá algo así:
Ahora abrimos (pulsando sobre él) el fichero Settings_local.h y debemos ver algo así:
Ahí tenemos que configurar lo siguiente:
- ssid: el nombre de nuestra WiFi.
- password: la contraseña de la WiFi.
- hostname: El nombre que queremos para el dispositivo en la red.
- mqttHost: La ip de nuestro servidor MQTT, hay que respetar la forma de ponerlo.
- mqttPort: Puerto del servidor, por norma general, el 1883.
- mqttUser: Usuario que tengamos para usar nuestro servidor MQTT.
- mqttPassword: Contraseña del usuario del servidor MQTT.
- room: Habitación donde va a estar.
Antes de compilar, hay que verificar que tenéis las dependencias instaladas, podéis probar a compilar para ver si instala las dependencias, pero en mi caso, no lo ha hecho, para instalar las librerías que necesita, tendréis que ir a la pestaña de “PlatformIO Home” o el icono de la casa de la izquierda. Le damos a “Libraries” y en el cuadradito de búsqueda buscamos e instalamos:
- ArduinoJson
- AsyncMqttClient
- AsyncTCP
- ESPAsyncTCP
Por otro lado, me costó 2 días descubrir como solucionar el problema que daba al compilar:
ESP32-mqtt-room.ino:31:25: fatal error: ArduinoJSON.h: No such file or directory
Hasta que leí en el foro que se hablaba sobre este firmware, que dentro del fichero ESP32-mqtt-room.ino tenemos que buscar:
#include <ArduinoJSON.h>
Para reemplazar por:
#include <ArduinoJson.h>
La librería no es toda en mayúsculas y falla al compilar. Una vez hecho el cambio y las librerías instaladas, ya debería compilar sin problemas. Para poder compilar, pinchamos el ESP32 al microUSB (si tenéis otro ESP32 distinto al que yo he usado, igual necesitáis hacer uso de un USBttl) y le damos a la flecha de “upload”:
Si todo ha salido bien compilará y se subirá al ESP32 y se encenderán tanto el led rojo como el azul. Ahora viene la parte de afinar, os explico como funciona el firmware para que sepáis como afinar.
Ajuste del Mqtt room device tracker
El software realiza un escaneo cada x segundos durante y segundos para localizar los dispositivos que sea capaz de ver. En función de la fuerza a la que le llegue la señal hace una estimación de la distancia a la que se encuentran y, por medio de MQTT notifica de aquellos que están a menos distancia de la que le hemos definido en la configuración, es ahora donde viene a entrar en juego los parámetros del final de la configuración:
- scanInterval: Es el tiempo que deja entre cada escaneo, por defecto viene cada 5 segundos, pero podemos jugar con él según necesidades. Yo lo dejo ahí o lo subo a 10 segundos.
- singleScanTime: El tiempo que está escaneando, por defecto viene cada 5 segundos pero en mi caso he tenido siempre que subirlo porque si no, muchas veces no lo detecta aun estando cerca. Con 15 segundos parece ir.
- activeScan: Mejora la potencia y da mejores resultados, yo lo dejo a true
- bleScanInterval y bleScanWindow no los toco ya que son parámetros para que la antena sea compartida sin problemas entre el BLE y la WiFi.
- maxDistance: Dentro de la estimación de la distancia, la máxima que debe tener un dispositivo para ser notificado por MQTT, por debajo de esa distancia, notifica, por encima los ignora. Viene a 2 por defecto, pero yo he tenido que acabar poniendo 10 porque a 2 nunca me ha mostrado Mi Band 4.
Para realizar el ajuste, debemos saber la mac de nuestro dispositivo que si se trata de Mi Fit, lo tenemos en: Mi Fit / Perfil / Mi Smart Band (puede ser la 3, la 4, etc) / Bajamos al final y donde pone “Dirección Bluetooth”. Ahí veremos 6 grupos de 2 letras y números tipo 11:22:33:AA:BB:CC, esa será la mac que debemos buscar en el siguiente paso.
Monitorizamos la actividad del escaneo
Usamos por ejemplo el putty para conectar por terminal (por comodidad de cuando usaba Windows, lo tengo también en Linux). Con el ESP32 conectado al PC configuramos el putty así:
Una vez hecho esto, le damos a open y veremos como el ESP32 realiza escaneos cada x segundos (dependiendo de los tenemos en el settings) y ahí vemos la distancia a la que detecta nuestro dispositivo. Solo muestra los dispositivos que exceden de la distancia configurada en maxDistance. Es aquí donde debemos fijarnos en la distancia que muestra el ESP32 con nuestro localizador al movernos por la habitación para configurarlo correctamente y así estar “presentes” en la habitación cuando nos movamos. Si el dispositivo entra dentro de la distancia, lo notifica por MQTT y lo marca como que está en esa habitación, podéis empezar dejando la configuración por defecto y viendo la distancia que os indica ya que no es del todo precisa, por lo que habrá que poner que está a más distancia de lo real para poder tener un control del mismo.
Es posible que si compráis ESP32 con antena la precisión sea mucho mejor, ya aquí podéis jugar con esos parámetros.
Una vez que dais con la configuración correcta, se deja el ESP32 encendido y colocado en la habitación que corresponde y pasamos a configurarlo en Home Assistant.
Device tracker por habitación en Home Assistant
La configuración dentro de Home Assistant es sencilla, ya que necesitaremos poner 1 sensor por cada dispositivo a controlar, en mi caso, mi Mi Band y la de mi mujer y finalmente un sensor binario para indicar si el ESP32 (cada uno de ellos) está ON.
Para saber si el ESP32 está online o se ha caído, tenemos que poner un sensor binario:
binary_sensor: - platform: mqtt name: ESP32DESPACHO state_topic: "presence_nodes/despacho" json_attributes_topic: "presence_nodes/esp32_despacho/tele" payload_on: "CONNECTED" payload_off: "DISCONNECTED" device_class: connectivity
Para cada dispositivo, tendremos que poner esto:
sensor: - platform: mqtt_room device_id: "AABBCCDDFF11" name: 'Mi Band Edu' state_topic: 'room_presence' timeout: 30 away_timeout: 60
Reiniciamos y si todo ha ido bien, tendremos algo así dentro de nuestros dispositivos:
Depende del tiempo entre escaneos el cambio entre habitaciones será más rápido.
Si lo que queréis es hacer uso del sensor en alguna automatización, sería de esta forma:
- id: '7600004' alias: Edu esta en despacho trigger: - platform: state entity_id: sensor.mi_band_edu to: despacho action: - service: notify.telegramgrupo data: message: 'Edu está en el despacho'
El sistema funciona bien y la verdad es que cuando se consigue afinar el sistema puede ayudar a no tener temporizadores que pueden cortarse en un momento determinado. También puede servir para el control de la alarma.
El proyecto del device tracker por habitación está aquí por si queréis ver más info. Si necesitáis ayuda, ya sabéis donde podéis encontrarnos 🙂
Tengo una pregunta, de las de ir mala idea xD.
Que se podría usar para rastrear en lugar de esos dispositivos? Lo digo pensando en familiares rebeldes y/o mascotas, algo como esos llaveros localizadores