UPS Salicru en Nut

Después de ver la exigua entrada del compañero “cerebro” en su blog y viendo que yo estoy en la misma situación que algunas personas, he dedicido publicar un mini-howto para los SAIS Salicru con NUT (sin cacti :-P)

Lo primero por supuesto es bajar el código fuente (en mi caso obligatorio, seguramente en una distribución normal, no haga falta ;-) ).

En mi caso, lo he configurado con esta linea:
./configure --prefix=/home/apps/nut \
--with-usb \
--without-doc \
--with-serial \
--without-ipmi \
--without-freeipmi \
--without-macosx_ups \
--without-avahi \
--with-cgi

Y compilado como siempre :-P

La configuración tal como dice el blog anterior se basa en el driver “blazer_usb”.
Como no tengo mucho tiempo, en vez de leer el manual fui por la via rápida (prueba-> error o ingeniería inversa) y me ha costado un poco descifrar como va el tema.
La cuestión es que hay que lanzar 3 demonios:

  • upsdrvctl lanza el “driver” encargado de coumincarse con el UPS
  • upsd se comunica con el driver (blazer_usb) y abre un socket
  • upsmon se conecta al socket de upsd y monitoriza


Mis ficheros de configuración están en /home/apps/nut/etc ya que así lo he configurado y son los siguientes:
ciberterminal nut # ll /home/apps/nut/etc/
total 36
-rw-r--r-- 1 root root 1504 Apr 18 20:10 nut.conf
-rw-r--r-- 1 root root 73 Apr 18 20:08 ups.conf
-rw-r----- 1 root root 2804 Apr 27 19:25 upsd.conf
-rw-r--r-- 1 nutmon root 2179 Apr 18 20:19 upsd.users
-rw-r--r-- 1 root root 12873 Apr 27 19:42 upsmon.conf

  • nut.conf

MODE=standalone

  • ups.conf

[salicru]
driver = blazer_usb
port = auto
desc = "Sai Salicru 700"

  • upsd.conf

MAXAGE 15
STATEPATH /var/state/ups/
LISTEN localhost 3493
MAXCONN 30

  • upsd.users

[upsmonitor]
password = WLCqWKeo786kAkFd3nFE
[admin]
password = admin
actions = SET
instcmds = ALL

  • upsmon.conf

RUN_AS_USER nutmon
MONITOR salicru@localhost:3493 1 upsmonitor mypassword master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYCMD /home/apps/nut/scripts/notifyme.sh
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
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+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Casi todo está por defecto, excepto el usuario de conexión de upsmon a upsd, el script de la variable NOTIFYCMD y el “SYSLOG+WALL+EXEC” que son los 3 métodos de notificación, cambiarlo al gusto :-P

Para lanzarlo a mano, por orden, los comando son (como root):
cd /home/apps/nut
./bin/upsdrvctl start
./sbin/upsd
./sbin/upsmon

Todos los comandos admiten la variable -D para entrar en modo debug (y correr en foreground), MUY útil en caso se problemas y para ver qué hace cada cosa :-P, yo terminé arrancando los demonios con debug 15 (-DDDDDDDDDDDDDDD). Asi que la primera vez, recomiendo usar al menos un -D.

El comando upsdrvctl lanza un demonio que en este caso es el “blazer_usb“, asi que al final con un ps se lo que se ve es:
ciberterminal nut # ps waux | egrep "ups|nut"
nobody 2046 0.0 0.1 2500 772 ? Ss 18:14 0:00 /home/apps/nut/bin/blazer_usb -a salicru
nobody 2054 0.0 0.1 4004 672 ? Ss 18:14 0:00 ./sbin/upsd
root 2056 0.0 0.1 4044 828 ? Ss 18:15 0:00 ./sbin/upsmon
nutmon 2057 0.0 0.1 4044 792 ? S 18:15 0:00 ./sbin/upsmon

Para comprobar que todo funciona, basta con desconectar el UPS de la corriente :-P

Como notas adicionales, existen un par de comandos muy interesantes (imagino que más, pero bueno:-P) :

  • upsc : el CLI, muestra info del SAI
  • upscmd : Permite cambiar las opciones del SAI

ciberterminal nut # ./bin/upsc salicru@localhost:3493
battery.charge: 100
battery.voltage: 13.10
battery.voltage.high: 13.00
battery.voltage.low: 10.40
battery.voltage.nominal: 12.0
device.type: ups
driver.name: blazer_usb
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.version: 2.6.5
driver.version.internal: 0.09
input.current.nominal: 2.0
input.frequency: 49.9
input.frequency.nominal: 50
input.voltage: 224.9
input.voltage.fault: 224.9
input.voltage.nominal: 230
output.voltage: 224.9
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 0
ups.productid: 5161
ups.status: OL
ups.type: offline / line interactive
ups.vendorid: 0665

y
ciberterminal nut # ./bin/upscmd -l salicru@localhost:3493
Instant commands supported on UPS [salicru]:

beeper.toggle - Toggle the UPS beeper
load.off - Turn off the load immediately
load.on - Turn on the load immediately
shutdown.return - Turn off the load and return when power is back
shutdown.stayoff - Turn off the load and remain off
shutdown.stop - Stop a shutdown in progress
test.battery.start - Start a battery test
test.battery.start.deep - Start a deep battery test
test.battery.start.quick - Start a quick battery test
test.battery.stop - Stop the battery test

Mediante upscmd podemos cambiar las opciones internas del SAI, como por ejemplo el molesto beep:
ciberterminal nut # ./bin/upscmd salicru@localhost:3493 beeper.toggle
Username (root): admin
Password:
OK

La gestión de arranque, depende de cada distro, pero nut proporciona scripts para las principales distros (redhat, debian, systemd…) Asi que no lo voy a tratar.

Gracias a la gente de “Cerebro en la Sombra” y este post que me ha ayudado bastante.

11 thoughts on “UPS Salicru en Nut

  1. Gracias por la informacion, me ha servido para configurar uno de estos SAI. Especificamente el modelo SAI SPS SOHO 400VA STAND-BY 647AA000001

    Lamentablemente no muestra el valor de battery.charge.

    Saludos y gracias nuevamente!

  2. Que raro, a mí sí que me muestra el % de carga :-S
    Te lo muestra el programa oficial de salicru? (si consigues que funcione)

  3. no he probado el software oficial, podria hecharle un vistazo, lo que obtengo por consola es lo siguiente:
    ~$ upsc salicru@localhost:3493
    battery.voltage: 13.60
    battery.voltage.nominal: 12.0
    beeper.status: disabled
    device.type: ups
    driver.name: blazer_usb
    driver.parameter.pollinterval: 2
    driver.parameter.port: auto
    driver.version: 2.4.3
    driver.version.internal: 0.03
    input.current.nominal: 1.0
    input.frequency: 49.9
    input.frequency.nominal: 50
    input.voltage: 220.5
    input.voltage.fault: 220.5
    input.voltage.nominal: 230
    output.voltage: 220.5
    ups.delay.shutdown: 30
    ups.delay.start: 180
    ups.load: 21
    ups.productid: 5161
    ups.status: OL
    ups.temperature: 25.0
    ups.type: offline / line interactive
    ups.vendorid: 0665

  4. Vaya tela…
    Prueba con:
    [cc lang=”bash”]
    upsc salicru@192.168.2.56:3493 battery.charge
    [/cc]
    Pero creo que no te va a funcionar.
    Veo que tienes una versión del driver antigua, yo tengo la “2.6.5”
    Has probado a compilarlo?

  5. Buenas!

    Muchas gracias por compartir este tutorial. Tengo pensado comprar un SPS ONE 900VA y antes quería asegurarme que me va a funcionar.

    Mi duda es que de qué manera podemos asegurarnos que los SAI Salicru son compatibles con el software de NUT (bueno, es una pregunta un tanto contradictioria, habiendo leído tu howto… jejeje)… Mejor dicho, ¿sabemos qué protocolo de comunicación usa Salicru extáctamente? Como no aparece en el listado de equipos compatibles en NUT, me parece muy curioso y me gustaría investigar al respecto. Pero no encuentro nada…

    ¿Crees que funcionará OK con el SPS ONE? Tengo pensado conectarlo a un nas ix2-200 de iomega.

    Gracias por el aporte!

    Jordi

  6. Hola,
    Ya sabes como van estos temas, el fabricante te dirá que uses su maravillosa herramienta… Que no está mal, pero es java, asi que es lenta (lentísima) y pesada, muy pesada.
    Yo tengo el SPS ONE 700VA, si no te va será por una paradoja del destino, es el mismo SAI cambiando las células.
    Esto es como todo, es “made in china”, le pueden cambiar el envoltorio pero por dentro todas las marcas usarán el mismo hard (o casi) y en linux teniendo el código fuente al final siempre saldrá “algo” compatible.
    En mi caso, compré este en concreto por el precio y por la compatibilidad con nut.

    Eso sí, si lo vas a controlar con el NAS, seguramente sea un tema durillo, no conozco ese nas, pero el que tengo yo está muy limitado y hay que hacer mortales invertidos para ponerle cosas :-P

  7. Muy buenas de nuevo!

    He de decirte, que todo genial, y a la primera! :D Mil gracia spor ser tan claro… Se agradece este tipo de tutoriales, todo es posible con empeño ;-)

    Tengo un problema. Lo he conectado a la RaspberryPi, porque estoy montando el server casero con ella, y en caso de pérdida de tensión, será esta la encargada de “avisar” al resto de periféricos (no me preguntes cómo, jejeje, cuando lo haga lo publicaré en mi web). El problema es que me funcionó a la primera cuando la configuré desde la misma Pi, pero ahora lo etsoy haciendo “a distancia”, vía SSH y no estoy en casa para probar, pero he notado que no hay manera de que me detecte el dispositivo USB. Lo tengo conectado a un hub usb, y no se si puede ser ese el problema…

    ¿Hay alguna manera de testear si NUT reconoce o no el dispositivo USB? porque el error que me da no es muy “gráfico”:

    pi@raspberrypi ~ $ sudo upsdrvctl -D start
    Network UPS Tools – UPS driver controller 2.6.4
    0.000000 Starting UPS: salicru
    Network UPS Tools – Megatec/Q1 protocol USB driver 0.08 (2.6.4)
    No supported devices found. Please check your device availability with ‘lsusb’
    and make sure you have an up-to-date version of NUT. If this does not help,
    try running the driver with at least ‘subdriver’, ‘vendorid’ and ‘productid’
    options specified. Please refer to the man page for details about these options
    (man 8 blazer).

    0.028574 Driver failed to start (exit status=1)

  8. Buenas,
    Me viene al pelo, por que me petó la sd de la raspberry y estoy teniendo que poner todo de nuevo :-(
    Más o menos me pasa lo mismo que a tí… La otra vez creo que también me dio problemas el driver (upsdrvctl).
    He hecho varias cosas que no son muy seguras, empezando por los permisos del udev, copié el fichero de permisos general y lo modifiqué:
    [cc lang=”bash”]
    raspterminal /home/apps/nut # diff -bBiT /etc/udev/rules.d/91-permissions.rules /lib/udev/rules.d/91-permissions.rules
    36c36
    < MODE="0666" --- > MODE=”0664″
    [/cc]
    También cambié el de los drivers del ups en el udev:
    [cc lang=”bash”]
    raspterminal /home/apps/nut # sed ‘s,MODE=”664″,MODE=”666″,g’ /lib/udev/rules.d/52-nut-usbups.rules > /etc/udev/rules.d/52-nut-usbups.rules
    [/cc]
    Y reinicié.
    Con esto deberías ver el dispositivo del ups en /dev con ugo+rw:
    [cc lang=”bash”]
    raspterminal /home/apps/nut # lsusb
    Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
    Bus 001 Device 004: ID 0665:5161 Cypress Semiconductor USB to Serial
    raspterminal /home/apps/nut # ll /dev/bus/usb/001/004
    crw-rw-rwT 1 root nut 189, 3 Jun 9 11:01 /dev/bus/usb/001/004
    [/cc]
    Con esto ya puedes arrancar el driver (yo lo hago con el blazer por que con upsdrvctl no da tanta información):
    [cc lang=”bash”]
    raspterminal /home/apps/nut :( # /home/apps/nut/bin/blazer_usb -DDDDDDDDDD -a salicru
    Network UPS Tools – Megatec/Q1 protocol USB driver 0.10 (2.7.1)
    0.000000 send_to_all: SETINFO driver.parameter.port “auto”
    0.004218 debug level is ’10’
    0.033721 Checking device (0665/5161) (001/004)
    0.046156 – VendorID: 0665
    0.046302 – ProductID: 5161
    0.046364 – Manufacturer: INNO TECH
    0.046420 – Product: USB to Serial
    0.046473 – Serial Number: unknown
    0.046526 – Bus: 001
    0.046577 Trying to match device
    0.046644 Device matches
    0.050626 send_to_all: SETINFO ups.vendorid “0665”
    0.051015 send_to_all: SETINFO ups.productid “5161”
    0.051148 send_to_all: SETINFO device.type “ups”
    0.051240 send_to_all: SETINFO driver.version “2.7.1”
    0.051323 send_to_all: SETINFO driver.version.internal “0.10”
    0.051402 send_to_all: SETINFO driver.name “blazer_usb”
    0.051467 Trying megatec protocol…
    0.052368 send: Q1
    0.187009 read: Q1
    0.187156 blazer_status: short reply
    0.187228 Status read 1 failed
    0.189758 send: Q1
    0.322006 read: Q1


    1.682996 read: (227.7 227.7 227.7 000 49.9 13.1 –.- 00001001
    1.683232 send_to_all: SETINFO input.voltage “227.7”
    1.683354 send_to_all: SETINFO input.voltage.fault “227.7”
    1.683510 send_to_all: SETINFO output.voltage “227.7”
    1.683737 send_to_all: SETINFO battery.charge “100”
    1.683837 blazer_status: non numerical value [–.-]
    1.683940 send_to_all: DATAOK

    Fatal error: unable to create listener socket

    bind /var/state/ups/blazer_usb-salicru failed: Permission denied

    1.684958 Exiting.
    [/cc]
    No sé por qué se va a a /var, asi que he recompilado el nut forzando el STATEPATH:
    [cc lang=”bash”]
    ./configure –prefix=/home/apps/nut –with-usb –without-doc –with-serial –without-ipmi –without-freeipmi –without-macosx_ups –without-avahi –with-cgi –with-statepath=/home/apps/nut/var/state/ups
    [/cc]
    Y cambiando el fichero correspondiente:
    [cc lang=”bash”]
    raspterminal /home/apps/nut # egrep STATEPATH etc/*
    egrep: etc/sample: Is a directory
    etc/upsd.conf:# STATEPATH etc/upsd.conf:STATEPATH /home/apps/nut/var/state/ups
    [/cc]
    Con eso el driver ya arranca y ya se puede usar upsdrvctl, upsd y upsmon!

  9. Ostras!!! Pues cuando llegue a casa lo pruebo. Lo raro es que la primera vez que lo intenté si arrancó correctamente… Ahora no hay manera…

    ya te diré, y mil gracias por el aporte!

    Jordi

    PD: Esto no avisa cuando alguien responde a los comentarios… no me había dado cuenta de que habías respondido… :'(

  10. Buenas!
    Solo quería decirte que mi problema era que tenía el hub estropeado y por eso no leía datos. Ahora ya funciona correctamente sin necesidad de hacer nada extra. Como a punte te diré que la versión que yo he usado es la que se descarga mediante apt-get, sin necesidad de compilar ni tocar nada de configuración, a parte de sus ficheros específicos. Quizá puedas probar tu también…

    Gracias!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.