Artikel ini mungkin agak teknis dan panjang, alasannya karena saya teringat pada satu hal di pondok: bel subuh yang telat. Bukan karena petugasnya malas, tapi karena memang manusia. Kadang alarmnya tidak bunyi, kadang ketiduran, kadang lupa kalau jadwalnya sudah berubah. Saya pernah berpikir, masa iya hal sesederhana ini harus bergantung pada satu orang yang juga butuh tidur. Ketika siswa diniyah saya tanyakan, Kenapa telat? gak ada bel, ustadz. wkwkwk. Bukan gak ada, tapi, gak dipencet aja.
Dari situ saya, kemaren saya kepikiran untuk bikin sistem bel otomatis sendiri. Bukan bel komersial yang jadwalnya terkunci dan susah diubah, tapi sistem yang saya bisa atur sendiri, sesuai ritme pondok kami. Saya pilih Raspberry Pi, Linux, Python, dan baterai cadangan, saya sambungkan ke speaker pondok, dan saya tambahkan tombol untuk mematikannya kalau situasinya tidak memungkinkan.
Pertama, Saya memilih Raspberry Pi karena saya ingin sistem yang bisa saya kontrol penuh. Saya tidak mau bel komersial yang jadwalnya terkunci, yang kalau mau ubah harus bongkar alatnya, atau yang format audionya tidak bisa saya ganti sesuka hati. Dengan Raspberry Pi, saya bisa tentukan sendiri apa yang diputar, kapan diputar, dan bagaimana cara memutarnya.
Saya membayangkan memasang Raspberry Pi 4 Model B dengan RAM 2GB. Menurut saya itu sudah lebih dari cukup. Kalau ternyata saya ingin lebih hemat daya, saya bisa pertimbangkan Raspberry Pi Zero 2 W, tapi saya perlu periksa dulu apakah port-nya cukup dan performanya masih nyaman untuk menjalankan script yang berjalan terus-menerus.
Yang saya suka dari Raspberry Pi adalah GPIO-nya. Saya bisa sambungkan langsung ke relay, tombol, dan LED tanpa perangkat tambahan yang rumit. Saya juga suka karena sistemnya berbasis Linux, jadi saya bisa atur sesuka saya, dan konsumsi dayanya kecil sehingga cocok kalau nanti saya backup dengan baterai.
Saya akan install Raspberry Pi OS Lite, bukan yang ada desktopnya. Alasannya karena saya tidak butuh tampilan grafis. Saya ingin sistem yang booting cepat, yang RAM-nya tidak habis dipakai desktop, dan yang lebih stabil untuk berjalan 24 jam. Semua yang saya butuhkan bisa saya akses lewat SSH dari laptop saya.
Hal pertama yang saya lakukan setelah install adalah mengatur timezone ke Asia/Jakarta. Ini penting karena seluruh jadwal saya bergantung pada waktu lokal. Saya juga akan aktifkan sinkronisasi NTP supaya jam Raspberry Pi selalu akurat, terutama untuk jadwal sholat yang harus tepat waktu.
Tapi ada satu hal yang saya sadari kemudian. Raspberry Pi tidak punya RTC bawaan. Artinya, kalau listrik mati dan WiFi juga mati, jam bisa kacau setelah reboot. Saya tidak mau jadwal subuh saya meleset karena hal ini. Jadi saya akan tambahkan modul RTC DS3231. Harganya murah, tapi kemampuannya menjaga waktu tetap akurat meski tanpa internet sangat berharga untuk sistem seperti ini.
Kemudian, saya akan buat script Python yang bertugas membaca jadwal, membandingkan waktu sekarang, dan memutar audio atau mengaktifkan relay ketika waktunya tiba. Saya tidak mau jadwalnya ditanam di dalam kode, karena kalau ada perubahan, saya harus edit script dan restart ulang. Saya lebih suka jadwalnya saya simpan di file terpisah, dalam format JSON, supaya pengurus lain bisa ikut mengedit tanpa harus paham Python. Begitu juga folder lain untuk script, ada file jadwal, ada folder audio, ada folder log. Ketika saya mau menambah file adzan baru atau mengubah jadwal, saya cukup taruh file di tempat yang sudah jelas, tanpa harus bongkar kode.
Saya ingin script ini jalan otomatis sejak Raspberry Pi menyala. Saya tidak mau pakai cron, karena cron tidak bisa restart otomatis kalau script-nya crash. Saya akan pakai systemd service. Dengan systemd, kalau script saya mati karena error, dia akan otomatis dinyalakan lagi. Saya juga bisa atur supaya script baru jalan setelah jaringan dan perangkat audio siap. Kemudian baterai cadangan, ini bagian yang awalnya saya anggap sepele, tapi ternyata paling rawan. Saya sempat berpikir cukup pakai powerbank biasa. Ternyata tidak sesederhana itu.
Powerbank biasa hampir selalu bermasalah karena punya fitur auto cut-off. Ketika arus yang ditarik terlalu kecil, powerbank akan memutus aliran listrik karena mengira perangkat sudah penuh. Raspberry Pi saat idle hanya menarik sekitar 500mA, dan banyak powerbank memutus aliran di bawah 100mA. Akibatnya, Raspberry Pi saya bisa mati mendadak tanpa peringatan.
Saya sadar ini bukan sekadar masalah kenyamanan. Kalau Raspberry Pi mati mendadak, kartu SD-nya bisa korup. Ini penyebab kerusakan paling umum pada sistem berbasis Raspberry Pi yang berjalan 24 jam. Saya tidak mau sistem yang sudah saya bangun susah payah harus saya flash ulang karena mati mendadak.
Jadi saya memutuskan akan pakai UPS HAT khusus Raspberry Pi, seperti Waveshare UPS HAT atau Geekworm X728. Perangkat ini bukan cuma menyediakan baterai cadangan, tapi juga bisa berkomunikasi dengan Raspberry Pi lewat I2C. Artinya, script Python saya bisa tahu kapan listrik PLN mati, lalu menjalankan shutdown yang rapi sebelum baterai habis. Saya juga akan aktifkan hardware watchdog supaya sistem otomatis restart kalau script utama hang. Saya membayangkan ada dua cara yang bisa saya pakai, dan saya mungkin akan kombinasikan keduanya.
Cara pertama adalah memakai relay untuk mengontrol bel listrik 220V. Saya tidak bisa sambungkan GPIO Raspberry Pi langsung ke bel listrik, karena tegangannya cuma 3.3V. Saya perlu modul relay dengan optocoupler sebagai perantara. Relay ini berfungsi seperti saklar otomatis yang menyalakan bel listrik sesuai jadwal.
Cara kedua adalah memanfaatkan output audio Raspberry Pi untuk masuk ke amplifier TOA yang sudah terpasang di pondok. Saya pikir cara ini lebih fleksibel, karena saya bisa putar adzan, murottal, suara bel, dan pengumuman dalam berbagai bahasa. Saya cukup sambungkan jack audio 3.5mm Raspberry Pi ke input AUX amplifier, dan atur volume lewat mixer atau amplifier.
Yang saya sadari perlu hati-hati adalah isolasi ground. Kalau amplifier pakai listrik 220V dan Raspberry Pi pakai adaptor terpisah, saya harus pastikan tidak ada ground loop yang bisa merusak perangkat. Saya akan pakai relay optocoupler dan kabel audio berkualitas supaya noise-nya minimal. Saya ingin reminder ini aktif selama satu menit, tapi bisa saya matikan dengan tombol fisik. Ini penting, karena ada situasi di mana suara bel justru mengganggu, misalnya saat ada acara khusus atau ujian. Saya tidak mau sistem yang jalan sendiri tanpa bisa saya kendalikan.
Caranya, saya akan sambungkan tombol momentary push button ke GPIO dan ground. Ketika reminder mulai berbunyi, script akan memutar audio berulang selama satu menit. Kalau tombol saya tekan, script langsung menghentikan putaran audio. Saya juga akan tambahkan LED indikator supaya saya tahu kapan reminder sedang aktif, dan mati ketika tombol ditekan.
Saya belajar bahwa tombol fisik sering memicu sinyal ganda karena pantulan mekanis. Jadi saya akan setel bounce time sekitar 0.3 detik supaya tombol hanya terbaca sekali per tekanan.
Saya juga akan simpan status setiap jadwal supaya tidak dijalankan dua kali dalam satu hari. Flag ini akan saya reset otomatis setiap tengah malam. Tanpa mekanisme ini, jadwal yang sama bisa terpicu berkali-kali kalau script restart di tengah hari.
Ada beberapa fitur yang meski tidak wajib, menurut saya sangat membantu. Pertama, logging. Saya ingin catat setiap reminder yang berjalan dan setiap tombol yang ditekan. Log ini berguna untuk audit dan troubleshooting ketika ada jadwal yang tidak berbunyi.
Kedua, web UI sederhana berbasis Flask. Dengan ini, pengurus bisa mengedit jadwal langsung dari HP tanpa perlu SSH ke Raspberry Pi. Saya bayangkan ini sangat berguna ketika ada perubahan jadwal dadakan, misalnya libur santri atau kegiatan khusus.
Ketiga, backup image SD card. Setelah sistem selesai saya konfigurasi dan berjalan stabil, saya akan buat image dari SD card dan simpan di komputer. Kalau suatu saat SD card korup, saya cukup flash ulang image tersebut dan sistem langsung kembali normal.
Keempat, format audio yang tepat. Saya akan pakai MP3 128kbps atau WAV untuk kualitas yang baik, dan install pemutar audio ringan seperti mpg123 atau sox supaya konsumsi resource tetap rendah.
Ini hanya blueprint dari bel pondok otomatis, dimana pengurus bisa dibangunkan oleh sebuah sistem dan kegiatan tetap lancar jaya.

