J'ai un Pi Model B Rev 2.0 (je pense) et j'ai l'intention de l'utiliser pour un système domotique. Comme j'ai un compteur à prépaiement sur mon alimentation électrique, je manque parfois d'électrons pour contourner l'alimentation secteur de ma maison!
Pour éviter les problèmes, j'ai obtenu un onduleur sous la forme d'un UPis Basic fabriqué par PiModules . Je l'ai configuré pour pouvoir interroger les tensions d'alimentation via le propre port série du Pi (pas la configuration par défaut mais une configuration prise en charge documentée dans le manuel ).
À l'heure actuelle, il utilise une broche GPIO dédiée (broche 13 sur l'en-tête, GPIO27 je crois) et le micro-contrôleur intégré utilise cela et un script python exécuté depuis rc.local pour indiquer au Pi shutdown -h now
quand la broche est prise basse - ce qui se produit lorsque le bouton "Arrêt" de l'onduleur est enfoncé ou si l'alimentation de la batterie est extrêmement faible en cas de panne de l'alimentation principale. Pour mémoire, le script est:
#!/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
Cela me semble un peu inélégant étant donné qu'il init
a la capacité intégrée de gérer les événements d'alimentation. Je dois répéter que j'utilise sysVinit sur Raspbian Jessie PAS le systemd par défaut pour cette version (pour des raisons de préférence personnelle et de familiarité).
Je voudrais, dans un premier temps, remplacer le script ci-dessus par quelque chose qui dit à init de faire son powerfailnow
quand la broche devient basse - et de faire un powerokwait
s'il revient par la suite haut. Finalement , je veux aussi interroger le port série et garder un œil sur les réponses à @rpi
, @bat
et @ups
qui renvoient les tensions actuelles sur le rail de 5 V du Pi, la batterie LiPo et les Upis possèdent entrée microUSB respectivement - de sorte que Pi peut donner une alerte sur / gérer une coupure de courant (cela devrait entraîner une powerfail
action init et laisser le Pi me signaler l'état de la perte de puissance, l'utilisateur - en supposant que je n'ai pas encore remarqué!)
Cependant, j'ai du mal à savoir comment les périphériques Linux UPS signalent init
que les commandes powerfail
\ powerwait
\ powerfailnow
\ powerokwait
définies dans \etc\inittab
doivent être exécutées.
Quelqu'un peut-il me dire, par exemple, comment un onduleur «adulte» peut dire à un noyau Linux sur un PC normal que des événements de «puissance» se produisent et comment je pourrais reproduire le même dans ce système sur un Pi?
Réponses:
Ah, ha! Certains paragraphes des pages de manuel de se
init(8)
réfèrent à l' interface dépréciée de l'écriture d'une valeur d'une lettre/etc/powerstatus
(maintenant remplacée par/var/run/powerstatus
), puis de l'envoi d'init
unSIGPWR
signal; la lettre doit être l'une des suivantes:- Puissance « F » en panne: [l'alimentation principale est en panne et l'onduleur] fournit l'alimentation, exécute les entrées
- Power ' O ' kay: l'alimentation [principale] a été rétablie, exécutez l'
- « L puissance OW »: la puissance échoue et l'onduleur a une batterie faible [critique], exécutez l'
Si le fichier spécifié n'existe pas ou contient autre chose que les lettrespowerwait
etpowerfail
.powerokwait
entrée.powerfailnow
entrée.F
,O
ouL
, init se comportera comme s'il avait lu la lettreF
.En dessous, vous trouverez l'avis:
Donc, bien que cela puisse être une réponse, ce n'est pas la réponse - ensuite, je dois regarder le code source qui est conservé en tant que projet non GNU hébergé sur le site d'hébergement de GNU .
la source
Je suppose que l'approche la plus propre serait d'avoir un pilote de périphérique noyau gérant GPIO27 et configuré pour recevoir une interruption lorsqu'elle devient faible. Le gestionnaire d'interruption avertirait init. La page http://elinux.org/RPi_Low-level_peripherals indique que Raspbian Wheezy prend en charge les interruptions GPIO.
Je m'excuse pour la réponse de mauvaise qualité, je n'ai pas regardé les pilotes gpio de Linux et comment les étendre / les améliorer. Je n'ai pas non plus recherché la méthode actuellement approuvée pour notifier init à partir d'un gestionnaire d'interruption. Espérons que ce message stimulera de meilleures réponses.
la source
powerstat
laisse perplexe, le signal file / SIGPWR semble relativement simple et direct mais semble obsolète. J'essaie de découvrir maintenant l'utilisation réelle de lainitctl
pipe ...En fouillant dans le code source du SysV
init
disponible sur le serveur Savannah de la Free Software Foundation, j'ai pu envoyer des demandes à mes RPiinit
en remplissant unstruct init_request
comme détaillé dans leinitreq.h
fichier d' en- tête. Plus précisément , cela a nécessité lamagic
,sleeptime
et, pour mes besoins lescmd
champs étant rempli, ce dernier étant mis à l' un desINIT_CMD_POWERFAIL
,INIT_CMD_POWERFAILNOW
ouINIT_CMD_POWEROK
.Mon démon / programme qui doit être exécuté en tant qu'utilisateur avec la permission d'écrire dans le tube de contrôle d'init {à l'origine
/dev/initctrl
mais déplacé sur Debian et donc Raspbian vers/run/initctrl
} a ensuite pu envoyer cette structure àinit
laquelle a ensuite répondu de manière appropriée en répondant à la entrées suivantes dans/etc/inittab
:Remarque: cette interface - ou du moins la notification d'alimentation n'a PAS été adoptée par le nouveau fangled
systemd
- même si, ce qui pourrait être considéré comme un peu de programmation culte du fret, il essaie de s'assurer que leinitctrl
tuyau existe. D'un autre côté, cela fait exactement ce que je veux qu'il fasse sur mon système RPi!la source
systemd
que l'alimentation principale est en panne de cette façon va enregistrer le message: "Requête UPS / alimentation initctl reçue. Ceci n'est pas implémenté dans systemd. Mettez à jour votre démon UPS!"initctl
interface de van Smoorenburg init a été déclarée privée et non pour des tiers par l'un des responsables du programme (à l'époque) en 2012. Miquel van Smoorenburgpowerd
, plus tard Tom Webstergenpowerd
, a utilisé à l'origine le/etc/powerstatus
mécanisme.