Ich habe ein Pi Model B Rev 2.0 (glaube ich) und beabsichtige, es für ein Hausautomationssystem zu verwenden. Da ich einen Vorauszahlungszähler an meiner Stromversorgung habe, gehen mir gelegentlich die Elektronen aus, um die Netzversorgung meines Hauses zu umgehen!
Um Probleme zu vermeiden, habe ich eine USV in Form eines UPis Basic von PiModules erhalten . Ich habe es so konfiguriert, dass ich die Versorgungsspannungen über die serielle Schnittstelle des Pi abfragen kann (nicht die Standardkonfiguration, sondern eine im Handbuch dokumentierte unterstützte Einrichtung ).
Gegenwärtig wird ein dedizierter GPIO-Pin verwendet (Pin 13 im Header, GPIO27, glaube ich), und der eingebaute Mikrocontroller verwendet diesen und ein Python-Skript, das von rc.local ausgeführt wird, um dem Pi mitzuteilen, shutdown -h now
wann der Pin niedrig genommen wird. Dies geschieht, wenn die Taste "Shutdown" der USV gedrückt wird oder wenn die Batterieversorgung bei einem Ausfall der Hauptversorgung zu niedrig wird. Für die Aufzeichnung lautet das Skript:
#!/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
Dies scheint mir ein wenig unelegant zu sein, da init
es die eingebaute Fähigkeit hat, Energieereignisse zu verarbeiten. Ich möchte wiederholen , dass ich verwende sysvinit auf Raspbian Jessie nicht die Standard systemd für diese Version (für persönliche Präferenz und Vertrautheit Gründen).
Ich möchte zunächst das obige Skript durch etwas ersetzen, das init anweist, es zu tun, powerfailnow
wenn der Pin niedrig wird - und ein, powerokwait
wenn es anschließend hoch zurückgibt. Schließlich auch die serielle Schnittstelle abzufragen ich will , und halte ein Auge auf den Antworten auf @rpi
, @bat
und @ups
welche Rück die aktuellen Spannungen an dem 5V - Schiene von Pi, der LiPo - Akku und die Upis besitzen microUSB Eingang bzw. - so dass das Pi kann eine Warnung geben auf powerfail
Ich behandle einen Stromausfall (dies sollte zu einer Initiierungsaktion führen und den Pi den Stromausfallstatus an mich, den Benutzer, melden lassen - vorausgesetzt, ich habe es noch nicht bemerkt!)
Ich habe jedoch Schwierigkeiten herauszufinden, wie Linux-USV-Geräte signalisieren, init
dass die in definierten powerfail
\ powerwait
\ powerfailnow
\ powerokwait
Befehle ausgeführt \etc\inittab
werden sollen.
Kann mir zum Beispiel jemand raten, wie "erwachsene" USV einem Linux-Kernel auf einem normalen PC mitteilt, dass "Power" -Ereignisse auftreten, und wie ich dasselbe in diesem System auf einem Pi reproduzieren könnte?
Antworten:
Ah, ha! Einige Absätze in den Manpages für
init(8)
beziehen sich auf die veraltete Schnittstelle zum Schreiben eines Ein-Buchstaben-Werts an/etc/powerstatus
(jetzt ersetzt durch/var/run/powerstatus
) und anschließendes Sendeninit
einesSIGPWR
Signals. Der Brief sollte einer der folgenden sein:- ‚ F ‘ angeschlagene Leistung: [Hauptstrom ausgefallen ist und die] UPS ist die Kraft bereitstellt, die auszuführen
- Power ' O ' kay: [main] power wurde wiederhergestellt, führen Sie den
- ' L ' ow power: Die Stromversorgung fällt aus und die USV hat eine [kritisch] schwache Batterie. Führen Sie die
Wenn die angegebene Datei nicht existiert oder enthält nichts anderes als die Buchstabenpowerwait
undpowerfail
Einträge.powerokwait
Eintrag aus.powerfailnow
Eingabe aus.F
,O
oderL
wird init als verhalten , wenn er den Brief gelesen hatF
.Darunter befindet sich der Hinweis:
Dies ist zwar eine Antwort , aber nicht die Antwort. Als Nächstes muss ich mir den Quellcode ansehen, der als Nicht-GNU-Projekt auf der Hosting-Site der GNU gehostet wird .
quelle
Ich denke, der sauberste Ansatz wäre, einen Kernel-Gerätetreiber GPIO27 verwalten zu lassen und so einzurichten, dass er einen Interrupt empfängt, wenn er niedrig wird. Der Interrupt-Handler würde init benachrichtigen. Die Seite http://elinux.org/RPi_Low-level_peripherals besagt, dass Raspbian Wheezy GPIO-Interrupts unterstützt.
Ich entschuldige mich für die minderwertige Antwort. Ich habe mir die GPIO-Treiber von Linux und deren Erweiterung / Verbesserung nicht angesehen. Ich habe auch die derzeit genehmigte Methode zum Benachrichtigen von init in einem Interrupt-Handler nicht nachgeschlagen. Hoffentlich wird dieser Beitrag zu besseren Antworten führen.
quelle
powerstat
Datei- / SIGPWR-Signal sieht relativ einfach und unkompliziert aus, scheint jedoch veraltet zu sein. Ich versuche jetzt herauszufinden, wie dieinitctl
Pfeife im wirklichen Leben benutzt wird ...Durch das Durchsuchen des Quellcodes des SysV
init
, der auf dem Savannah-Server der Free Software Foundation verfügbar ist, konnte ich Anfragen an meine RPi senden,init
indem ich eine ausfüllte,struct init_request
wie in derinitreq.h
Header-Datei beschrieben. Insbesondere erforderte dies dasmagic
,sleeptime
und für meine Zwecke dercmd
Felder ausgefüllt werden, wobei letztere Satz nach einem derINIT_CMD_POWERFAIL
,INIT_CMD_POWERFAILNOW
oderINIT_CMD_POWEROK
.Mein Daemon / Programm, das als Benutzer mit der Berechtigung zum Schreiben in die Init-Steuerpipe ausgeführt werden muss (ursprünglich bei,
/dev/initctrl
aber auf Debian und damit auf Raspbian verschoben/run/initctrl
), konnte dann diese Struktur senden, aufinit
die dann entsprechend geantwortet wurde, indem auf die folgende Einträge in/etc/inittab
:Hinweis: Diese Schnittstelle - oder zumindest die Benachrichtigung über die Stromversorgung wurde vom neuen Fangled NICHT übernommen
systemd
- obwohl sie durch eine Art Frachtkultprogrammierung versucht, sicherzustellen, dass dasinitctrl
Rohr vorhanden ist. Auf der anderen Seite macht dies genau das, was ich auf meinem RPi-System möchte!quelle
systemd
dass die Hauptstromversorgung ausgefallen ist Auf diese Weise wird die folgende Meldung protokolliert: "UPS / Power Initctl-Anforderung empfangen. Dies ist in systemd nicht implementiert. Aktualisieren Sie Ihren UPS-Daemon!"initctl
Schnittstelle zu van Smoorenburg init wurde bereits 2012 von einem der (damaligen) Programmbetreuer als privat und nicht für Dritte deklariert . Miquel van Smoorenburgspowerd
, später Tom Webstersgenpowerd
, verwendete den/etc/powerstatus
Mechanismus ursprünglich .