Home Metrics
Hola de nuevo, hoy vamos a implementar algunas cosillas referentes a nuestras casas y las cosas que podemos medir en ellas. Cuando por fin pudimos comprar una casa y vimos que la única forma de calentarla, sin quemar dinero con la chimenea o con gas, era mediante suelo radiante y aerotermia, aprovechamos que la casa había que rehacerla casi entera, y que en algún momento podríamos instalar placas solares, y lo metimos en el presupuesto. El aparato instalado dispone de una interfaz remota, en el cloud de la empresa fabricante, para controlar dos o tres características básicas que también podríamos implementar en Zabbix, pero por ahora iremos a la fuente, la distribuidora eléctrica. A mí me interesaría agrupar el gasto energético junto con el estado de la casa en un sólo panel de control para saber qué está pasando.
Una vez que tengamos paneles solares la parte del consumo eléctrico te la dan hecha pero yo quiero ampliar un poco más esta visión. Lo ideal sería tener las métricas de todos los sensores térmicos de la casa, proyecto todavía no realizado ya que los actuales son muy limitados, junto con el consumo eléctrico e incluso relacionarlo con el clima fuera de la casa. De estos tres factores, ahora mismo puedo implementar dos de ellos. El consumo eléctrico podemos obtenerlo mediante las lecturas que la distribuidora eléctrica proporciona, aunque no sea la compañía que mejor API ofrece. El clima podemos obtenerlo mediante el proyecto OpenWeatherMap.org.
Después de esta parrafada vamos a ensuciarnos las manos, si es que los trabajadores que realmente pringan, nos lo permiten. Lo primero que hemos hecho ha sido crearnos un contenedor para, con un agente Zabbix, agrupar estas adquisiciones de métricas y liberar un poco nuestro servidor. Como ya sabéis yo utilizo LXD y Ansible para preparar la infraestructura en casa con lo que si repasáis mi post anterior podréis tener una idea clara de cómo replicar este primer paso rápidamente. Nos vamos a centrar en el template oficial que utiliza la API de OpenWeatherMap.org. Una vez asociado al host que hemos creado hace un momento sólo debemos cambiar cuatro Macros heredadas de esta plantilla en nuestro host:
{$LOCATION} -> Longitud y latitud de la ubicación deseada
{$OPENWEATHERMAP.API.TOKEN} -> API obtenida tras darnos de alta en OpenWeatherMap
{$TEMP.CRIT.HIGH} -> Temperatura alta crítica para disparar alertas
{$LANG} -> Idioma
La latitud y la longitud la podremos sacar del propio Google Maps pinchando con el botón derecho en la ubicación donde se encuentra la casa.
Os recuerdo que la latitud es la primera cifra que aparece en el menú contextual cuando se pincha con el botón derecho sobre la ubicación. Evidentemente no es la ubicación de mi casa pero es una de mis playas preferidas. Volviendo al tema, realmente lo que hay que encontrar es la localización de la estación meteorológica más cercana. Para ello podemos ejecutar el siguiente comando en una shell:
curl -Ls "https://api.openweathermap.org/geo/1.0/reverse?lat=37.560&lon=-1.266&limit=5&appid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
[{"name":"Mazarrón","lat":37.5986534,"lon":-1.3138511,"country":"ES","state":"Region of Murcia"}]
De la respuesta podemos copiar la latitud y la longitud con los cuatro primeros decimales con lo que el valor de la macro sería éste: 37.5986,-1.3138
La API Key la debemos copiar de nuestra cuenta de usuario en el portal:
Evidentemente he suprimido la información sensible pero quería indicaros dónde podéis encontrar la API Key porque a mí al principio me costó un poco. La Macro que indica el idioma puede ser útil para pintar diversas situaciones sin recurrir a muchas transformaciones. Y la temperatura máxima crítica se utilizará para determinar cuándo nos llegará una alerta que no creo que necesitemos. También hay una temperatura mínima pero tampoco la considero necesaria, saltaría con -20ºC.
Una vez que tenemos los datos atmosféricos podremos utilizarlos para montarnos un panel a medida. Mi idea, como he comentado, sería mostrar juntos la temperatura exterior y el consumo eléctrico. Una vez que tengamos lecturas de los termostatos internos de la casa podríamos combinar los tres grupos de lecturas, pero ahora vamos a por el consumo.
El consumo, aquí en España, se puede consultar directamente con la distribuidora, en mi caso, i-DE, la nombro directamente porque el usuario no puede elegir, dependiendo de dónde esté tu casa perteneces a una o a otra. Lo que se puede cambiar es la comercializadora que es la que al final te factura. El problema de mi distribuidora es que no dispone de una API a la que se pueda atacar mediante un sencillo script en Python. Investigando posibles librerías para poder aligerar el trabajo me encontré con ésta. El usuario @hectorspert creó una clase en Python para obtener determinados valores. Precisamente el que me interesa a mí, el consumo diario repartido en 24 métricas, una por cada hora, no estaba implementado directamente en la clase Python pero ha sido muy fácil ampliar la funcionalidad manteniendo el espíritu. Algún día desempolvaré Golang para implementar estas lectura directamente en el agente, pero en este caso, como las métricas me las proporcionan en grupos prefiero enviarlas directamente a través de la API.
He creado un repositorio con los scritps y ficheros necesarios para montar un cliente dentro de la misma red que ejecute el comando principal enviando después los resultados a nuestro servidor de Zabbix. He añadido directamente la clase que os contaba antes con la ampliación de funcionalidad. No voy a detenerme mucho en esta configuración ya que podéis consultar el README del proyecto para hacerlo funcionar sin problemas. Para cualquier duda podéis contactarme en la misma página del proyecto e incluso enviarme algún pull request para mejorar el código.
De momento no tengo muchos widgets que mostrar en un dashboard de Zabbix relacionado con el estado de la casa. Por ahora sólo tenemos el consumo de electricidad por hora y la temperatura fuera de casa. A falta de tener más datos podemos crear un gráfico simple con la temperatura en la escala izquierda y los consumos referenciados en la escala derecha.
Como veis en la captura tenemos la temperatura de la ciudad en amarillo y en azul el consumo de la casa. El gráfico se alimenta de los dos ítems que os he contado a lo largo del post, la temperatura ambiental sacada de OpenWeatherMap.org y el ítem creado para recibir los datos de consumo de electricidad por horas que se envían desde el script que rasca la web de i-DE.
Como veis, el ítem es muy sencillo, es de tipo Zabbix trapper, ya que le llegarán los datos de forma externa, el tipo de dato es float y nos llega en forma de vatios por hora. Almacenaremos los datos concretos durante 90 días y unos trends más longevos por si queremos analizar comportamientos en el futuro.
Ya sé que hay métodos más sencillos de controlar los temas relacionados con la domótica pero como Zabbix es lo que controlo más y lo utilizo para más cosas creo que optaré por esta vía de momento.
Para despedirme os compartiré el nuevo single de Jordana B, Mar Menor, ya no es que hablen de un lugar que amo, sino que la letra es buenísima. Os enlazo también la noticia de la publicación, sin que sirva de precedente, ya que su sello es Subterfuge, otro lugar común como el Mar Menor pero que descubrí más tarde, cuando empezamos a ir a festivales allá por los noventa tardíos...ay, escenario del lago del Festimad, cómo te echamos de menos.
Enjoy!