Ho un Pi Model B Rev 2.0 (penso) e intendo usarlo per un sistema di automazione domestica. Dato che ho un contatore di pagamento anticipato sulla mia fornitura di energia elettrica, di tanto in tanto esaurisco gli elettroni per aggirare la fornitura di corrente di casa mia!
Per evitare problemi ho ottenuto un UPS sotto forma di UPis Basic realizzato da PiModules . L'ho configurato in modo da poter eseguire il polling delle tensioni di alimentazione tramite la porta seriale del Pi (non la configurazione predefinita ma una configurazione supportata documentata nel manuale ).
Al momento utilizza un pin GPIO dedicato (pin 13 nell'intestazione, credo GPIO27) e il microcontrollore incorporato lo utilizza e uno script Python in esecuzione da rc.local per indicare a Pi shutdown -h now
quando il pin è basso - che si verifica quando si preme il pulsante "Spegnimento" dell'UPS o se l'alimentazione della batteria si esaurisce in modo critico in caso di interruzione dell'alimentazione principale. Per la cronaca lo script è:
#!/usr/bin/python
# import the libraries to use time delays, send os commands and access GPIO pins
import PRi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM) # Set pin numbering to board numbering
GPIO.setup(27, GPIO.IN, pull_up_don=GPIO.PUD_UP) # Setup pin 27 as an input
while True: # Setup a whille loopto wait for a button press
if(GPIO.input(27)==0): # Setup an if loop to run a shutdown command when button press sensed
os.system("sudo shutdown -h now") # Send shutdown command to os
break
time.sleep(1) # Allow a sleep time of 1 second to reduce CPU usage
Questo mi sembra un po 'inelegante dato che init
ha la capacità integrata di gestire eventi di potenza. Vorrei ribadire che sto usando Sysvinit su Raspbian Jessie NON default systemd per tale release (per preferenze personali e motivi di familiarità).
Vorrei, inizialmente, sostituire lo script sopra con qualcosa che dice a init di farlo powerfailnow
quando il pin diventa basso - e di fare un powerokwait
se successivamente ritorna alto. Alla fine ho anche voglia di interrogare la porta seriale e tenere d'occhio le risposte a @rpi
, @bat
e @ups
che ritorno le tensioni attuali su rotaia 5V del Pi, la batteria Li-Po e le Upis proprio ingresso MicroUSB rispettivamente - in modo che il Pi può dare un avviso / gestire un'interruzione di corrente (dovrebbe comportare powerfail
un'azione di inizializzazione e consentire al Pi di segnalarmi lo stato di perdita di potenza, l'utente - supponendo che non me ne sia già accorto!)
Tuttavia, ho difficoltà a scoprire come i dispositivi UPS Linux segnalano init
che devono essere eseguiti i comandi powerfail
\ powerwait
\ powerfailnow
\ powerokwait
definiti \etc\inittab
.
Qualcuno può darmi consigli, per esempio, come UPS "adulti" dicono a un kernel Linux su un normale PC che si stanno verificando eventi di "alimentazione" e come potrei riprodurre lo stesso in questo sistema su un Pi?