У меня есть Pi Model B Rev 2.0 (я думаю), и я собираюсь использовать его для системы домашней автоматизации. Поскольку у меня есть счетчик предоплаты по электроснабжению, у меня иногда заканчиваются электроны, чтобы обойти электроснабжение моего дома!
Чтобы избежать проблем, я приобрел ИБП в форме UPis Basic производства PiModules . Я настроил его так, чтобы я мог опрашивать напряжение питания через собственный последовательный порт Pi (не конфигурация по умолчанию, а поддерживаемая установка, описанная в руководстве ).
В настоящее время он использует выделенный вывод GPIO (вывод 13 на заголовке, я полагаю, GPIO27), и встроенный микроконтроллер использует его и скрипт python, запущенный из rc.local, чтобы сообщить Pi, shutdown -h now
когда вывод выводится на низкий уровень - это происходит при нажатии кнопки «Выключение» ИБП или при критическом низком уровне заряда батареи в случае сбоя основного питания. Для записи скрипт:
#!/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
имеет встроенную возможность обрабатывать энергетические события. Я должен повторить, что я использую sysVinit на Raspbian Jessie, а не systemd по умолчанию для этого выпуска (по личным предпочтениям и из-за привычных причин).
Первоначально я хотел бы заменить вышеприведенный скрипт чем-то, что указывает init выполнить его, powerfailnow
когда пин становится низким, и делать, powerokwait
если впоследствии он возвращает высокий. В конце концов , я также хочу , чтобы опрашивать последовательный порт и следить за ответами на @rpi
, @bat
и @ups
которые возвращают текущее напряжение на 5V поручень Пи, то LiPo батареи и UPis собственный вход MicroUSB соответственно - так что Pi может дать предупреждение о / обрабатывать сбой питания (это должно привести к powerfail
действию инициализации и позволить Pi сообщать мне о состоянии потери питания, пользователю - при условии, что я еще не заметил!)
Однако у меня возникают трудности с выяснением того, как устройства ИБП Linux сигнализируют о init
том, что powerfail
\ powerwait
\ powerfailnow
\ powerokwait
команды, определенные в, \etc\inittab
должны быть выполнены.
Кто-нибудь может мне посоветовать, например, как «взрослые» ИБП сообщают ядру Linux на обычном ПК, что происходят события «питания» и как я могу воспроизвести то же самое в этой системе на Pi?
Ответы:
Ах, ха! Некоторые пункты в справочных страницах
init(8)
относятся к изношенному интерфейсу записи значения один письма к/etc/powerstatus
(теперь заменено/var/run/powerstatus
) , а затем посылаетinit
наSIGPWR
сигнал; письмо должно быть одним из:- « F » больной мощностью: [главная сила оборвалась , и] ИБП обеспечивает питание, выполните
- Power ' O ' kay: [основное] питание восстановлено, выполните
- ' L ' ow power: происходит сбой питания, и у ИБП [критически] низкий уровень заряда батареи, выполните
Если указанный файл не существует или содержит что-либо, кроме буквpowerwait
иpowerfail
запись.powerokwait
запись.powerfailnow
ввод.F
,O
илиL
init будет вести себя так, как будто он прочитал письмоF
.Ниже это рекомендация:
Таким образом , в то время как это могло бы быть ответом не ответ - рядом, мне нужно посмотреть на исходный код , который хранится в проекте , не GNU размещенного на хостинг сайта ГНУ .
источник
Я полагаю, что самым чистым подходом было бы иметь драйвер устройства ядра, управляющий GPIO27 и настроенный на получение прерывания, когда оно падает. Обработчик прерываний уведомит init. На странице http://elinux.org/RPi_Low-level_peripherals говорится, что Распбиан Уизи поддерживает прерывания GPIO.
Я извиняюсь за некачественный ответ, я не смотрел на драйверы gpio для Linux и как их расширять / улучшать. Я также не посмотрел текущий одобренный метод уведомления init из обработчика прерываний. Надеюсь, этот пост будет стимулировать лучшие ответы.
источник
powerstat
сигнал file / SIGPWR выглядит относительно простым и понятным, но кажется устаревшим. Я пытаюсь выяснить сейчас о реальном использованииinitctl
трубы ...Изучив исходный код SysV,
init
доступный на сервере Savannah Фонда Свободного Программного Обеспечения, я смог отправить запросы на мои RPi,init
заполнив,struct init_request
как описано вinitreq.h
заголовочном файле. В частности , это требуетсяmagic
,sleeptime
и для моих целейcmd
поля заполняются из, с последним набором бытия к одному изINIT_CMD_POWERFAIL
,INIT_CMD_POWERFAILNOW
илиINIT_CMD_POWEROK
.Мой демон / программа, которую нужно запустить как пользователь с правами на запись в канал управления init (первоначально он был
/dev/initctrl
перенесен в Debian и, следовательно, в Raspbian в/run/initctrl
), смог затем отправить эту структуру, наinit
которую затем соответствующим образом отреагировал, ответив на запрос. следующие записи в/etc/inittab
:Примечание: этот интерфейс - или, по крайней мере, уведомление источника питания НЕ было принято новым fangled
systemd
- даже при том, что, что может быть расценено как немного культового программирования, он действительно пытается гарантировать, чтоinitctrl
канал существует. С другой стороны, это именно то, что я хочу сделать в моей системе RPi!источник
systemd
том , что главная сила не смогла таким образом будет регистрироваться сообщение: «Получен запрос UPS / power initctl. Это не реализовано в systemd. Обновите ваш демон UPS!»initctl
Интерфейс ван Smoorenburg INIT был объявлен приватным и не для третьих лиц одного из (тогда) Сопровождающих программ обратно в 2012 году Микель вана Smoorenburg - хpowerd
, а позже Том Вебстерgenpowerd
, первоначально использовал/etc/powerstatus
механизм.