• Saltar al contenido principal
  • Saltar a la barra lateral principal

Virtualizando | Blog & IT Services

Otra manera de entender la tecnología.

  • INICIO
  • PARTICULARES
  • EMPRESAS
  • BLOG
  • EspañolEspañol
Virtualizando | Blog & IT Services > BLOG > Sistemas > Automatizaciones > Monitorizar SAI o UPS con Grafana

Monitorizar SAI o UPS con Grafana

Publicado el 7 de noviembre de 2022

  • Qué se necesita para monitorizar en Grafana?
    • Hardware:
    • Software (todas a través de docker para DSM):
  • Instalación de Docker para DSM
  • Instalación de Node-RED
    • Instalando los Palettes de Node-RED
    • Configuración de los parámetros:
      • Agregar un debug (opcional)
    • Verificando IP en cada una de las lecturas.
  • Instalación de InfluxDB
    • Crear una base de datos InfluxDB en Docker DSM
  • Instalación de Grafana
    • Configurando grafana
  • Creando los paneles para monitorizar el SAI o UPS en Grafana
    • Otros ejemplos de paneles:
  • Curiosidades finales

¡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.

Imagen donde se muestra la ventana principal de docker correspondiente al articulo: Monitorizar SAI o UPS con Grafana

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:

Imagen donde se muestra la descarga de nodered correspondiente al articulo: Monitorizar SAI o UPS con Grafana

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

Imagen donde se muestra el puerto 1880 correspondiente al articulo: Monitorizar SAI o UPS con Grafana

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
Imagen donde se muestra los comandos de influx correspondiente al articulo Monitorizar SAI o UPS con 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.

Imagen donde se muestra la descarga del contenedor grafana/grafana correspondiente al articulo: Monitorizar SAI o UPS con 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:

Imagen donde se muestra la opción permiso a SYSTEM correspondiente al articulo Monitorizar SAI o UPS con Grafana

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

Texto donde se muestra la opción Aplicar a esta carpeta, subcarpetas y archivos correspondiente al articulo Monitorizar SAI o UPS con Grafana

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:

Imagen donde se muestra la ruta de montaje correspondiente al articulo: Monitorizar SAI o UPS con Grafana

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

Imagen donde se muestra el puerto 3000 correspondiente al articulo: Monitorizar SAI o UPS con Grafana

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.

Imagen donde se muestra cuando se abre por primera vez la interfaz de grafana correspondiente al articulo: Monitorizar SAI o UPS con Grafana

Configurando grafana

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

Imagen donde se muestra el cambio de contraseña en la primera ventana de inicio de sesión de grafana correspondiente al articulo: Monitorizar SAI o UPS con Grafana

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

Imagen donde se muestra la ruta hacia la configuración correspondiente al articulo: Monitorizar SAI o UPS con Grafana
Imagen donde se muestra la ventana de los data sources de grafana correspondiente al articulo: Monitorizar SAI o UPS con Grafana

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

Imagen donde se muestra la primera parte de los datos para influxdb y los data sources correspondiente al articulo:  Monitorizar SAI o UPS con Grafana

Si todo ha ido bien, veremos el siguiente mensaje:

Imagen donde se muestra la segunda parte de los datos para influxdb y los data sources correspondiente al articulo:  Monitorizar SAI o UPS con Grafana

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:

Imagen donde se muestra para agregar un nuevo panel  correspondiente al articulo: Monitorizar SAI o UPS con Grafana

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. 🙂
Por favor valora este artículo:
(Votos: 1 Promedio: 5)
Artículos relacionados:
  1. ¿Porqué hay que tener un SAI o UPS?
  2. SSD caché en un NAS de Synology
  3. Cómo migrar Tautulli a Docker en Synology DSM

Publicado en: Automatizaciones, DSM, Servidores, Sistemas, UPS / SAI

Acerca de Tony

Ingeniero técnico venezolano freelancer en Hamburgo-Alemania, especializado en sistemas informáticos, redes, seguridad y servidores de virtualización con casi 20 años de experiencia.

Barra lateral principal

  • Facebook
  • LinkedIn
  • RSS
  • Twitter
  • Telegram

Entradas recientes

  • VPN en un router Fritzbox
  • Monitorizar SAI o UPS con Grafana
  • Instalar macOS Monterrey en VMware ESXi
  • Actualización ESXi 6.7 Julio 2022
  • Evita que hackeen tu Instagram

Categorías

VIRTUALIZANDO | BLOG & SERVICES © 2022 - PRIVACIDAD