初始化如何了解电源事件?


8

我有一个Pi Model B Rev 2.0(我认为),我打算将其用于家庭自动化系统。由于我的电源上有一个预付费电表,因此我偶尔会用尽电子来绕过我家的主电源!

为避免出现问题,我获得了由PiModules制造的UPis Basic形式的UPS 。我已经对其进行了配置,以便可以通过Pi自己的串行端口(不是默认配置,而是手册中记录的受支持的设置)轮询电源电压。

目前,它使用专用的GPIO引脚(我相信插头上的引脚13为GPIO27),内置微控制器使用shutdown -h now该引脚,并从rc.local运行python脚本来告诉Pi 该引脚何时变为低电平-如果按下UPS“关机”按钮,或者在主电源出现故障时电池电源严重不足,就会发生这种情况。作为记录,脚本是:

#!/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

鉴于它init具有处理电源事件的内置功能,因此这给我带来一点挑战。我应该重申,我在Raspbian Jessie上使用sysVinit,而不是该版本的默认systemd(出于个人喜好和熟悉性原因)。

首先,我想用上面的脚本替换上面的脚本,该脚本告诉init powerfailnow在引脚变为低电平时执行它- powerokwait如果随后返回高电平,则执行a 。最后,我也想查询串行端口,并保持眼睛上的响应@rpi@bat以及@ups其对皮的5V轨返回当前的电压下,锂聚合物电池和UPIS分别持有的MicroUSB输入-这样的皮可以给一个警告/处理电源故障(用户应powerfail采取初始化操作,并让Pi向我报告电源丢失状态-假设我还没准备好注意!)

但是,我很难找出Linux UPS设备如何发信号通知应执行中定义initpowerfail\ powerwait\ powerfailnow\ powerokwait命令\etc\inittab

例如,谁能告诉我“成长”的UPS如何告诉普通PC上的Linux内核正在发生“电源”事件,以及我如何在Pi的该系统中重现该事件?


感谢@ Jacobm001发现该问题的Python类部分没有标记,在过去的几个小时中,我一直在接受该语言的速成课程(我取得了一些进展),但是不久前,我想
还没

我也很好奇Pi(或init)如何知道电源事件。希望有人尽快回答。
PNDA

我会调查一下acpid,也许您可​​以更改脚本以在发生某些更改(高电平->低电平)时做出反应,而不是每秒轮询一次值?
Diederik de Haas 2015年

2
@ PandaLion98 Pi硬件没有任何电源事件,因此对此一无所知。如果实现了某些实现,则init只会通过内核(由于发生驱动程序事件,在pi的情况下可能是某些其他硬件的驱动程序)告知用户是否知道了它们,或者仅通过用户登陆应用程序知道了。
goldilocks

Answers:


5

啊,哈!在手册页的一些段落init(8)是指折旧写一个字母值的接口/etc/powerstatus(现在换成了/var/run/powerstatus),然后发送init一个SIGPWR信号; 该字母应为以下之一:

  • ' F '失败电源:[主电源发生故障,并且UPS正在提供电源,请执行powerwaitpowerfail项。
  • 电源“ Ø ”凯:已恢复[主]动力,执行powerokwait项目。
  • 大号 ”流功率:功率失败和UPS具有[临界]低电池,执行powerfailnow项。
如果指定的文件不存在或包含除字母以外的任何其他FO或者L,init将表现为如果有读了这封信F

在此之下是忠告:

不鼓励使用SIGPWR/etc/powerstatus。想要与之互动的人init应该使用/run/initctl控制通道- sysvinit有关此问题的更多文档,请参见软件包的源代码。

因此,尽管这可能是一个答案是没有答案-未来,我需要看看它保持为在托管非GNU项目的源代码的GNU的托管网站


1

我猜最干净的方法是让内核设备驱动程序管理GPIO27并设置为在低电平时接收中断。中断处理程序将通知init。页面http://elinux.org/RPi_Low-level_peripherals表示Raspbian Wheezy支持GPIO中断。

对于低质量的响应,我深表歉意,我没有研究Linux的gpio驱动程序以及如何扩展/增强它们。我也没有在中断处理程序中查找当前批准的用于通知init的方法。希望这篇文章能激发更好的回应。


是的,中断似乎比轮询更好-Diederik de Haas在上面提到了这一点。我目前的研究重点是“中断处理程序将通知init ...”,这是令人费解的机制,powerstat文件/ SIGPWR信号看起来相对简单明了,但似乎已被弃用。我现在正在尝试了解initctl管道的实际使用情况
SlySven

1

通过研究init可从自由软件基金会的Savannah服务器获得的SysV的源代码,我可以init通过填写头文件中struct init_request详述的来向我的RPi发送请求initreq.h。具体地,本所需要的magicsleeptime并且对于我的目的,cmd填充字段出来,后者设定为一个INIT_CMD_POWERFAILINIT_CMD_POWERFAILNOWINIT_CMD_POWEROK

我的守护程序/程序需要以用户身份运行,并且有权向init控制管道写入数据(最初是/dev/initctrl在Debian上,但在Debian上并因此在Raspbian上移动了/run/initctrl),然后能够发送该结构init,然后通过响应该结构来适当响应以下条目/etc/inittab

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

注意:这个接口-或至少新的连接器没有采用电源通知systemd-即使通过一些可能被视为崇拜的编程,它也确实尝试确保initctrl管道存在。另一方面,这确实符合我希望在RPi系统上执行的操作!


尽管我很欣赏您对这个问题的奉献精神,但我不禁注意到您已经花费了大量的时间来实现功能上与您的初始脚本相当的解决方案,并且甚至不能作为未来的证明。
德米特里·格里戈里耶夫

好吧,尽管它在功能上与初始系统等效,但是它使用推荐的提供的接口,而不是已弃用的接口。至于将来的证明,不是由编写未来系统的人来实现他们试图取代的系统的已知接口,以确保尽可能地向后兼容
SlySven

毕竟,对于具有UPS的系统而言,获得主要电源故障的通知非常重要,因此,半个体面的流程/系统经理应了解其前任的工作方式,并注意使用该API的其他流程-该接口存在,但被忽略似乎有点短视... 8- /根据位于以下代码的代码: github.com/systemd/systemd/blob/master/src/initctl/initctl.c,所有UPS都告知systemd主电源已发生故障这种方式将记录以下消息:“收到UPS /电源初始化请求。在systemd中未实现。请升级您的UPS守护程序!”
SlySven

“这不是在systemd中实现的。升级您的UPS守护程序” –这就是您需要了解的Linux中向后兼容性的全部内容;)
Dmitry Grigoryev

该计划的维护者之一(当时)于2012 年宣布initctl与van Smoorenburg初始接口是私有的,而不是供第三方使用。Miquel van Smoorenburg的接口powerd(后来为Tom Webster的接口genpowerd)最初使用该/etc/powerstatus机制。
JdeBP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.