Realizzare un gruppo di continuità UPS a basso costo per Raspberry Pi

5 minuti di lettura
SCOPI DEL PROGETTO:
  • Realizzare un sistema UPS per il sostegno energetico automatico in caso di blackout per Raspberry Pi
  • Livello di difficoltà: medio/basso
  • Costo: ridotto (<30 €)
CONCETTI AFFRONTATI:
  • Connessioni e configurazione software
COMPONENTI SOFTWARE UTILIZZATE:
DISPOSITIVI FISICI UTILIZZATI:
GUIDA maggiormente indicatA per:

Tutti gli ambienti

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 progetto: 2.2

Raspberry Pi 2 Top

ATTENZIONE: QUESTO PROGETTO È CONSIDERATO OBSOLETO A PARTIRE DA NOVEMBRE 2019.
AL SUO POSTO È STATO RILASCIATO UN PROGETTO RIVISTO.

Abstract

Il Raspberry Pi è un autentico gioiello di miniaturizzazione, ma ha sgradevole tendenza a corrompere la SD card ospitata, sopratutto se non di buona qualità, specialmente in caso di improvvise cadute di tensione o per blackout (power outage).

In ambito domotico, poi, può essere utile che l’host rappresentato dal Raspberry Pi rimanga acceso malgrado un black-out e provveda automaticamente, magari, allo spegnimento controllato per evitare danni.

Sul mercato esistono gruppi di continuità, o UPS, utili a sostenere la tensione a 220v per ore, se non per giorni, ma hanno lo sgradevole difetto di esser costosi, ingombranti e consumare, comunque, energia. Utilizzare un UPS tradizionale per sostenere la tensione in ingresso a un Raspberry Pi sarebbe inoltre come sparare con un cannone a una mosca.

Una soluzione alternativa, ovviamente, esiste.
Sul mercato sono disponibili da ormai anni batterie portatili chiamate “power bank” (per portare un esempio, su Amazon ne esiste una varietà impressionante) le quali sono, spesso, alimentate tramite una porta Micro USB (come il Raspberry Pi) e che erogano tensione via porta USB standard.

Con questo progetto vedremo come utilizzare una power bank come UPS e come, via software (in caso si usi Raspbian come sistema operativo), rilevare un power outage (black-out) e provvedere allo spegnimento controllato del Raspberry prima che la batteria si esaurisca.

Prerequisiti

Power BankCiò di cui abbiamo bisogno è solo power bank sufficientemente potente sia in termini di capacità accumulo, sia in termini di potenza erogata. La capacità di accumulo si misura in Ampere/ora, nel caso delle power bank in mAh, ovvero milliAmpere/ora. Per alimentare per circa 24 ore un Raspberry Pi 3 model B+ è necessaria una capacità di accumulo di 10.000 mAh.

In merito all’erogazione, è necessario che la power bank sia in grado di erogare su USB almeno 2 Ampere; per quanto riguarda la porta di ingresso (di ricarica) della power bank è necessario che essa sia dotata di una porta Micro USB. Infine, è necessario un cavo USB / Micro USB (maschio/maschio).

Si dà per scontato che si abbia un Raspberry Pi il quale sia alimentato da un alimentatore Micro USB.

Nota di sicurezza: si consiglia l’uso di sole batterie di qualità che abbiano, nelle caratteristiche, specifiche funzionalità di prevenzione contro l’overcharge (sovraccarico) nonché la funzionalità di passthrough, ovvero la capacità di accettare corrente in ingresso ed erogarne in uscita, contemporaneamente. L’uso di batterie inappropriate è, per ragioni di sicurezza, caldamente sconsigliato.

Un buon prodotto è il Laptone 5200.

Procedimento

Il procedimento è molto semplice e intuitivo. Dopo aver spento il Raspberry (tramite shutdown; non scollegate mai brutalmente la vostra unità), scollegare l’alimentazione dalla porta Micro USB e collegarla alla Micro USB di ingresso della power bank; collegare il cavo USB sulla powerbank e l’altro capo, Micro USB, sul Raspberry.

Di fatto l’UPS è pronto: quando la batteria sarà carica il flusso di corrente dall’alimentatore alla power bank e dalla power bank al Raspberry sarà continuo, anche e sopratutto in caso di power outage, in quanto le batterie (cariche) della power bank erogheranno tensione continua fin tanto che avranno disponibilità di carica.

Ma se il power outage si protraesse oltre la durata delle batterie?
Il Raspberry Pi si spegnerebbe esattamente come in assenza dell’UPS, quindi brutalmente; è qui che ci viene incontro il software upsd (Uninterruptible Power Supply Daemon).

Intercettare il power outage

In caso si utilizzi un sistema operativo Raspbian è possibile intercettare il power outage (black-out) tramite la valutazione lo stato elettrico della porta ethernet del Raspberry e l’uso combinato del demone upsd, il quale appunto ci permette di interpretare la caduta elettrica su tale porta e, conseguentemente, di effettuare delle azioni, quale banalmente quella di spegnere – in modo controllato – l’unità.

L’unico pre-requisito è avere il Raspberry collegato con un cavo ethernet ad uno switch, un router, un hub collegato, a sua volta alla rete elettrica per l’alimentazione.

Chiaramente, nel momento in cui dovesse intervenire un power outage lo stato elettrico della porta ethernet diventerebbe “disconnesso“, pertanto il software upsd lo interpreterà come “inizio della sessione a batteria” e provvederà a fare quel che gli avremo comandato di fare, ovvero spegnere in modo controllato l’unità prima che la carica si esaurisca..

N.b. In caso si utilizzino alternative (ad esempio distribuzioni di sistema operativo “chiuse”, come HASSIO o altro) questa procedura non sarà attuabile. L’UPS verrà utilizzato in modo semplice, ovvero in caso di assenza di corrente continuerà ad alimentare il Raspberry fino al termine della carica, dopodiché si spegnerà.

 

UPS Raspberry con Power Bank
schema di connessione

Soddisfatto il pre-requisito, la procedura di installazione del demone upsd è la seguente:

wget http://raspi-ups.appspot.com/upsd/upsd_1.2-1.deb
sudo dpkg -i upsd_1.2-1.deb

Nb. Eventualmente lo si voglia successivamente cancellare, il comando è semplice:

sudo dpkg -r upsd

Il demone è concepito per monitorare la disponibilità residua di capacità della powerbank in base all’assorbimento istantaneo e medio del Raspberry e, a fronte dell’imminente esaurimento della corrente disponibile, provvede allo spegnimento controllato dell’unità. La stima è piuttosto accurata, comunque la soglia per il quale la batteria viene considerata scarica (pertanto viene eseguito lo shutdown) è 30%.

Il file di configurazione si trova presso “/etc/upsd/upsd.conf” ed è modificabile tramite il comando

sudo nano /etc/upsd/upsd.conf

Tale file è di default configurato come segue:

# This is the configuration file for the upsd daemon program.
# Please see the upsd.conf(5) man page for further documentation.

# Enabled switch.
ENABLED = YES

# The network interface used to determine power outages.
INTERFACE = eth0

# The check interval for power outages, in milliseconds (ms).
CHECK_INTERVAL = 1000

# The update interval of the upsd.status file, in seconds (s).
UPDATE_INTERVAL = 10

# The amount of time the fully charged battery of the UPS can power the system, in seconds (s).
# BATTERY_RUN_TIME =

# The amount of time the empty battery of the UPS needs to become fully charged, in seconds (s).
# BATTERY_CHARGE_TIME =

# The charge level under which the battery will be considered empty, in percent (%).
# Set this to 0 to disable this feature.
BATTERY_LOW_LEVEL = 30

# The time limit after a loss of power at which the battery will be considered empty, in seconds (s).
# Set this to 0 to disable this feature.
BATTERY_LOW_TIME = 0

Le righe in grassetto sono quelle configurate di default. Come si capisce anche dalle descrizioni, il demone è ampiamente configurabile. Il manuale (che potete comunque scaricare da qui) è consultabile tramite il comando:

man upsd.conf

Per visualizzare in tempo reale il funzionamento del demone, il comando è il seguente:

sudo tail -f /var/log/syslog | grep upsd 

Sarà poi sufficiente disconnettere la porta ethernet – per simulare un outage – e ottenere il seguente log a terminale:

Jul 5 18:24:38 raspberrypi upsd[24676]: There is a power outage right now.
Jul 5 18:24:38 raspberrypi upsd[24676]: The estimated current battery charge level is 100 %.
Jul 5 18:24:38 raspberrypi upsd[24676]: There are 02:48:00 hours remaining before the battery will be empty.
Jul 5 18:24:38 raspberrypi upsd[24676]: If the battery should actually run empty, appropiate action will be taken.

Riconnettendo la porta – quindi facendo credere al demone che la corrente sia tornata – si otterrà il seguente log:

Jul 5 18:24:44 raspberrypi upsd[24676]: The power outage is over now. It could be successfully bridged over by using the battery.
Jul 5 18:24:44 raspberrypi upsd[24676]: The outage lasted for 00:00:06 hours.
Jul 5 18:24:44 raspberrypi upsd[24676]: The estimated battery charge level decreased from 100 to 99 % during the outage.
Jul 5 18:24:44 raspberrypi upsd[24676]: The system could have run for 02:47:53 more hours before the battery would have been empty.

Da qui in poi, il demone vigilerà sull’andamento dell’alimentazione e, in caso di power outage, al ragiungimento (stimato) della soglia del 30% di batteria residua (o diverso valore, cambiando l’impostazione del campo “BATTERY_LOW_LEVEL” presso il file di configurazione) provvederà al salvifico shutdown dell’unità Raspberry.

DEMO:


Telegram News Channel

26 Comments

  1. Riccardo Crociani

    Ciao, nella guida viene suggerito il prodotto AUKEY Powerbank 20000mAh ma nelle sue specifiche da nessuna parte viene definito come passthrough. Qualcuno ha provato proprio con quel modello di powerbank? Grazie

  2. maverick464

    Salve, vorrei capire se fosse possibile ricevere una mail quando entra in azione il PowerBank avendo cura di collegare il RPi sia via LAN (per la verifica del passaggio a PowerBank da parte di upsd) sia WiFi, avendo il router collegato ad un altro UPS in un’altra stanza della casa. Grazie

    1. Un’idea potrebbe esser quella di utilizzare Node-RED: definire un semplice flusso che, rilevato il down dell’ethernet, invii una mail usando la rete rimanente

      1. maverick464

        Grazie mille, sono assolutamente un newbie di Raspberry (e programmazione) e non conoscevo Node-RED. Ho provato ad installarlo ed ora proverò a cercare in internet come fare. Vediamo se ne verrò a capo. Per ora configurerò UPSD appena mi arriverà il PowerBank.

  3. Antonello Olla

    Buongiorno, e complimenti per l’articolo, interessantissimo e ben scritto.
    Seguendo le istruzioni sono riuscito a creare un gruppo di continuità, utilizzando il demone UPSD; ho impostato un tempo di 5 minuti per lo shutdown a seguito dell’ outage ma, allo scadere del tempo non mi ha eseguito lo spegnimento…
    Sto sbagliando qualcosa?

    posto le impostazioni del file di configurazione e il LOG della simulazione dell’outage:

    FILE DI CONFIGURAZIONE:
    # This is the configuration file for the upsd daemon program.
    # Please see the upsd.conf(5) man page for further documentation.

    # Enabled switch.
    ENABLED = YES

    # The network interface used to determine power outages.
    INTERFACE = eth0

    # The check interval for power outages, in milliseconds (ms).
    CHECK_INTERVAL = 1000

    # The update interval of the upsd.status file, in seconds (s).
    UPDATE_INTERVAL = 10

    # The amount of time the fully charged battery of the UPS can power the system, in seconds (s).
    # BATTERY_RUN_TIME =

    # The amount of time the empty battery of the UPS needs to become fully charged, in seconds (s).
    # BATTERY_CHARGE_TIME =

    # The charge level under which the battery will be considered empty, in percent (%).
    # Set this to 0 to disable this feature.
    BATTERY_LOW_LEVEL = 0

    # The time limit after a loss of power at which the battery will be considered empty, in seconds (s).
    # Set this to 0 to disable this feature.
    BATTERY_LOW_TIME = 300

    LOG DELLA SIMULAZIONE:
    Jun 21 07:40:50 raspino upsd[2764]: There is a power outage right now.
    Jun 21 07:40:50 raspino upsd[2764]: The estimated current battery charge level is 100 %.
    Jun 21 07:40:50 raspino upsd[2764]: There are 04:00:00 hours remaining before the battery will be empty.
    Jun 21 07:40:50 raspino upsd[2764]: If the battery should actually run empty, appropiate action will be taken.
    Jun 21 07:45:51 raspino upsd[2764]: The system is running out of battery now.
    Jun 21 07:45:51 raspino upsd[2764]: The outage is already lasting for 00:05:01 hours now.
    Jun 21 07:45:51 raspino upsd[2764]: The estimated current battery charge level is 97 %. The battery is considered empty now.
    Jun 21 07:45:51 raspino upsd[2764]: Appropiate action will be taken now (usually a system shutdown).

    grazie a tutti per le eventuali risposte

      1. Antonello Olla

        Ringrazio per la risposta; ho personalizzato i due campi, ho rieseguito una simulazione di “power outage” ma nulla, il sistema mi riconosce la necessità di eseguire uno shutdown ma non lo fa… posto i log:

        Jul 2 07:14:00 raspino upsd[14331]: There is a power outage right now.
        Jul 2 07:14:00 raspino upsd[14331]: The estimated current battery charge level is 100 %.
        Jul 2 07:14:00 raspino upsd[14331]: There are 01:30:00 hours remaining before the battery will be empty.
        Jul 2 07:14:00 raspino upsd[14331]: If the battery should actually run empty, appropiate action will be taken.
        Jul 2 07:19:01 raspino upsd[14331]: The system is running out of battery now.
        Jul 2 07:19:01 raspino upsd[14331]: The outage is already lasting for 00:05:01 hours now.
        Jul 2 07:19:01 raspino upsd[14331]: The estimated current battery charge level is 94 %. The battery is considered empty now.
        Jul 2 07:19:01 raspino upsd[14331]: Appropiate action will be taken now (usually a system shutdown).
        Jul 2 07:39:23 raspino upsd[14331]: The power outage is over now. It could be successfully bridged over by using the battery.

        alle 7:19 mi indica di voler eseguire l’azione di shutdown ma alle 7:39 è ancora acceso…

        Dove/cosa sto sbagliando?

        Grazie e buona giornata

  4. Giuseppe

    Ho preso il laptone 5200 come suggerito da voi ma secondo me l’erogazione non è sufficiente, utilizzo hassio si docker e ogni volta va in blocco e diventa irraggiungibile.. Un consiglio per chi legge, non compratelo…..

      1. Giuseppe

        controllando meglio, in effetti, raspbian rimane accessibile da vnc ma hassio su docker non torna più online fino al riavvio di tutto il sistema… Premetto che non ho impostato il software indicato nella guida ma non dovrebbe essere quello il problema suppongo.. Potete aiutarmi? Grazie

  5. pasquale petrone

    salve
    una domanda.. ma chi riavvia il raspberry al ripristino della tensione di rete? considerato che il booster fornisce tensione anche a raspberry spento quest’ultimo non rileva cambiamenti alla sua porta di alimentazione!

    1. Corretto: quanto dici: il punto è che il mini-UPS è concepito per sostenere il raspberry fino al ritorno della corrente, mentre lo shutdown è solo un’ultima spiaggia per evitare che si corrompa – eventualmente – il filesystem. Se fai shutdown l’unico modo di riavvialo è disconnettere l’alimentazione ad esso e riconnetterla. Quindi:
      – o non configuro lo shutodown, pertanto se la corrente torna prima che la la batteria si sia esaurita, tutto ok, diversamente il raspberry si spegne brutalmente ma al ritorno della corrente riparte da sé;
      – configuro lo shutdown, ma quando torna la corrente devo rimetterlo in piedi a mano.

  6. Tiziano

    ciao potete suggerirmi un modello di powerbank compatibile avente tutte le funzioni necessarie alla funzione Ups anche se con maggiore ah per collegare anche 2 raspberry contemporaneamente ?

  7. Marco BRUNO

    Molto interessante.
    Sto cercando di capire come fare un dispositivo del genere ma con possibilità di riaccensione nel caso di blackout prolungati e conseguente scaricamento della batteria e shutdown del sistema.

  8. Andrea

    Occhio all’acquisto dei powerbank passthrough, sempre meglio approfondire con qualcuno che già abbia usato quel modello.

    Ho acquistato un Mi Power Bank2 da 10000mAh che è passthrough, ma quando viene tolta tensione in ingresso, la toglie per circa 1 secondo anche in uscita, rendendolo inutile come UPS 🙁

    P.s. Ottimo articolo!

I commenti sono chiusi.