RasPi: conectando un SAI Salicru SPS One 900VA (II)

Retomo este mini tutorial a cerca de Nut, usado con un SAI Salicru SPS One de 900VA (cabe destacar que, en un principio, sólo era una pequeña review de cómo usar NUT, pero debido a las muchas preguntas recibidas, he decidido ampliarlo un pelín mas).

Es importante destacar que no me responsabilizo de nada de lo que os pueda suceder al intentar utilizar mis apuntes con vuestros sistemas, como es normal… Si bien, no importa demasiado, porque lo que aquí comentaré no es intrusivo para el sistema…

Seguid leyendo para continuar con esta segunda entrega, y espero que os sea de gran ayuda! 😉

Hace ya 4 años que escribí la primera entrada a cerca de esta pareja de sistemas (soft + hard) que en su día tuve montados en casa de manera continuada. Se trata del fabuloso y sencillo, a su vez, NUT, y un sencillo y barato SAI de Salicru, el SPS One 900VA.

En esta segunda entrega os mostraré cómo tratar los eventos del driver, ya que al final es lo que mas dolores de cabeza nos traerá, y sobre lo que más comentarios he estado recibiendo últimamente.

Eventos

El principal propósito de nuestra configuración es atender a eventos de la unidad de proceso del SAI, la cuál nos va a decir en cada momento el estado de cada uno de sus componentes (batería, alimentación, conectividad…).

Recordemos la tabla de eventos que os mostraba en mi anterior entrada:

MONITOR salicru@127.0.0.1:3493
NOTIFYCMD /usr/local/ups/bin/notifyme.sh # hay que crearlo!
NOTIFYMSG ONLINE        "UPS %s on line power"
NOTIFYMSG ONBATT        "UPS %s on battery"
NOTIFYMSG LOWBATT       "UPS %s battery is low"
NOTIFYMSG FSD           "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK        "Communications with UPS %s established"
NOTIFYMSG COMMBAD       "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN      "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT      "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM        "UPS %s is unavailable"
NOTIFYMSG NOPARENT      "upsmon parent process died - shutdown impossible"
NOTIFYFLAG ONLINE       SYSLOG+WALL
NOTIFYFLAG ONBATT       SYSLOG+WALL
NOTIFYFLAG LOWBATT      SYSLOG+WALL
NOTIFYFLAG FSD          SYSLOG+WALL
NOTIFYFLAG COMMOK       SYSLOG+WALL
NOTIFYFLAG COMMBAD      SYSLOG+WALL
NOTIFYFLAG SHUTDOWN     SYSLOG+WALL
NOTIFYFLAG REPLBATT     SYSLOG+WALL
NOTIFYFLAG NOCOMM       SYSLOG+WALL
NOTIFYFLAG NOPARENT     SYSLOG+WALL

En esta tabla aparecen todos los flagseventos a los que el driver puede atender (ojo! dependiendo de nuestro SAI podremos tener unos u otros disponibles!).

  • NOTIFYCMD <CMD> : indica el comando <CMD> de sistema o de usuario a ejecutar en caso de que se produzca uno de los eventos (para nosotros, será un bash script, por ejemplo, que se ejecutará cada vez que algún evento se active, podemos crearlo desde cero o indicar el comando a ejecutar directamente, como si de un CRON se tratara)
  • NOTIFYMSG <FLAG>: es el mensaje que se enviará en caso de producirse el evento <FLAG> (%s es un comodín que será sustituido por el valor que arroje el evento)
  • NOTIFYFLAG <FLAG> : es la acción a realizar en caso de que se produzca el evento <FLAG>

Veamos qué eventos podemos tratar:

  • COMMOK : inicio de la comunicación con la central de proceso de datos del SAI
  • COMMBAD : error o pérdida de comunicación con el SAI
  • FSD : inicio del proceso de apagado del sistema de manera forzosa
  • LOWBATT : indicador de batería en nivel crítico
  • NOCOMM : sin conexión con la unidad de proceso de datos del SAI
  • NOPARENT : apagado del sistema fallido
  • ONBATT : desconexión de la alimentación eléctrica o pérdida de la misma, entrando en modo baterías
  • ONLINE : conexión o recuperación de la alimentación eléctrica
  • REPLBATT : nivel de vida útil de la batería crítico, se deben reemplazar
  • SHUTDOWN : en proceso de apagado del sistema SAI

Como vemos, se cubren todos los casos que un SAI puede procesar, de manera sencilla. Esto significa que podemos explotar cada uno de estos eventos para que el sistema nos avise.

Veamos cómo.

Configurando la gestión de los eventos

Supongamos un caso concreto, quizá el que mas nos preocupe y por el que seguramente has llegado hasta aquí: pérdida de la alimentación eléctrica.

Seguramente que, si nuestro SAI pierde la alimentación, lo que deseamos hacer es informarnos del estado y, por supuesto, apagar el sistema que el SAI protege. Bien, sería lo normal…

Para ello, lo que tenemos que hacer es:

  1. Configurar el proceso que notificará el evento de pérdida de alimentación eléctrica
  2. Configurar el comando a ejecutar para el evento de pérdida de alimentación eléctrica
  3. Cruzar los dedos y esperar que el comando a ejecutar en el paso 2 haga realmente lo que tiene que hacer, antes de que se pierda la alimentación por baterías… 😉

Creando el ejecutable “notifyme.sh”

Bien, como ya he explicado, existe una configuración genérica que afecta a todos los eventos configurados como “notificables”. Esa configuración responde a la propiedad NOTIFYCMD del fichero de configuración /etc/nut/upsmon.conf:

NOTIFYCMD /usr/local/ups/bin/notifyme.sh

Es decir:

cuándo suceda el <EVENTO> entonces avísame mediante este <COMANDO>

O lo que es lo mismo:

cuándo suceda el ONBATT entonces avísame mediante este NOTIFYCMD

El comando indicado en la configuración como NOTIFYCMD se ejecutará cada vez que un evento se lance…

Un ejemplo de notifyme.sh:

#! /bin/bash
echo "$*" | sendmail -F"ups@mybox" bofh@pager.example.com

No olvidéis darle permisos de lectura y ejecución a este script…

En este simple ejemplo (modificad las credenciales de vuestra dirección de correo según convenga), lo único que hacemos es enviar por correo electrónico el dato que NUT nos ha pasado como parámetro de entrada ($*, normalmente el mensaje que hemos configurado para evento que se ha generado, mediante NOTIFYMSG <EVENTO>). Para poder ejecutarlo, deberéis tener correctamente configurado vuestro servidor de correo. también podríais enviar un tweet si hacéis uso de la API de twitter… por ejemplo…

Ahora, cada vez que se produzca un evento en nuestro sistema recibiremos un mail conla iformación proporcionada por NUT (si tenéis dudas, echadle un vistazo a esta entrada anterior en la que configuro sendmail en mi raspberrypi).

Configurando el comportamiento de los eventos a nivel de sistema

A demás de enviar una notificación para todos los eventos, podemos decidir cómo queremos que se comporte el sistema. Por ejemplo, podemos enviar un mensaje por consola a todos los usuarios conectados a nuestro sistema, informando que en breve se apagará, podemos escribir un log, o bien podemos ejecutar un comando:

  • SYSLOG : escribe el evento por log del sistema
  • WALL : envía un mensaje de consola a todos los usuarios conectados
  • EXEC : ejecuta un comando explícito para ese evento (como el NOTIFYCMD)
  • IGNORE : no realiza ninguna acción

Ejecutar comandos relacionados al evento

 

Normalmente se configuraría el sistema NUT para poder ejecutar comandos relacionados con el evento que se ha registrado. Esta configuración se realiza mediante el UPSCHED, y es algo complejo (disponéis de más información en esta página: http://networkupstools.org/docs/man/upssched.html).

Sin embargo, mi opción que quiero comentaros aquí, aún siendo algo “incorrecta”, es mas sencilla y seguramente os ayudará a hacer que el montaje empiece a funcionar mucho más rápido.

Se trata, como ya comenté en mi anterior entrada, de utilizar el comando NOTIFYCMD para detectar y ejecutar los diferentes comandos relacionados al evento.

Como hemos comentado anteriormente, upsmon enviará como parámetro de entrada a nuestro NOTIFYCMD el mensaje que hayamos configurado para nuestro evento.

Imaginemos la siguiente tabla de configuración de upsmon.conf:

...
NOTIFYCMD /usr/local/ups/bin/notifyme.sh
...
NOTIFYMSG ONBATT        "ONBATT"
NOTIFYMSG LOWBATT       "LOWBATT"
NOTIFYMSG FSD           "FSD"
...

Cuando se lance el evento ONBATT, el sistema ejcutará nuestro notifyme.sh, y le pasará como parámetro ONBATT… Ahora sólo tenéis que obtener este parámetro en el shell script y ejecutar vuestro comando preferido en función de ello…

os pongo solo un esbozo de lo que podría ser vuestro notifyme.sh:

#!/bin/bash

EVENT_TYPE=$*

case "$EVENT_TYPE" in
        ONBATT)
            // Enviar mail indicando que hemos entrado en modo baterías
            // Iniciar secuencia de apagado de nuestro sistema
        ;;
        FSD)
            // Enviar mail indicando que hemos entrado en modo apagado forzado
            // Iniciar secuencia de apagado de nuestro sistema
        ;;

¿Veis la idea? Sería obtener el parámetro de entrada, que en vez de un mensaje, hemos convertido en una constante, y en función a ello, ejecutar uno u otro comando…

Y hasta aquí mi aportación de hoy, espero que os haya aclarado muchas cosas respecto a mi anterior entada.

Como coletilla, os dejo algunos apuntes:

  • recordad aplicar permisos de lectura y ejecución para el notifyme.sh
  • para poder ejecutar comandos de sistema, como un apagado forzado, deberéis ejecutar el comando como root (sudo no sirve, sino os pedirá password!)
  • quiero hacer constar que yo no he probado nada de lo que os he mostrado anteriormente, todo está basado en mi experiencia anterior (hace años que no uso mi sai) y por lo tanto podría haber errores en el código u otras explicaciones, por favor, tened en cuenta que no me responsabilizo del uso que hagáis de todo ello!
  • para mas info: http://networkupstools.org/docs/man/index.html#User_man

Suerte!!!

 

Jordi

Share Button

12 comentarios

  1. Hola Jordi,

    Muchas gracias por tu nueva entrada. ¿Es posible implementar la solución que comentas con openmediavault (OMV) y el plugin nut??

    Tengo montado el NAS con OMV en una RPI y quería conectar alli el SAI para que me avise.

    La solucion que tengo ahora montada para saber si se va la luz es más “básica”, tengo un interruptor zwave donde va enchufado el SAI y asi si salta la luz detecto el evento del interruptor (pq tengo el controlador domótico alimentado por el mismo SAI)

    Saludos!

    • Hola Nacho,

      Gracias por escribirme. No podría asegurártelo, porque no tengo experiencia con OMV, pero si el driver es el mismo, o sea, NUT, no debería haber problema, ya que si OMV es compatible con NUT, deberías poder realizar las mismas tareas que comento en mi entrada…

      Si consigues hacerlo, te agradeceré mucho que nos lo hagas saber.

      Gracias y siento no poder ser de mucha mas ayuda…

      Un saludo!

      Jordi

  2. Hola Jordi,

    He encontrado un hueco durante las vacaciones y he probado el plugin de NUT del Openmediavault (OMV) con mi Salicru y funciona de maravilla.

    Habilitas el plugin en OMV, en indefiticador indicas por ejemplo “Salicru”, en el apartado de driver configuration (lo que iria en ups.conf):
    driver = blazer_usb
    port = auto
    desc = “Salicru SPS One 900VA”

    Y luego seleccionas en la configuración del plugin de OMV si quieres que el shutdown del salicru se haga cuando llegue a bateria baja o al cabo de x segundos.

    A partir de ahi, te llegan automaticamente las notificaciones por mail, por ejemplo (incluyo el contenido de los mails que llegan por cada notificacion)

    UPS salicru@localhost – Line Power Fail, system running on battery power. Shutdown imminent in 299 seconds.
    UPS salicru@localhost – Running on line power. Shutdown cancelled.
    Automatic logout and shutdown proceeding

    … etc etc

    Por si alguien llega un dia a probarlo, indicar que en el apartado de configuración NO hay que poner el
    “[salicru]”, sino que es el nombre que pilla en el identificador del que indiques. Me ha pasado que por defecto indica nut y yo habia incluido [salicru] en el apartado de configuración del driver y entonces no conseguia OMV conectarse al SAI pero en cambio desde linea de comandos de la RPI si que podia hacer salicru@localhost…

    Un saludo!!!

    Nacho

    • Mil gracias Nacho por tus comentarios, es de agradecer tan extensa explicación y datos, nos has sido de gran ayuda.

      Espero poder seguir haciendo algunas pruebas algún día. Me cambiaron en garantía mi Salicru SP900 y nunca mas lo volví a usar, espero que no se haya fastidiado de nuevo… jejeje.

      Mi idea es hacer una interfaz gráfica de recopilación y explotación de datos, algún día os contaré…

      Gracias!

  3. Hola a todos, tengo una duda que me estoy volviendo loco agradeceria si alguien me pudiera ayidar. He creado el archivo notifyme.sh dentro de la ruta que indica el tutorial /usr/local/ups/bin/notifyme.sh . Me gustaria indicar que tambien he tenido que crear las carpetas ups y bin ya que no estaban creadas, no se si esto es normal.
    El caso es que tengo nut-client y nut-server bien configurados y en run, y uno de ellos me detecta cuando entra en modo baterias o en modo corriente normal a traves de upsmon, pero no logro entender como se puede ejecutar el comando NOTIFYCMD ya que no es un comando ejecutable y por mucho que lo añada al archivo de configuracion upsmon.conf pues creo que jamas ejecutaria nada ya que no es ejecutable. En el tutorial pone que NOTIFYCMD se puede crear desde cero o indicar el comando a ejecutar directamente, como si de un CRON se tratara pero no lo veo claro ni como crearlo o si es un archivo ejecutable.

    Gracias a todos

    • Amigo Enrique, gracias por tu comentario.

      Los ficheros .sh son “shell scripts”, es decir, ficheros de procesamiento por lotes (como los .bat de MS-DOS). Éstos son los mas sencillos de utilizar en este caso. También puedes usar ejecutables del sistema u otros programas, directamente…

      En Linux, los ficheros .sh, es obligatorio marcarlos como ejecutables:

      $ sudo chmod +x /usr/local/ups/bin/notifyme.sh

      De lo contrario, no podrás ejecutarlos, y seran meros ficheros de texto. A demás, deberás añadir la cabecera pertinente, según su tipo.

      Te recomiendo que le eches un ojo a alguna guía de shell-scripting para mas información: https://www.shellscript.sh/

      Espero que sea este tu problema. Sino vuelve por aquí y seguimos mirando… 😉

      Un saludo!

  4. Hola,

    Si , de echo ya tenia er archivo notifyme.sh configurado como ejecutable, de echo con todos los permisos rwx en user,group y others. Pero tampoco funcionaban las notificaciones. La unica manera que he conseguido que funcione despues de muchas pruebas es añadiendo la palabra “EXEC” en el archivo upsmon.conf , por ejemplo asi:

    NOTIFYFLAG ONBATT  EXEC+SYSLOG+WALL

    Esta es la unica manera de la cual me funcionan todas las notificaciones. No entiendo porque.

    Tambien recibo otro mensaje de error cuando consulto el estado del nut server que pone:

    Data for ups salicru is stale. Check driver
    Ups salicru data is not longer stale

    No sale en rojo pero sale en blanco resaltado pero todo parece funcionar bien.

    Gracias a todos por el trabajo y apoyo. Espero que ayuden las preguntas y respuestas a otros usuarios con problemas.

    Un saludo

  5. Hola, muchas gracias por tus respuestas. consegui que funcionase. Ahora queria cambiar el tipo de notificacion a telegram y estoy utilizando la manera que usted indica en el tutorial de modificar el notifyme.sh previamente modificando el upsmon.conf (NOTIFYMSG ONBATT “ONBATT”)
    He construido notifyme.sh indicas en el tutorial y tambien tengo los permisos correctos porque ya lo tenia funcionando anteriormente con: echo “$*” | mail -s “ups@mybox” micorreo@micorreo.com, de esta manera si que coje los parametros del shell con echo “$*” , por lo tanto no logro entender donde estaria el problema en mi nuevo notifyme.sh:

    #!/bin/bash

    EVENT_TYPE=$*

    case “$EVENT_TYPE” in
    ONBATT)
    // Enviar mail indicando que hemos entrado en modo baterías
    // Iniciar secuencia de apagado de nuestro sistema
    ;;
    Las barras // no se que significan pero he probado usarlas y eliminarlas.
    Lo he intentado con un correo electronico pero creo que cuando la ups entra en modo de baterias no me lo detecta este script. me estoy iniciando con bash scripts y deduzco que $* son los comandos que se recojerian del shell, o bien no me recoje el comando ONBATT o bien el comando $EVENT_TYPE no funciona, he intentado buscar informacion sobre el comando EVENT_TYPE pero no encuentro nada, agradeceria muchisimo si me pudieras ayudar con mi primer script.
    Gracias por adelantado y agradezco mucho tu tutorial.

  6. Hola de nuevo, he seguido haciendo pruebas. Parece que el problema esta en que NOTIFYMSG no cambia el nombre. por ejemplo si tengo configurado en upsmon.conf:

    NOTIFYMSG ONBATT “ONBATT”

    cuando se produce el evento siempre veo notificado en syslog y en el correo: UPS salicru@localhost on battery . Creo que deberia de ver ONBATT , usted cree que este es el motivo por el cual no se reproduce el bash script de notifyme.sh con los comandos “EVENT_TYPE=$*” y case in etc.. ?

    quedo a la espera de sus noticias y muchisimas gracias por adelantado

    Reciba un cordial saludo

  7. Hola, despues de un largo dia haciendo pruebas he conseguido resolver el problema, voy a comentar aqui la solucion por si a alguien mas le pasa. En el bash script de notifyme.sh , para finalizar la secuencia de comandos abierta por el comando — case “$EVENT_TYPE” in — se tiene que añadir el comando “esac” sin comillas para cerrar la secuencia. Imagino que esto sera conocido para la gente que tenga experiencia en bash.
    El otro problema que tenia estaba relacionado con el archivo upsd.users , no tenia añadidas las lineas actions = SET y instcmds = ALL, este era el motivo por el cual no me renombraba los comandos usando NOTIFYMSG ONBATT “ONBATT” , por eso tampoco se ejecutaba el BASH notifyme.sh.

    Una vez mas doy las gracias al creador del tutorial, creo que es de los unicos que hay en internet y gracias a el he conseguido realizar el envio de notificaciones a través de una plataforma conocida de mensajeria en la cual llegan las notificaciones mas rapido que segun que servidores de correo electronico.

    Un saludo a todos

    • Hola Enrique,

      Antes de nada pedir disculpas por no poder atender antes a tus comentarios, pero ha sido una semana muy dura y me ha sido imposible.

      Luego, he de agradecerte a ti tu dedicación y sobre todo compartir con todos nosotros tu experiencia y las correcciones introducidas, ya que de bien seguro serán de muchísima utilidad para todos. Es muy probable que en algún caso haya dejado de añadir las sentencias que indicas, por error tipográfico. Por lo que tu aportación es de gran valor.

      Me alegro que, al menos en medida de lo posible, el tutorial sea de utilidad. Espero en breve poder realizar algún otro mas actualizado.

      Un saludo! Y de nuevo gracias por tu aporte.

      Jordi

Responder a Enrique Cancelar la respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.