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 nowcuá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 inittiene 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 powerfailnowcuando el pin powerokwaitesté 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, @baty @upsque 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 powerfailacció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 initque el powerfail\ powerwait\ powerfailnow\ powerokwaitcomandos se define en \etc\inittabdebe 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 enviarinitunaSIGPWRseñ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 letraspowerwaitypowerfail.powerokwaitentrada.powerfailnowentrada.F,OoLinit 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
powerstatseñal del archivo / SIGPWR parece relativamente simple y directa, pero parece estar en desuso. Estoy tratando de averiguar ahora sobre el uso real de lainitctltubería ...Al profundizar en el código fuente del SysV
initdisponible desde el servidor Savannah de la Free Software Foundation, pude enviar solicitudes a mis RPIinitcompletando unastruct init_requestcomo se detalla en elinitreq.harchivo de encabezado. Específicamente esto requería elmagic,sleeptimey, para mis propósitos loscmdcampos siendo llenada, siendo este último el conjunto a una deINIT_CMD_POWERFAIL,INIT_CMD_POWERFAILNOWoINIT_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/initctrlpero movido en Debian y por lo tanto Raspbian a/run/initctrl} pudo enviar esa estructura a lainitque 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 lainitctrltubería exista. ¡Por otro lado, esto hace exactamente lo que quiero que haga en mi sistema RPi!fuente
systemdque 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!"initctlinterfaz 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/powerstatusmecanismo.