Saya memiliki Pi Model B Rev 2.0 (saya pikir) dan saya bermaksud menggunakannya untuk sistem Home Automation. Karena saya memiliki meteran prabayar pada pasokan listrik saya, saya kadang-kadang kehabisan elektron untuk berkeliling Pasokan Listrik rumah saya!
Untuk menghindari masalah, saya telah memperoleh UPS dalam bentuk UPis Basic yang dibuat oleh PiModules . Saya telah mengonfigurasinya sehingga saya dapat mensurvei tegangan suplai melalui port serial Pi sendiri (bukan konfigurasi default tetapi set-up yang didukung didokumentasikan dalam manual ).
Saat ini menggunakan pin GPIO khusus (pin 13 di header, GPIO27 saya percaya) dan micro-controller built-in menggunakan itu dan skrip python berjalan dari rc.local untuk memberitahu Pi shutdown -h now
ketika pin diambil rendah - yang terjadi ketika tombol "Shutdown" UPS ditekan atau jika pasokan baterai hampir habis jika terjadi kegagalan pasokan utama. Sebagai catatan, skripnya adalah:
#!/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
Hal ini mengejutkan saya karena saya sedikit canggung karena init
memiliki kemampuan bawaan untuk menangani peristiwa daya. Saya harus menegaskan kembali bahwa saya menggunakan sysVinit pada Raspbian Jessie BUKAN systemd default untuk rilis itu (untuk preferensi pribadi dan alasan keakraban).
Saya ingin, pada awalnya, mengganti skrip di atas dengan sesuatu yang memberitahu init untuk melakukannya powerfailnow
ketika pin menjadi rendah - dan untuk melakukan powerokwait
jika kemudian kembali tinggi. Akhirnya saya juga ingin polling port serial dan mengawasi tanggapan terhadap @rpi
, @bat
dan @ups
yang mengembalikan tegangan arus pada rel 5V Pi, baterai LiPo dan input microUsb UP UP masing-masing - sehingga Pi dapat memberi peringatan pada Saya menangani kegagalan daya (seharusnya menghasilkan powerfail
tindakan init dan membiarkan Pi melaporkan status kehilangan daya kepada saya, pengguna - dengan asumsi saya belum siap memperhatikan!)
Namun saya mengalami kesulitan mencari tahu bagaimana perangkat UPS Linux memberi sinyal init
bahwa powerfail
\ powerwait
\ powerfailnow
\ powerokwait
perintah yang didefinisikan \etc\inittab
harus dilakukan.
Adakah yang bisa memberi tahu saya, misalnya, bagaimana UPS "dewasa" memberi tahu kernel Linux pada PC normal bahwa peristiwa "kekuatan" terjadi dan bagaimana saya dapat mereproduksi hal yang sama dalam sistem ini pada Pi?
Jawaban:
Ah, ha! Beberapa paragraf di halaman manual untuk
init(8)
mengacu pada terdepresiasi antarmuka penulisan nilai satu huruf ke/etc/powerstatus
(sekarang diganti dengan/var/run/powerstatus
) dan kemudian mengirimkaninit
sebuahSIGPWR
sinyal; surat itu harus salah satu dari:- ' F ' sakit kekuasaan: [daya utama telah gagal dan] UPS menyediakan daya, jalankan
- Daya ' O ' kay: daya [utama] telah dipulihkan, jalankan
- ' L ' ow power: listriknya mati dan UPS memiliki baterai lemah, jalankan
Jika file yang ditentukan tidak ada atau mengandung apa pun selain hurufpowerwait
danpowerfail
entri.powerokwait
entri.powerfailnow
entri.F
,O
atauL
, init akan berperilaku seolah-olah telah membaca surat ituF
.Di bawah ini adalah penasehat:
Jadi sementara ini mungkin jawaban itu bukan yang jawaban - berikutnya, saya perlu melihat kode sumber yang disimpan sebagai proyek non-GNU host di situs GNU hosting .
sumber
Saya kira pendekatan yang paling bersih adalah memiliki driver perangkat kernel mengelola GPIO27 dan mengatur untuk menerima interupsi ketika semakin rendah. Penangan interrupt akan memberi tahu init. Halaman http://elinux.org/RPi_Low-level_peripherals mengatakan bahwa Raspbian Wheezy mendukung interupsi GPIO.
Saya minta maaf atas respons berkualitas rendah, saya belum melihat driver gpio Linux dan cara memperluas / meningkatkannya. Saya juga belum melihat metode yang disetujui saat ini untuk memberi tahu init dari dalam interrupt handler. Semoga postingan ini akan merangsang respons yang lebih baik.
sumber
powerstat
Penginterupsi interupsi akan memberi tahu init ..." itu adalah mekanisme yang membingungkan, sinyal file / SIGPWR terlihat relatif sederhana dan mudah tetapi tampaknya sudah usang. Saya mencoba mencari tahu sekarang tentang penggunaaninitctl
pipa di kehidupan nyata ...Dengan mempelajari kode sumber SysV yang
init
tersedia dari server Savannah Free Software Foundation, saya dapat mengirim permintaan ke RPi sayainit
dengan mengisistruct init_request
rincianinitreq.h
file header. Secara khusus ini membutuhkanmagic
,sleeptime
dan, untuk tujuan saya,cmd
bidang yang diisi, dengan yang terakhir diatur ke salah satuINIT_CMD_POWERFAIL
,INIT_CMD_POWERFAILNOW
atauINIT_CMD_POWEROK
.Daemon / program saya yang perlu dijalankan sebagai pengguna dengan izin untuk menulis ke pipa kontrol init {awalnya di
/dev/initctrl
tetapi pindah di Debian dan dengan demikian Raspbian ke/run/initctrl
} kemudian dapat mengirim strukturinit
yang kemudian ditanggapi dengan tepat dengan menanggapi entri berikut dalam/etc/inittab
:Catatan: antarmuka ini - atau setidaknya pemberitahuan catu daya TIDAK diadopsi oleh yang baru ketinggalan jaman
systemd
- meskipun, oleh apa yang mungkin dianggap sebagai sedikit pemrograman pemujaan kargo, ia mencoba memastikan bahwainitctrl
pipa itu ada. Di sisi lain, ini melakukan persis seperti yang saya inginkan pada sistem RPi saya!sumber
systemd
bahwa daya utama gagal cara ini akan mencatat pesan: "Menerima permintaan UPS / daya initctl. Ini tidak diterapkan dalam systemd. Tingkatkan daemon UPS Anda!"initctl
antarmuka untuk van Smoorenburg init dinyatakan pribadi dan tidak untuk pihak ketiga oleh salah satu (kemudian) pengelola program kembali pada tahun 2012. Miquel van Smoorenburg inipowerd
, kemudian Tom Webstergenpowerd
, awalnya menggunakan/etc/powerstatus
mekanisme.