Eu tenho um Pi Modelo B Rev 2.0 (eu acho) e pretendo usá-lo para um sistema de automação residencial. Como tenho um medidor de pré-pagamento em meu suprimento de eletricidade, ocasionalmente fico sem elétrons para contornar o fornecimento de energia elétrica da minha casa!
Para evitar problemas, obtive um no-break na forma de um UPis Basic da PiModules . Eu o configurei para que eu possa pesquisar as tensões de alimentação através da porta serial do Pi (não a configuração padrão, mas uma instalação suportada documentada no manual ).
No momento, ele usa um pino GPIO dedicado (pino 13 no cabeçalho, GPIO27, eu acredito) e o microcontrolador embutido usa isso e um script python executado em rc.local para informar ao Pi shutdown -h now
quando o pino está baixo - o que acontece quando o botão "Desligar" do no-break é pressionado ou se a alimentação da bateria ficar muito baixa no caso de falha na alimentação principal. Para o registro, o 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
Isso me parece um pouco deselegante, pois init
possui a capacidade integrada de lidar com eventos de energia. Devo reiterar que estou usando o sysVinit no Raspbian Jessie, NÃO o sistema padrão para essa versão (por preferência pessoal e por motivos de familiaridade).
Gostaria, inicialmente, de substituir o script acima por algo que diga ao init para fazer isso powerfailnow
quando o pino estiver baixo - e para fazer um powerokwait
se, posteriormente, retornar alto. Eventualmente, também quero pesquisar a porta serial e acompanhar as respostas @rpi
, @bat
e @ups
que retornam as tensões atuais no trilho de 5V do Pi, a bateria LiPo e a própria entrada microUsb da UPis, respectivamente - para que o Pi possa emitir um alerta em / lida com uma falha de energia (deve resultar em uma powerfail
ação init e deixar o Pi relatar o status de perda de energia para mim, o usuário - supondo que eu ainda não tenha notado!)
No entanto, estou tendo dificuldade em descobrir como dispositivos Linux UPS sinalizar para init
que o powerfail
\ powerwait
\ powerfailnow
\ powerokwait
comandos definidos no \etc\inittab
deve ser realizada.
Alguém pode me aconselhar, por exemplo, como o UPS "adulto" diz a um kernel Linux em um PC normal que eventos de "energia" estão acontecendo e como eu posso reproduzir o mesmo neste sistema em um Pi?