Gestire un UPS con Raspberry Pi tramite “Network UPS Tools” su Raspbian

8 minuti di lettura
Scopi della guida:
  • Gestire in modo standard, indipendentemente da marca e modello, un qualunque gruppo di continuità (UPS) compatibile con NUT, tramite Raspberry
  • Livello di difficoltà: medio
Concetti affrontati:
  • Configurazione software
Componenti software utilizzate:
Prerequisiti:
  • Raspberry Pi configurato e funzionante con sistema operativo Raspbian
COMPONENTI FISICI UTILIZZATI:
  • Il (o gli) UPS da gestire tramite NUT
PROGETTO MAGGIORMENTE INDICATO PER:

Raspbian Logo

Note e disclaimer
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata ed realizzata SOLO da personale qualificato;
  • qualsiasi modifica attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno puro scopo didattico);
  • qualsiasi modifica attuata in proprio a un dispositivo ne fa decadere garanzia, omologazioni e certificazioni di qualità.
Revisione guida: 1.1

Abstract

Abbiamo già affrontato in diverse occasioni il tema della continuità elettrica, ovvero la possibilità di rendere la nostra domotica (o altro) costantemente operativa, specie in caso di black-out. Per farlo è necessario dotarsi di un UPS (Uninterruptable Power Supply), il quale sostanzialmente è un pacco di batterie che, in caso di assenza di alimentazione elettrica continua a fornire energia – per lo meno fino alla sua completa scarica.

UPS APCModelli di UPS ne esistono centinaia per non dire migliaia: al tema di come e perché scegliere un UPS adeguato alle proprie esigenze abbiamo dedicato una scheda apposita; in tale scheda, nelle conclusioni, abbiamo fatto riferimento all’esistenza di UPS dotati di interfaccia USB la quale consente, in molti casi, di collegare l’unità a un computer al fine di verificarne lo stato operativo, quello di carica rimanente e moltissimi altri parametri. In alcuni casi, essi utilizzano porte seriali oppure una qualche connessione di rete (che sfrutti SNMP, Eaton, MGE XML/HTTP via TCP/IP).

In questa guida prenderemo in analisi l’adozione – su Raspberry Pi dotato di sistema operativo Raspbian – dei cosiddetti “Network UPS Tools” (o “NUT”), un pacchetto di software concepiti espressamente allo scopo di riuscire a “dialogare” con l’UPS (indipendentemente dalla tipologia di interfaccia, di marca, del modello o dalle caratteristiche) e standardizzarne così non solo la consultazione delle misure ma anche l’eventuale esecuzione di comandi specifici verso di esso.

L’adozione dei NUT non solo abilita l’esecuzione di comandi e di interrogazioni tramite riga di comando Raspbian, ma anche all’integrazione in domotica verso i più disparati HUB personali come, per esempio, Home Assistant.

N.b. Gli utilizzatori di un’eventuale installazione HASSIO debbono fare riferimento a quest’altra guida e non alla presente, la quale è dedicata solo agli utenti Raspbian@Raspberry Pi o, più genericamente, a installazioni Linux.

Si parte

Assunti

Per questa guida utilizzeremo a mo’ d’esempio un UPS Tecnoware Era Plus 1100 – non foss’altro perché lo abbiamo in redazione e si tratta di un modello piuttosto diffuso. Come si capirà facilmente nella proseguimento della lettura, in realtà i modelli coi quali questa guida è applicabile sono tantissimi.

Si assume dunque di possedere un Raspberry Pi già configurato con Raspbian e collegato in rete domestica, oltre ovviamente a un UPS compatibile (vedremo come) con NUT. Nell’esempio del Tecnoware Era Plus 1100, si immagina tale UPS connesso dal punto di vista logico al Raspberry tramite cavo USB type B.

Cosa sono i NUT

Come spiegato nell’Abstract, NUT è un insieme di software utile a interfacciarsi in modo standard a un UPS dotato di interfaccia USB, seriale o di rete (via SNMP, Eaton o MGE XML/HTTP su TCP/IP).

I NUT sono sostanzialmente composti da:

  • un driver per comunicare con l’UPS tramite qualsiasi interfaccia e protocollo supportati, trasformando tale comunicazione in API locali standard;
  • un demone (un servizio) che funga da interfaccia tra il driver e qualunque altro interlocutore (per esempio il client che segue, o gli HUB personali);
  • un client a riga di comando, per monitorare, comandare e/o interrogare l’UPS (o gli UPS).

Scelta del driver

Non tutti gli UPS con interfacciamento USB/seriale/di rete sono necessariamente compatibili con NUT, anche se solitamente la probabilità è piuttosto alta.

Come abbiamo spiegato anche nella scheda dedicata alla scelta del proprio UPS, esiste una tabella di riferimento che elenca tutti i modelli compatibili con i Network UPS Tools: se il proprio UPS è presente in quella lista, è dunque possibile controllarlo con i NUT. Una volta trovato il proprio modello è necessario segnarsi da parte il driver corrispondente (colonna “Driver”, per l’appunto), informazione fondamentale per l’esecuzione dei prossimi passi.

N.b. Non sempre i modelli sono puntualmente elencati in tabella. Per esempio, proprio nel caso del nostro Tecnoware 1100 è riportato in pratica solo il brand Tecnoware, ma non il modello specifico. Utilizzando comunque il driver genericamente indicato (blazer_ser), l’integrazione verso i NUT ha funzionato alla perfezione, come infatti vedremo a seguire.

Installazione dei NUT

Installare i Network UPS Tools su Raspbian (o su Linux, più genericamente) è quanto di più facile.
Per farlo è necessario eseguire un comando via terminale (da CLI, via SSH oppure con control-alt-t da interfaccia desktop):

sudo apt-get install nut

Limitarsi ad attendere il completamento della procedura.

Configurazione del driver

A questo punto è necessario definire l’elenco di UPS gestiti dai Network UPS Tools. Nella maggior parte dei casi, si tratterà di un solo elemento, ma nessuno vieterebbe di definirne più di uno.

Ipotizziamo quindi di aver collegato il nostro UPS al Raspberry tramite cavo USB e di aver identificato nel “blazer_usb” il driver corretto: andremo quindi a modificare il file di configurazione dei NUT aggiungendo la voce relativa all’UPS.

Per farlo, il comando da eseguire sarà:

sudo nano /etc/nut/ups.conf

Apertosi l’editor, definiamo la nostra configurazione In un punto qualsiasi del file, magari in coda:

[tecnoware]
driver = "blazer_usb"
port = auto
desc = "Technoware Era Plus 1100"
langid_fix = "0x4095"

Terminata la configurazione, salvare e uscire (ctrl+x, y, invio).

Spieghiamo ora i campi.

[tecnoware] Il nome col quale l’UPS sarà conosciuto dai NUT
driver L’indicazione del driver da utilizzare per questo UPS
port La porta da utilizzare (solitamente si indica auto, ma potrebbe essere anche esplicitata come spiegato qui)
desc Descrizione verbosa del proprio UPS
langid_fix Campo opzionale, necessario in alcuni casi. Per il Tecnoware d’esempio, la fix indicata è quella specifica per il Tecnoware 1100 (trovata in rete).

Così facendo, i NUT su Raspberry conosceranno ora un UPS chiamato “tecnoware“.

N.b. Va da sé che ogni UPS abbia una propria configurazione. Se si è fortunati, una configurazione molto semplice come quella qui sopra indicata è più che sufficiente; in altri casi è necessario scavare più a fondo per precisare meglio la configurazione, come documentato in dettaglio qui):

Configurazione del servizio

A questo punto è necessario definire il servizio che si interfacci, tramite il driver indicato in configurazione, l’UPS (o gli UPS) in questione.

Per farlo, modifichiamo il file nut.conf:

sudo nano /etc/nut/nut.conf

Per questa guida consideriamo che sia i client che il server giacciano sullo stesso computer (il Raspberry Pi); pertanto, rechiamoci sul fondo del file e impostiamo il MODE in “standalone“.

MODE=standalone

Terminata la configurazione, salvare e uscire (ctrl+x, y, invio).
Riavviare ora il Raspberry Pi con:

sudo reboot

Verifica

A questo punto verifichiamo che i NUT dialoghino correttamente con l’UPS.
Per farlo avviamo il servizio:

sudo upsdrvctl start

L’output dovrebbe essere il seguente:

Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - Megatec/Q1 protocol USB driver 0.12 (2.7.4)
Duplicate driver instance detected! Terminating other driver!

Il messaggio “Duplicate driver instance detected! Terminating other driver!” è positivo: significa che la configurazione a monte era corretta e al riavvio precedente è stato avviata correttamente.

Eseguendo:

sudo service nut-server status

il servizio dovrebbe risultare active (running), e quindi correttamente configurato e in esecuzione.

Per verificare, infine, che l’UPS stia dialogando correttamente con i NUT, eseguire il comando:

upsc tecnoware

dove ovviamente “tecnoware” è il nome dell’UPS configurato in precedenza.
L’output dovrebbe riportare lo stato istantaneo dell’UPS:

Init SSL without certificate database
battery.charge: 100
battery.voltage: 13.50
battery.voltage.high: 13.00
battery.voltage.low: 10.40
battery.voltage.nominal: 12.0
device.type: ups
driver.name: blazer_usb
driver.parameter.langid_fix: 0x4095
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.internal: 0.12
input.current.nominal: 2.0
input.frequency: 50.1
input.frequency.nominal: 50
input.voltage: 243.5
input.voltage.fault: 243.5
input.voltage.nominal: 230
output.voltage: 243.5
ups.beeper.status: disabled
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

In caso di errore, per esempio:

Init SSL without certificate database
Error: Unknown UPS

o altro, sarà evidente come la configurazione effettuata in precedenza non sia corretta, e quindi vada sistemata in modo opportuno. L’UPS non sarà configurato correttamente finché all’esecuzione del comando upsc qui sopra non si ottenga l’output che riporta lo stato dell’UPS.

Non proseguire oltre in questa guida fino all’ottenimento di tale risultato.

Configurare il client

In ultimo dobbiamo configurare il client, utile per eseguire comandi destinati all’UPS nonché all’autenticazione di eventuali componenti d’integrazione verso gli HUB personali per domotica. Inoltre, tale cliente è utile al monitoraggio dell’UPS, che configuremo.

Innanzitutto è necessario definire delle credenziali d’accesso. Per farlo si modifica il file upsd.users:

sudo nano /etc/nut/upsd.users

impostare come segue:

[admin]
password = mypasswd
actions = SET
instcmds = ALL

[upsmon]
password = mypasswd
upsmon master

Ovviamente i campi “password” andranno personalizzati con password personali, quelle che si crede. Il campo “upsmon” viene impostato a master, in quanto il computer è in carico nel monitorare l’UPS.

Ora modifichiamo il file upsmon.conf:

sudo nano /etc/nut/upsmon.conf

Innanzitutto aggiuntiamo, in testa, questa stringa:

MONITOR tecnoware@localhost 1 upsmon mypasswd master

la quale indica quale UPS sia da monitorare. Il nome “tecnoware” ovviamente andrà adeguato col nome dell’UPS configurato in precedenza, così come la password “mypasswrd“, da correggere in base alla propria.

Scendere poi in basso fino a trovare il blocco “# NOTIFYFLAG” e configurare come segue:

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

configurazione che farà sì che il sistema venga allertato in caso di cambi di alimentazione, di bassa batteria e di batteria da sostituire.
Terminata la configurazione, salvare e uscire (ctrl+x, y, invio).

A questo punto concludiamo sistemando i permessi:

sudo chown nut:nut /etc/nut/*
sudo chmod 640 /etc/nut/upsd.users /etc/nut/upsmon.conf

Infine, riavviamo:

sudo reboot

Verifica finale

Verifichiamo ora che Raspbian si accorga, banalmente, che la corrente sia venuta a mancare. Basterà staccare la spina all’UPS per ottenere, dopo pochi istanti, il seguente messaggio sulla riga di comando:

Broadcast message from nut@raspberrypi (somewhere) (Sun Jan 1 00:00:00 1980): 
UPS tecnoware@localhost on battery 

il che confermerà che l’UPS è sotto monitoraggio da parte del Raspberry Pi.

Esecuzione comandi

Se (e non è detto che sia così) oltre al monitoraggio, l’UPS supporta anche la ricezione di comandi, è possibile visualizzarne l’elenco tramite il comando:

sudo upscmd -l tecnoware

ovviamente adeguando il nome dell’UPS interrogato (nell’esempio, “tecnoware“).

Nel caso del Tecnoware 1100, i comandi elencati sono:

Instant commands supported on UPS [tecnoware]:

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

I comandi sono abbastanza auto-esplicativi.
Ipotizziamo di voler attivare/disattivare il cicalino che suona, automaticamente, in assenza di alimentazione. Il comando avrà questa sintassi:

sudo upscmd tecnoware beeper.toggle

verranno richiesti username e password: il primo sarà admin, la password quella impostata in precedenza.

Integrazioni

Una volta realizzata la propria installazione e configurazione di Network UPS Tools, tali funzioni possono essere utilizzate, come illustrato, tramite riga di comando oppure tramite integrazione con la propria domotica personale basata su HUB personali, e altro.

In caso si la propria domotica personale sia basata su Home Assistant, la guida per integrare un’installazione NUT (e quindi gli UPS tramite essa gestiti) è questa qui.


Telegram News Channel