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 nowquando 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 initpossui 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 powerfailnowquando o pino estiver baixo - e para fazer um powerokwaitse, posteriormente, retornar alto. Eventualmente, também quero pesquisar a porta serial e acompanhar as respostas @rpi, @bate @upsque 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 powerfailaçã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 initque o powerfail\ powerwait\ powerfailnow\ powerokwaitcomandos definidos no \etc\inittabdeve 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?