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:

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:

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:

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:

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:

¿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

2 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

Deja un comentario

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