Tengo un Pi Model B Rev 2.0 (creo) y tengo la intención de usarlo para un sistema de automatización del hogar. Como tengo un medidor de prepago en mi suministro de electricidad, ocasionalmente me quedo sin electrones para recorrer el suministro de energía de mi casa.
Para evitar problemas, he obtenido un UPS en forma de UPis Basic hecho por PiModules . Lo configuré para que pueda sondear los voltajes de suministro a través del puerto serie del propio Pi (no la configuración predeterminada sino una configuración compatible documentada en el manual ).
En la actualidad, usa un pin GPIO dedicado (pin 13 en el encabezado, GPIO27, creo) y el microcontrolador incorporado lo usa y un script de Python que se ejecuta desde rc.local para indicarle al Pi shutdown -h now
cuándo se baja el pin. que ocurre cuando se presiona el botón "Apagar" del UPS o si el suministro de la batería se agota críticamente en caso de falla del suministro principal. Para el registro el guión es:
#!/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
Esto me parece un poco poco elegante dado que init
tiene la capacidad incorporada de manejar eventos de energía. Debo reiterar que estoy usando sysVinit en Raspbian Jessie NO el systemd predeterminado para esa versión (por razones de preferencia personal y familiaridad).
Inicialmente, me gustaría reemplazar el script anterior con algo que le indique a init que haga su función powerfailnow
cuando el pin powerokwait
esté bajo, y que haga un si posteriormente regresa alto. Eventualmente también quiero sondear el puerto serie y mantener un ojo en las respuestas a @rpi
, @bat
y @ups
que devuelven las tensiones actuales en el carril 5V del Pi, la batería Li-Po y los Upis son dueños de entrada microUSB, respectivamente - de modo que el Pi puede dar una alerta de / manejar una falla de energía (debería resultar en una powerfail
acción de inicio y dejar que el Pi me informe el estado de la pérdida de energía, el usuario, ¡suponiendo que no lo haya notado!)
Sin embargo estoy teniendo dificultades para encontrar la manera de dispositivos Linux UPS señal de init
que el powerfail
\ powerwait
\ powerfailnow
\ powerokwait
comandos se define en \etc\inittab
debe ser realizada.
¿Alguien puede aconsejarme, por ejemplo, cómo UPS "adulto" le dice a un kernel de Linux en una PC normal que están ocurriendo eventos de "alimentación" y cómo puedo reproducir lo mismo en este sistema en un Pi?
Respuestas:
Ah, ja! Algunos párrafos en las páginas de manual se
init(8)
refieren a la interfaz depreciada de escribir un valor de una letra/etc/powerstatus
(ahora reemplazado por/var/run/powerstatus
) y luego enviarinit
unaSIGPWR
señal; la carta debe ser una de:- Energía en estado ' F ': [la alimentación principal ha fallado y] el UPS está proporcionando la energía, ejecuta las entradas
- Potencia ' O ' kay: se restableció la alimentación [principal], ejecute la
- ' L ' ow power: el poder está fallando y el UPS tiene una batería [críticamente] baja, ejecute la
Si el archivo especificado no existe o contiene algo más que las letraspowerwait
ypowerfail
.powerokwait
entrada.powerfailnow
entrada.F
,O
oL
init se comportará como si hubiera leído la letraF
.Debajo de esto está el aviso:
Entonces, si bien esta podría ser una respuesta, no es la respuesta; a continuación, tengo que mirar el código fuente que se mantiene como un proyecto no GNU alojado en el sitio de alojamiento de GNU .
fuente
Supongo que el enfoque más limpio sería tener un controlador de dispositivo kernel que administre GPIO27 y que se configure para recibir una interrupción cuando baja. El manejador de interrupciones notificaría a init. La página http://elinux.org/RPi_Low-level_peripherals dice que Raspbian Wheezy admite interrupciones GPIO.
Pido disculpas por la respuesta de baja calidad, no he mirado los controladores gpio de Linux y cómo extenderlos / mejorarlos. Tampoco he buscado el método aprobado actual para notificar a init desde un controlador de interrupciones. Esperemos que esta publicación estimule mejores respuestas.
fuente
powerstat
señal del archivo / SIGPWR parece relativamente simple y directa, pero parece estar en desuso. Estoy tratando de averiguar ahora sobre el uso real de lainitctl
tubería ...Al profundizar en el código fuente del SysV
init
disponible desde el servidor Savannah de la Free Software Foundation, pude enviar solicitudes a mis RPIinit
completando unastruct init_request
como se detalla en elinitreq.h
archivo de encabezado. Específicamente esto requería elmagic
,sleeptime
y, para mis propósitos loscmd
campos siendo llenada, siendo este último el conjunto a una deINIT_CMD_POWERFAIL
,INIT_CMD_POWERFAILNOW
oINIT_CMD_POWEROK
.Mi demonio / programa que debe ejecutarse como usuario con el permiso para escribir en la tubería de control de inicio {originalmente en
/dev/initctrl
pero movido en Debian y por lo tanto Raspbian a/run/initctrl
} pudo enviar esa estructura a lainit
que luego respondió adecuadamente respondiendo al siguientes entradas en/etc/inittab
:Nota: esta interfaz, o al menos la notificación de la fuente de alimentación NO ha sido adoptada por el nuevo fracasado
systemd
, aunque, por lo que podría considerarse como un poco de programación de culto de carga , intenta asegurarse de que lainitctrl
tubería exista. ¡Por otro lado, esto hace exactamente lo que quiero que haga en mi sistema RPi!fuente
systemd
que la alimentación principal ha fallado de esta manera se registrará el mensaje: "Recibió UPS / solicitud de inicio de alimentación. Esto no está implementado en systemd. ¡Actualice su demonio UPS!"initctl
interfaz con van Smoorenburg init fue declarada privada y no para terceros por uno de los (entonces) mantenedores del programa en 2012. Miquel van Smoorenburgpowerd
, más tarde Tom Webstergenpowerd
, usó originalmente el/etc/powerstatus
mecanismo.