Domotizar Aire Acondicionado (parte 2)

Es comodísimo poder encender el aire acondicionado de casa 15 minutos antes de que vayamos a llegar, lo cual podríamos hacer ejecutando los comandos de la entrada anterior con una simple aplicación en el móvil, como SSH Button. También estaría bien poder leer la pantalla del panel de control del aire acondicionado, y para poder actuar en consecuencia.

En la entrada anterior, veíamos que el panel RC-E4 (o E5) tiene un solo botón para encender y apagar el sistema. Y eso es un problema a la hora de automatizarlo, ya que cuando le mandamos la orden de pulsar el botón de encendido, no sabemos si el estado resultante de esta acción será que el aire acondicionado se encienda o se apague, ya que dependerá de si estaba encendido o apagado anteriormente… (no se si me explico…).

Para solventar este problema necesitamos la información que nos da el panel. Dependiendo de cual sea la información que queramos obtener, tenemos varias posibilidades. Si solo queremos saber si el aire está encendido o apagado podríamos pegar una resistencia LDR frente al led de encendido que tiene el panel, y ya lo tendremos solucionado (dependiendo del valor que leamos de esta resistencia, sabremos si el led está encendido o no). Por el contrario, si lo que queremos saber es la temperatura a la que se ha fijado el sistema, el modo de funcionamiento (frio, calor, ventilación, …), velocidad del ventilador, etc.,  lo que necesitamos es leer la pantalla del panel.

Como siempre, no me gusta hacer un sistema que quede limitado, y que dentro de un tiempo cuando quiera implementar algo más, tenga que desarrollar todo de nuevo, por tanto la opción de la resistencia LDR la dejo como algo trivial de implementar, y voy a optar por la opción de leer la pantalla del panel mediante una webcam y un framework de visión artificial, openCV. Además por casa tenia una webcam que no estaba usando para nada, una Foscam FI9821 que puedo reciclar para este uso. En principio nos serviría cualquier cámara, que pudiese sacar una imagen nítida de la pantalla.

Como muestra os pongo esta imagen, capturada con esta cámara:

Después de muchas pruebas, con esta ubicación de la cámara es posible ver la pantalla del panel, y el resto del sistema. Al final me he decidido por esta panorámica porque así sería posible, si quisiera, leer también el estado de los relés ya que la placa dispone de unos leds que se encienden y se apagan… Además si algo raro pasa con el sistema, podría verlo con la cámara…

¿Cual será nuestro siguiente paso? Pues localizar las zonas de interés en la imagen. Si miráis las características de la cámara Foscam FI9821, veréis que es una cámara PTZ, es decir que puede rotar para cambiar de punto de vista, y cuando se reinicia, va a un punto de vista inicial. Por este motivo es posible que la imagen varíe ligeramente entre reinicios. Por tanto un punto de interés que ahora está en la posición X,Y de la imagen, después de reiniciar la cámara este en la (X+5, Y-12). Esto lo solucionaremos con el Template Matching, una técnica que vamos a implementar con openCV, muy fácilmente. Tenéis más información aquí y un ejemplo gráfico aquí. Es importante que al menos miréis el ejemplo gráfico anterior para que veáis donde queremos llegar.

Lo que vamos a hacer es localizar donde está la pantalla dentro de la imagen, y donde está el led que nos indica que el aire acondicionado está encendido.

Para localizar el panel, vamos a buscar el siguiente patrón en la imagen completa de la cámara:

El resultado que obtenemos aplicando el método SQDIFF es el siguiente:

Como podéis observar, aunque el patrón no esté en la imagen, la zona más parecida sí que coincide con la pantalla del panel de control. Pues ya lo tenemos. Ya sabemos, dada una captura de imagen de la cámara, en qué zona deberemos buscar la información de estado.

De forma similar podemos buscar el led de encendido. Pero, dado que es una zona muy pequeña, la posibilidad de que haya falsos positivos en la búsqueda es grande, por tanto vamos a acotar la zona de búsqueda bastante. Como se ve en la imagen completa, muy cerca del led, tenemos la etiqueta ON/OFF, pues lo que haremos será buscar ésta, y luego aplicar la búsqueda del patrón del led encendido y apagado en la zona que está unos píxeles mas a la derecha y más hacia arriba. A continuación veis la búsqueda del patrón en la imagen completa:

Veis en el recuadro, la zona encontrada, y que a la derecha y algo más arriba podemos encontrar el led encendido. Definimos una subimagen, sobre esa zona y hacemos una búsqueda de los patrones del led encendido, y del led apagado para ver cual nos da mejor resultado. La zona debe ser algo grande, para que uno de las dos búsquedas caiga justo donde sabemos que esta el led, y la otra lejos de esa zona, así sabremos cual el la correcta (la que nos de como encontrada en la posición justa del led):

Led encendido

Led apagado

Podéis ver mejor como localizo el led encendido o apagado en el código fuente (función isOn()) del programa que implementa todo esto. El programa que comprueba si el aire acondicionado está encendido o no, es check_on_off, y el otro con el que podeis hacer pruebas de búsquedas de una plantilla en una imagen es search.

El código es supersimple. Podéis usar el código de search como base para hacer vuestras propias búsquedas con las imágenes de prueba que hay en el directorio origenes, y los patrones de la carpeta patrones. Una cosa importante que debéis tener en cuenta es que la imagen original y el patrón deben estar en la misma escala, si no, no se encontrará el patrón en la imagen original.

Otro ejemplo de búsqueda del siguiente patrón:

El código fuente de todo el programa, y las imágenes de prueba, las tenéis, como siempre, en mi repositorio de Github.

Vale, ya tenemos un programa que me comprueba si el aire acondicionado está encendido o apagado cuando lo ejecuto, pero… ¡yo quiero encenderlo y apagarlo desde mi móvil!. Ok, vamos a ello. Lo primero que necesitaremos es un script me que haga una captura de pantalla de lo que ve la cámara, y se la pase al programa check_on_off, y que según el valor que este devuelva, ejecute la acción que simule la pulsación del botón de encendido (si procede).

El script encender.sh quedaría así:

Es muy fácil de entender, pero lo explico por si acaso:

  1. Vamos al directorio donde tengo el programa, a /mnt/Data/devel/jaire.ok
  2. Hacemos una captura de lo que ve la cámara. La URL dependerá del modelo de cámara que tengáis, así como la resolución de la imagen. Se guardará con el nombre 00000001.jpg.
  3. La convertimos al tamaño correcto (comando convert de imagemagick), para que nuestros patrones estén a la misma escala que la imagen original. Aquí debo decir que cuanto más pequeña sea la imagen, más rápida será la búsqueda, aunque aumentará la posibilidad de falsos positivos. Tenéis que encontrar un punto medio, mediante prueba y error.
  4. Le pasamos la imagen al programa, y almacenamos el valor de retorno en RESULTADO.
  5. Si el resultado es 0 (OFF), pulsamos el botón para encender el aire acondicionado (ver entrada anterior).
  6. Si hay algún error me manda un correo electrónico, y al finalizar otro (mas información en esta entrada).

 

Ahora nos queda hacer que esto funcione desde nuestro móvil. Para ello deberemos tener nuestro servidor SSH accesible desde Internet (tendréis que instalarlo si no lo tenéis ya, y abrir el puerto correspondiente para que funcione). Este paso no lo voy a explicar, ya que en cada router se hace de una manera diferente y en la red hay guías para todos ellos.

La aplicación de móvil que uso yo se llama SSH Button, es facilísima de usar. Simplemente pulsáis en la opción Add, y nos pedirá los datos de conexión de nuestro servidor (hostname o ip publica, username, password, port), la etiqueta que le pondrá al botón, y la ruta completa del comando a ejecutar. No tiene más:

Al pulsar Ok, o creará el botón. A mi me queda así, después de crear los dos botones (para encender y para apagar):

Pero si no queréis tener que entrar a la aplicación cada vez que queráis pulsar los botones, también tiene la opción de crear un widget con los botones directamente en lo pantalla, y quedaría más o menos así:

¿Qué os parece? Con esto ya podremos encender y apagar nuestro equipo de aire acondicionado desde el móvil sin esfuerzo… Bueno, sin esfuerzo a partir de ahora, jajajajajaaaa.

Un saludo a todos, y ya sabéis, si tenéis alguna duda o sugerencia, bienvenida será 🙂

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *