Cambiar el agua del aire acondicionado mediante IoT

Si tienes aire acondicionado, uno de los defectos que más se encuentran en estos aparatos es cómo deshacerse del agua de condensación del mismo, especialmente en verano. Si eres como yo o como la mayoría de la gente, lo que harás será poner una botella en algún sitio accesible que se va llenando poco a poco y que, periódicamente, tendrás que cambiar para que no se desborde. Pero, en tiempos calurosos y ajetreados es muy común que la botella (sea del tamaño que sea) termine llenándose y mojemos a quien sea que tengamos debajo del aire acondicionado.

Esta dinámica, que a mi se me antoja muy molesta, la llevo repitiendo en casa y en la oficina (si, en mi oficina tengo un aire acondicionado con botellita) durante varios años y siempre me planteo, ¿y si hago algo para que me avise justo cuando está apunto de llenarse y así puedo cambiarla a tiempo? Hasta el momento no había tenido tiempo, pero ahora he encontrado un ratillo y me he puesto manos a la obra.

Los requisitos eran sencillos, necesito saber si el nivel de agua de una botella ha llegado a cierta altura en la botella, no necesito saber el % exacto, pero si saber si se esta llenando antes de que se llene. Hay algunos sensores de ultrasonidos para depósitos, pero me parecía matar moscas a cañonazos, además, el tamaño de la botella podía ser variable, por lo que el sensor no tendría que ser muy aparatoso. Buscando encontré este:

Puede funcionar a 3.3v o 5v y básicamente devuelve un valor analógico distinto según por donde le llegue el agua en la parte inferior. Este es el enlace de compra en amazon: https://www.amazon.es/dp/B07DJ5FZ31

Por otro lado quería que la solución fuese portable, es decir, que no tuviese que andar echando cables por ahí, por lo que una solución que admitiese baterías también era recomendable. Como plataforma yo estoy muy acostumbrado a usar ESP32 y me hacía mucho más sencillo la parte de conexión a la wifi, así que buscando encontré esto:

Un ESP32-C3 que tiene un puerto para batería que se puede recargar mediante usb, me fue casi más complicado hacerme con las pilas LS16340

Con todos los componentes solo me quedaba conectar el ESP32-C3 al sensor, teniendo cuidado de no usar el pin que se usa para medir el voltaje de la pila (spoiler, es el A0 y lo descubrí después de haberlo soldado). El esquema sería tal que así:

Todo soldado para probar quedaría así:

Y ahora lo interesante, que sería programarla para que podamos controlar el nivel de agua. Como las especificaciones no son siempre exactas lo que hice fue unas pruebas leyendo el nivel del GPIO04 (que tiene conversor A/D) y meter y sacar el sensor del agua imprimiendo por el puerto serie los valores obtenidos:

#define A1 4
void setup() {
  // (Optional)Press reset button
  // on the dev board to see these print statements
  Serial.begin(115200);
  while (!Serial) { }
  // Configuramos el pin A1 como de entrada analógica
  pinMode(A1, INPUT);
  delay (1000);
  Serial.println("Starting...");
}

void loop() {
  int sensorValue = analogRead(A1);
  Serial.println(sensorValue);
  delay(1000);
}

Nota: Esto lo he compilado usando platformio.io (os lo recomiendo mucho) y os dejaré el proyecto completo en un repositorio para que podáis compilarlo vosotros también.

Una vez compilado e instalado el programa veíamos por el puerto serie cada segundo el valor que leíamos del sensor, obteniendo valores entre cero y 3000 (supongo que el rango máximo será Vin que en nuestro caso es 3.3v), así que nuestro valor «umbral» será de 2000 (no se ha llegado todavía arriba del todo pero ya hay agua mojando el sensor).

El siguente paso es conectar a internet para que nos pueda mandar la alerta. Esto en ESP32 es relativamente sencillo:

#include <WiFi.h>

void printWifiStatus() {
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}
boolean connectWifi (char *ssid, char *pass){
  WiFi.useStaticBuffers(true);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  int max = MAXATTEMPS;

  Serial.println("Connecting to WiFi");
  while ((WiFi.status() != WL_CONNECTED) && --max>0) {
    delay(500);
    Serial.print(".");
  }
  if (max == 0)
    return false;
  Serial.println("Connected to WiFi");
  return true;
}

Con esto solo hay que añadir una llamada a connectWifi parándole el SSID y la contraseña de nuestra red wifi para tener conexión. Una vez que tenemos conexión podemos hacer varias cosas para hacernos llegar una alerta, pero la más sencilla para mi era hacer que me enviase un mensaje por telegram. Para ello habría que crear un bot (hablando con botfather) y obtener el token necesario para poder usarlo. Luego he creado un canal y he puesto a este bot como administrador, con lo que para utilizar este bot solo tendría que hacer estos defines:

#define BOTTOKEN "7413559559:AAHmlkmiubcvtxZO0j0nqITZjByjrS1Ah3U"
#define CHAT_ID "-1002245988095"

y usar la librería Universal-Arduino-Telegram-bot, que podéis encontrar en https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot de esta manera:

#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

WiFiClientSecure client;
UniversalTelegramBot bot(BOTTOKEN, client);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);

bot.sendMessage(CHAT_ID, "esto es un mensaje");

Así que la lógica del programa cambia ahora a que cuando el valor detectado sea mayor que 2000 enviemos un mensaje con el bot para alertarnos.

El programa lo he mejorado para leer el valor de voltaje de la batería y para que entre en suspensión y se despierte cada 10 segundos para ahorrar energía, pero eso podéis sacarlo de los ejemplos que hay en el repositorio https://github.com/Xinyuan-LilyGO/LilyGo-T-OI-PLUS. El caso es que ahora tenía que hacer el montaje final en mi botella de agua del aire acondicionado. Elegí un bote de estos gigantes de proteinas (si, alguien en casa va al gimnasio) y tras impermeabilizar adecuadamente los cables y las conexiones decidí meter el sensor por la parte superior del tapón y así antes de llegar arriba del todo haría el contacto adecuado y quedó tal que así:

Y ya con el tubo del aire metido y todo:

Si queréis ver el resultado final (probando con una taza con agua, que no voy a esperar que se llene el bidón este) os dejo aquí un video:

El repositorio con el código inicial podéis encontrarlo en: https://github.com/yoprogramo/waterlevel

Cómo hacer que tu casa te reconozca

A ver, en realidad esto ha sonado mejor de lo que realmente es, pero, ¿te gustaría poder decirle a tu casa que estás dentro para que sepa si hay que lanzas una alarma o simplemente saludarte? Pues algo muy similar vamos a poder hacer con home assistant, por lo que te recomiendo que te leas la entrada anterior si quieres continuar con ésta.

Si tienes home assistant ya instalado hay un concepto que puede parecer extraño al principio, pero que es fundamental para lo que queremos hacer, el concepto de «persona». Puedes acceder al menú de personas desde Configuración -> Personas:

Este menú te dará opción a crear todas las personas relevantes para tu casa y te permitirá hacerles seguimiento… Básicamente lo que queremos es saber si están dentro o fuera de la casa para tener esa información disponible para nuestras automatizaciones (o para saberlo cuando nos llega un paquete de Amazon y queremos saber si hay alguien en la casa, por ejemplo).

¿Seguimiento?

Para poder hacer el seguimiento de una persona necesitamos que ésta nos informe de una manera o de otra de su situación con respecto a la casa, eso en home assistant se hace con os device.trackers que son, ni más ni menos, que la parte de código que recibe la información de la situación de un dispositivo. Hay un montón de trackers que os invito a explorar para ver cual es el más adecuado para vosotros. Como mi objetivo es que el seguimiento sea transparente y consuma la menor cantidad posible de datos y energía os voy a proponer dos tackers que, además, son muy sencillos de configurar:

1. Aplicación de home assistant

Tenéis disponible en vuestra tienda favorita la aplicación home assistant que os da acceso remoto a vuestra instalación (bueno, lo de remoto lo veremos en otra entrada, que tiene su miga) y que, además, permite al móvil comunicarse con home assistant para darle datos sobre la localización del dispositivo (y otras cosas como si está cargando o no y la cantidad de carga restante que tiene).

Una vez instalada la aplicación veremos que aparecen entidades nuevas en home assistant y que podremos ponerlas en e interfaz o, como es el caso, utilizarla como sistema de seguimiento para una persona… Para ello solo tenemos que acceder al menú personas, crear la persona si todavía no existe y editarla, lo que nos llevará a una pantalla como esta:

En la parte de «Rastrear dispositivo» veremos que en el desplegable nos aparece un device_tracker con el nombre del móvil donde hemos instalado la aplicación. Lo seleccionamos, grabamos y, a partir de este momento la casa nos tendrá localizados.

2. Usando un tracker bluetooth

Esto está bien, pero igual no queremos que todos los miembros de la familia tengan que instalarse la aplicación móvil, así que buscando otro método para saber si están o no en casa me encontré con que todos en la familia tenemos activo el bluetooth del teléfono (para conectar con los altavoces, los cascos, el coche, o lo que sea…) si eso es así podríamos hacer que la raspberry (que tiene bluetooth integrado) nos localice siempre que estemos a una distancia que permita llegar al bluetooth de nuestro teléfono. Dicho y hecho, para configurar este comportamiento solo hay que usar el bluetooth tracker y poner lo siguiente en el archivo configuration.yml:

device_tracker:
  - platform: bluetooth_tracker

Luego solo tenemos que reiniciar el sistema y automáticamente nos creará un archivo known_devices.yml que contendrá todos los dispositivos bluettoth que ha detectado y permite ponerles nombre y decidir si vamos a seguirlos o no (por defecto sigue a todos los nuevos, por lo que es recomendable cambiar ese comportamiento cuando ya estén detectados todos los dispositivos). Si no aparece vuestro móvil en un rato lo mejor es que pongas el móvil a buscar dispositivos bluetoot para tenerlo activo mientras reinicias home assistant y así te aseguras de que lo detecta.

Una vez detectados los móviles que nos interesa solo tenemos que volver a personas y repetir el mismo procedimiento… A partir de ese momento podremos saber si están en casa o no (o al menos los móviles) y verlo en el interfaz:

Automatiza tu casa

Creí, francamente, que ya había escrito sobre el tema de la domótica en mi blog, pero revisando me he encontrado que no he escrito casi nada sobre el tema, así que comienzo ahora a desvelaros, muy poco a poco, qué es esto de la automatización y cómo puedes controlar tu casa y hacerla más inteligente con un coste ridículo (y aprendiendo un montón).

domótica

Como resumen, la domótica aglutina todo lo que podemos controlar de manera remota 8o programar localmente) en nuestro hogar. Son esas cosas que nos permiten encender la calefacción horas antes de que lleguemos de un viaje, abrir y cerrar persianas sin que estemos o apagar y encender luces cuando se detecta nuestra presencia. Dado que esto es un campo muy amplio, os recomiendo que visitéis webs más especializadas para descubrir el montón de cosas que se pueden hacer. Yo, por mi parte, iré recopilando las cosas interesantes que voy haciendo por si os sirve de algo.

Lo primero…

Para poder «jugar» un poco con la domótica necesitamos algún controlador en el que centralizar todas estas opciones. En mi caso me he decidido por home assistant, que tiene un montón de información en internet y del que disponéis de plugins y librerías para cadsi todo. La instalación es tremendamente sencilla si vamos a utilizar una raspberry pi (recomiendo que sea la 4, pero la 3 también nos serviría igualmente). La guía de instalación para raspberry pi está bastante bien y la podéis encontrar en este enlace.

El proceso consiste, básicamente, en descargarte la imagen de internet, grabar con esa imagen una tarjeta SD y si tenéis conexión por cable simplemente meter la sd en la rasperry, enchufar el cable de red y esperar a que arranque, tendréis el sistema de configuracion en la url http://homeassistant.local:8123/. Si vais a usar wifi desde el primer momento el proceso es un poco más complicado, básicamente consiste en copiar este archivo (modifica a tu gusto el SSID y contraseña) en la particion de boot del SD que acabáis de grabar (en CONFIG/network/) y llámalo my-network:

[connection]
id=my-network
uuid=72111c67-4a5d-4d5c-925e-f8ee26efb3c3
type=802-11-wireless

[802-11-wireless]
mode=infrastructure
ssid=MI_SSID
# Uncomment below if your SSID is not broadcasted
#hidden=true

[802-11-wireless-security]
auth-alg=open
key-mgmt=wpa-psk
psk=MI_CONTRASEÑA_WIFI

[ipv4]
method=auto

[ipv6]
addr-gen-mode=stable-privacy
method=auto

En fin, una vez que tengáis home assistant instalado toca poner los datos tuyos y los del domicilio donde vas a instalarlo y el sistema se encargará de buscar por red las integraciones a las que pueda acceder directamente.

En siguientes entradas veremos aspectos interesantes sobre cómo configurarlo para tener acceso a dispositivos zigbee, a detectar presencia propia o a hacer automatizaciones… Por ahora intentad tener el controlador preparado e id buscando dispositivos para hacer de vuestra casa una casa inteligente.