¡Damas y caballeros, bienvenidos! como lo prometido es deuda, hoy mostraré cómo monitorizar el SAI o UPS por medio de Grafana. Si bien en este artículo ya comenté las razones porqué debemos tener un SAI o UPS, ahora nos será de mucha utilidad la visualización de las métricas del mismo, cuyo objetivo es que nos quede una interfaz así:

Lo que no se mide no se conoce, y lo que no se conoce no se mejora.
Qué se necesita para monitorizar en Grafana?
Hardware:
- Servidor NAS Synology
- Un SAI o UPS con puerto de gestión. En mi caso va por un cable USB tipo A. Este debe estar ya conectado y reconocido por el servidor.
Software (todas a través de docker para DSM):
- Docker para DSM (obvio). 🙂
- Node-RED
- InfluxDB
- Grafana
Instalación de Docker para DSM
Si no lo tenemos instalado, será tan sencillo como ir al centro de paquetes e instalar docker con todas sus dependencias, unos pasos muy sencillos los cuales mostré en este tutorial donde expliqué como instalar Tautulli, el monitorizador de métricas para Plex.

Instalación de Node-RED
Node-RED es una herramienta de programación para dispositivos físicos de la forma más visual posible. Este será el que recolecte los datos del dispositivo SAI o UPS y escribirlos en la base de datos InfluxDB, para posteriormente ser mostrados en Grafana.
Descargaremos la última versión de imagen de la siguiente manera:

Luego vamos a la pestaña Imagen, hacemos doble clic en la imagen de nodered:latest y asignamos manualmente un puerto en ambos espacios para evitar que docker los cambie en cada reinicio u otra razón de manera autónoma, en mi caso coloqué el 1880

Agregaremos los permisos a la carpeta de Node-RED dentro de nuestro directorio en DSM al usuario SYSTEM:

Seleccionamos Crear en Usuario o grupo buscamos SYSTEM y seleccionamos todos los tipos de permisos:

guardamos los cambios, volvemos a Docker y procedemos a iniciar nuestro nuevo contenedor. Una vez iniciado el contenedor debemos ver la IP del contenedor para ello, hacemos doble clic en el contenedor → Terminal → Crear seleccionamos bash y escribimos lo siguiente:
ip addr show

Iremos al panel de control en DSM y colocaremos las siguientes direcciones IP:
- IP de tu router
- 127.0.0.1 (IP local)
- La IP del contenedor de Node-RED

Accederemos vía web usando la dirección IP de nuestro servidor NAS y colocaremos el puerto 1880:
192.168.x.x:1880
Y se nos abrirá la interfaz de Node-RED.

Instalando los Palettes de Node-RED
Explicado de forma rápida, son los complementos que nos servirán para extraer los datos para del SAI o UPS. Instalaremos el primer Palette de la siguiente manera:

Y en la pestaña Install buscaremos el llamado: node-red-contrib-nut-ups y los instalaremos:

Haremos el mismo procedimiento de buscar e instalar node-red-contrib-influxdb:

Configuración de los parámetros:
Una vez instalado, iremos nuevamente al mismo menú, y le damos a Import, y pegaremos ahí el siguiente código:
[ { "id": "53523a1d4c303bd3", "type": "inject", "z": "4099c5dccb66c888", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "30", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 210, "y": 480, "wires": [ [ "9e417e89d417f556" ] ] }, { "id": "9e417e89d417f556", "type": "nut-ups", "z": "4099c5dccb66c888", "name": "USV", "ups": "[email protected]", "x": 390, "y": 500, "wires": [ [ "7e9d835747459253", "923c0f03b5788c0c", "bbf37ac2eff2ba5a", "ce9223f0798d6f68", "e614e4e3e265ee95" ] ] }, { "id": "43a2037dde5ccfbd", "type": "influxdb out", "z": "4099c5dccb66c888", "influxdb": "9ce7ad86b9f1c7fe", "name": "", "measurement": "usv.percent", "precision": "", "retentionPolicy": "", "database": "database", "precisionV18FluxV20": "ms", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1110, "y": 400, "wires": [] }, { "id": "923c0f03b5788c0c", "type": "change", "z": "4099c5dccb66c888", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.battery.charge.value", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 400, "wires": [ [ "5e1d3fee95628880" ] ] }, { "id": "1fd81b52aabbfb6e", "type": "influxdb out", "z": "4099c5dccb66c888", "influxdb": "9ce7ad86b9f1c7fe", "name": "", "measurement": "usv.input.volt", "precision": "", "retentionPolicy": "", "database": "database", "precisionV18FluxV20": "ms", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1120, "y": 460, "wires": [] }, { "id": "bbf37ac2eff2ba5a", "type": "change", "z": "4099c5dccb66c888", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.input.voltage.value", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 460, "wires": [ [ "1eb15d241c8a4454" ] ] }, { "id": "ce9223f0798d6f68", "type": "change", "z": "4099c5dccb66c888", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.ups.load.value", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 520, "wires": [ [ "560f47a5eff8ec1e" ] ] }, { "id": "8c5ce3f3e9251c0a", "type": "influxdb out", "z": "4099c5dccb66c888", "influxdb": "9ce7ad86b9f1c7fe", "name": "", "measurement": "usv.load", "precision": "", "retentionPolicy": "", "database": "database", "precisionV18FluxV20": "ms", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1100, "y": 520, "wires": [] }, { "id": "e614e4e3e265ee95", "type": "change", "z": "4099c5dccb66c888", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.battery.voltage.value", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 580, "wires": [ [ "a442424696d38f09" ] ] }, { "id": "7fac48939cc8e9a2", "type": "influxdb out", "z": "4099c5dccb66c888", "influxdb": "9ce7ad86b9f1c7fe", "name": "", "measurement": "usv.akku.volt", "precision": "", "retentionPolicy": "", "database": "database", "precisionV18FluxV20": "ms", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1120, "y": 580, "wires": [] }, { "id": "a442424696d38f09", "type": "function", "z": "4099c5dccb66c888", "name": "function 1", "func": "msg.payload = Number(msg.payload);\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 860, "y": 580, "wires": [ [ "7fac48939cc8e9a2" ] ] }, { "id": "560f47a5eff8ec1e", "type": "function", "z": "4099c5dccb66c888", "name": "function 2", "func": "msg.payload = Number(msg.payload);\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 860, "y": 520, "wires": [ [ "8c5ce3f3e9251c0a" ] ] }, { "id": "1eb15d241c8a4454", "type": "function", "z": "4099c5dccb66c888", "name": "function 3", "func": "msg.payload = Number(msg.payload);\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 860, "y": 460, "wires": [ [ "1fd81b52aabbfb6e" ] ] }, { "id": "5e1d3fee95628880", "type": "function", "z": "4099c5dccb66c888", "name": "function 4", "func": "msg.payload = Number(msg.payload);\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 860, "y": 400, "wires": [ [ "43a2037dde5ccfbd" ] ] }, { "id": "9ce7ad86b9f1c7fe", "type": "influxdb", "hostname": "192.168.23.139", "port": "8086", "protocol": "http", "database": "grafana", "name": "grafana", "usetls": false, "tls": "", "influxdbVersion": "1.x", "url": "http://192.168.23.139:80863", "rejectUnauthorized": false } ]

Una vez insertado, veremos como se nos creará un diagrama con todos los parámetros que con toda la información que extrae del dispositivo SAI o UPS y posteriormente escribirá en la base de datos:

Haremos doble clic con ratón en el rectángulo que dice USV y se nos abrirá un menú lateral en el cual colocaremos la IP de nuestro servidor siguiendo exactamente el mismo formato a continuación:

Agregar un debug (opcional)
Podremos agregar una nueva function llamada debug (opcional pero importante), la cual nos mostrará toda la información que extrae Node-RED en tiempo real de nuestro SAI o UPS, así como la visualización de posibles errores. Para ello, es tan sencillo como arrastrar la function a nuestro diagrama y lo conectaremos a USV y presionamos el botón superior derecho rojo Deploy:

Importante: en caso que no se muestre la barra lateral, es tan sencillo como activar la siguiente opción:

Verificando IP en cada una de las lecturas.
Es recomenble también en cada uno de los influx out, que contengan dirección IP de nuestro servidor:

Haciendo doble clic en cada uno de ellos, se abrirá la barra lateral en la cual veremos que al lado del nombre entraremos en el siguiente icono con forma de lápiz que posteriormente nos mostrará la dirección IP que deberá tener el servidor y el puerto que posteriormente asignaremos al contenedor de la base de datos:

Lo dicho, confirmamos en cada uno de ellos que esté la IP de nuestro servidor NAS y el puerto 8086 el cual será usado más adelante para InfluxDB:

Una vez pongamos / verificamos dichos valores, guardaremos los cambios con los botones rojos correspondientes, y una vez volvamos al apartado donde se encuentra nuestro diagrama, hacemos clic en el recuadro dentro de timestamp:

y veremos el siguiente mensaje:

Y para guardar los cambios generales nuevamente volveremos a presionar el boto rojo Deploy.
Instalación de InfluxDB
Esta instalación será un poco distinta a la anterior, ya que primero crearemos en el directorio de docker donde están el resto de contenedores varias carpetas, en las cuales se guardará no solo el contenedor como tal, si no también todos los ficheros del mismo. Iremos a la carpeta docker y crearemos las carpetas una dentro de otra de manera consecutiva:
- Creamos la carpeta influx y entramos dentro de ella.
- Creamos la carpeta etc y entramos dentro de ella.
- Creamos la carpeta influxdb y entramos dentro de ella.
Y dentro de la carpeta influxdb, descargaremos, descomprimimos y arrastraremos el siguiente fichero:
➡️influxdb.conf⬅️

El fichero influxdb.conf puede ser abierto con el bloc de notas perfectamente para explorar su contenido.
Volvemos a la carpeta influx que creamos anteriormente y agregaremos los permisos a SYSTEM de la misma forma que hicimos para la de Node-RED:

Importante marcar la opción «Aplicar a esta carpeta, subcarpetas y archivos»

Volvemos a la carpeta raíz Influx (en la misma donde se encuentra etc) y, nuevamente crearemos las carpetas una dentro de otra de manera consecutiva:
- Creamos la carpeta var y entramos dentro de ella.
- Creamos la carpeta lib y entramos dentro de ella.
- Creamos la carpeta influxdb y entramos dentro de ella.
Nos quedará algo así:

Volvemos a la ventana principal de Docker → Registro buscamos el contenedor Influxdb y seleccionaremos la version 1.8.9. Una vez lo descarguemos, volvemos a la ventana Imagen, hacemos doble clic sobre la imagen influxdb1.8.9 y configuraremos lo siguiente:
- Vamos a Configuración avanzada → Volumen → Agregar carpeta y añadiremos las mismas que previamente creamos manualmente. Fijaros a continuación en la ruta de montaje resaltada que cada una debe de tener, las cuales debemos escribir manualmente:

- Luego iremos a la pestaña Configuración de puertos y escribimos ese que ya previamente teníamos en la configuración de Node-RED, el 8086:

- Luego iremos a la última pestaña de Medios y escribiremos los siguiente en el apartado de Comando:
influxd -config/etc/influxdb/influxdb.conf

Aplicamos los cambios e iniciaremos el contenedor.
Crear una base de datos InfluxDB en Docker DSM
Volvemos a la pestaña Contenedor en la misma ventana de Docker, hacemos doble clic en el contenedor Terminal → Crear hacemos clic en Bash y escribimos lo siguiente:
influx
create database grafana with duration 720d
Si queréis que la duración de retención, de la base de datos sea de un año, podéis usar 365d
use grafana

Instalación de Grafana
Siguiendo los pasos similares que los anteriores contenedores, buscamos e instalamos la ultima versión de la imagen que dice grafana/grafana.

Mientras se descarga la imagen, y de la misma manera que hicimos con InfluxDB, crearemos en el directorio de docker donde están el resto de contenedores varias carpetas. Iremos a la carpeta docker y esta vez sólo crearemos la carpeta grafana y le asignaremos su correspondiente permiso a SYSTEM:

Sin olvidar marcar la opción: Aplicar a esta carpeta, subcarpetas y archivos

Volvemos a Docker y haciendo doble clic en la imagen, Configuración avanzada → Volumen → Agregar carpeta y añadiremos esta vez solamente la de grafana que previamente creamos manualmente. Fijaros (nuevamente) en la ruta de montaje resaltada la cual debemos escribir manualmente:

Luego iremos a la configuración de puertos y agregaremos el 3000 en ambos apartados:

Aplicamos los cambios e iniciamos el contenedor. Accederemos vía web usando la dirección IP de nuestro servidor NAS y colocaremos el puerto 3000:
192.168.x.x:3000
Y se nos abrirá la interfaz de grafana.

Configurando grafana
Las credenciales por defecto para entrar a grafana son admin admin, sin embargo debemos por seguridad cambiar la contraseña.

Una vez hecho esto, debemos irnos a la configuración y en Add data source agregaremos el de InfluxDB:


Escribimos InfluxDB y la dirección IP junto con su puerto (el ya conocido 8086):

Si todo ha ido bien, veremos el siguiente mensaje:

Y ahora sí estaremos listos para crear los paneles gráficos para monitorizar el SAI o UPS en grafana.
Creando los paneles para monitorizar el SAI o UPS en Grafana
Y para finalizar la explicación del artículo mas extenso de este blog a la fecha 😅, procederemos a crear nuestros distintos Panel para cada lectura del SAI o UPS. Para ello vamos a la pantalla principal de Grafana y en el primer icono superior derecho Add panel hacemos clic y volvemos a seleccionar la misma opción en el cuadro que se abrirá en la parte izquierda:

En la parte inferior donde se encuentra en FROM, al presionar select measurement veremos las 4 principales lecturas del SAI o UPS que están en Node-RED. Si seleccionamos cualquiera de los 4 valores, por ejemplo usv.load (correspondiente a la carga de cantidad de dispositivos que tiene enchufado el UPS o SAI), ya veremos en el recuadro superior unos pequeños gráficos con las primeras lecturas:

Luego en barra lateral veremos como primera opción los tipos de Panel disponibles. Siempre usaremos el que más nos guste, pero para este ejemplo teniendo en cuenta el tipo measurement seleccioné el de tipo Time series. También la pestaña Suggestions mostrará recomendaciones:

Luego en el gran listado que tendremos de opciones inferiores, bajamos hasta Standard options → Unit y al hacer clic no sólo veremos muchísimos valores, si no que al escribir percent y seleccionamos el Percent (0-100) nos mostrará los valores en %:

Luego al darle al botón de Save, veremos que nuestro primer panel se guardará en nuestro Dashboard principal, el cual también guardaremos para conservar los cambios.
Otros ejemplos de paneles:
Para cada measurements creé 2 paneles, uno para mostrar la lectura en tiempo real y otro para conservar un histórico de uso. Esto me permite visualizar por un lado cuanto voltaje estoy recibiendo de la empresa de electricidad al UPS o SAI en este momento, y el otro me conserva un histórico de la misma lectura.
- Panel de tipo Gauge con un Table view de 5 minutos de refresco.
- Panel de tipo Time series con un Table view de 2 días.
Dichas diferencias se verán asi:

Cada uno de los 4 measurement disponibles varían, los cuales iremos ajustando con lo que realmente son. Deseo que el tuyo quedé muchísimo mejor y lo más importante, te permita en todo momento monitorizar tu SAI o UPS en grafana.
Curiosidades finales
- Siempre que hagamos modificaciones en los Panels, measurements, Units, etc es recomendable esperar unos minutos para poder ver los cambios reflejados en el Dashboard.
- Este entorn
- Monitorizar un SAI o UPS en grafana también es posible hacerlo por medio de máquinas virtuales o incluso usando una Raspberry Pi. Sin embargo después de probar distintas configuraciones, este ha sido el que menos problemas y más estable he tenido a la fecha.
- Este artículo ha sido desarrollado usando la versión de Grafana 9.2.1. Sin embargo a lo largo de los años usando este programa, he observado que han cambiado la ubicación de algunos los menús o incluso los nombres. Puede que en versiones posteriores veamos algo similar.
- USV: en alemán es Unterbrechungsfreie Stromversorgung Versorgung.
SAI: se le dice en España por Sistema de Alimentación Ininterrumpida.
UPS: en inglés y (también usado en Latinoamérica) por Uninterruptible power supply. - Para gustos los colores, nunca mejor dicho (y en este caso) visto. 🙂