raspberry pi

Awalnya mau gantiin cctv yg sebelumnya pake webcam nyolok di notebook, baca2 sekilas (gak detil) tentang Raspberry Pi + camera module, dan mutusin untuk upgrade cctv di rumah pake raspberry pi. Pas dapet hibahan langsung nyoba2, ternyata gak semudah di notebook biasa, dan waktu nyoba ambil foto pake ‘raspistill’ kok lambat banget, agak susah deh kalo begini.

Pas nyari2 info masang motion di raspberry pi kok jadi repot (padahal yg saya baca itu artikel lama) dan nemu katanya biar bisa live streaming yg cepat (kalo pake yg raspivid delaynya agak lama) pake RPi Cam Web Interface yang ternyata waktu installnya masang Apache2, PHP 7 dan Motion (untuk webserver dan php kalo gak salah ada pilihannya mau yg mana yg diinstall).

Sesudah itu saya pake Web Interfacenya untuk ngontrol. Dari situ saya bisa liat live stream dari kameranya dan ada beberapa aksi yang bisa saya lakukan: rekam video, still image, timelapse, motion detection dan stop camera. Karena terbiasa pake motion dengan motion detectionnya, saya langsung aja tes dan ternyata hasilnya agak mengecewakan karena kalo saya liat motion detectionnya kurang responsif, begitu saya ubek2 ternyata ada parameter frame rate untuk motion detection cuma 2 fps, yg anehnya kalo saya ganti dan simpan selalu gak kesimpen. Efek sampingnya adalah motion detection yang kurang sensitif jadi ngerekamnya gak dari awal gerakan. Fungsi timelapse nya juga agak jelek, gak bisa yg lumayan bagus gitu hasilnya.

Selain itu efeknya adalah suhu raspberry pi jadi naik diatas 80 derajat celcius, kadang2 kalo udah kepanasan gitu kameranya jadi agak ngaco, harus saya restart service kamera plus apache juga harus direstart. Yg bikin suhu tinggi sebenernya bukan kameranya, tapi karena raspberrynya juga dipake untuk nonton video lewat browser.

Saya coba2 ganti2 konfigurasi, hasilnya malah gak bisa jalanin aksi apapun dari web interfacenya, timelapse dan motion detection gak bisa jalan. Saya coba mau langsung akses ke kamera pake ffmpeg selalu gak bisa akses ke /dev/video0, begitu saya baca2 dan liat2 di raspberrynya ternyata itu device udah dipake sama service yg namanya raspimjpeg.

Terus di paket program RPi-Cam-Web-Interface ada file php yg namanya “cam_pic.php” yang kalo dibuka di browser isinya file jpg kamera terakhir (kalo di refresh gambarnya berubah), begitu saya liat, isinya ternyata sederhana sekali, intinya cuma 1 baris perintah: readfile("/dev/shm/mjpeg/cam.jpg").

Jadi saya kira service raspimjpeg itu menyiapkan still image di /dev/shm/mjpeg/cam.jpg yang diupdate pada rentang waktu tertentu. Nah, berbekal asumsi itu saya bikin aja bash script untuk copy file itu dengan jeda 0.3 detik (10 frame dalam 3 detik) dan disimpen dengan nama baru + sequence (nomor urut framenya). Sesudah itu (saya set tiap 1000 frame) baru eksekusi ffmpeg untuk bikin video timelapse dengan fps=15, jadi hasilnya kaya film Charlie Chaplin yg orangnya bergerak cepet banget.

Biar timelapsenya nyambung terus saya pisahkan script untuk bikin video mp4nya. Sesudah itu, biar storagenya gak cepet abis, saya upload deh mp4nya ke Mega.co.nz. Kenapa Mega? Karena si Mega.co.nz ini punya program untuk upload file ke storagenya dan programnya bisa dijalankan lewat scripting. Kurang lebih begini alurnya:

Script Copy JPG

  • LOOP START
  • Ambil tanggal dan jam saat ini
  • Bikin folder berdasarkan tgl dan jam
  • Copy file jpg dari /dev/shm/mjpeg/cam.jpg ke folder di atas sekalian ganti namanya dengan sequence.
  • Lakukan copy file 1000x dengan jeda 0.3 detik per copy file
  • Jalankan script untuk bikin mp4
  • Script ini tidak menunggu proses buat mp4 selesai, langsung kembali ke awal (LOOP START)

Script Bikin MP4

  • Jalankan ffmpeg untuk membuat video mp4
  • Hapus folder yang berisi frame
  • Jalankan script untuk mengupload video hasilnya

Script Upload

  • Upload 1 file ke sebuah folder di cloud

Udah gitu doang. Tapi hasilnya lumayan.

Update (4 April 2020):

Sebenernya scriptnya udah lama diganti, tapi males update blog. Jadi baru sekarang updatenya. Saya penasaran apa itu /dev/shm yang ternyata begitu di-google langsung ketahuan: ram disk. Jadi itu bagian dari RAM yang bisa diakses seperti storage. Akhirnya saya juga pake itu /dev/shm untuk nyimpen frame dan video yang dibuat, karena sesudah dibuat video data framenya dihapus dan sesudah diunggah data videonya dihapus jadi bisa rolling gak penuh2.

Kebayang kan kalo pake sdcard yang dibatesin frekuensi tulisnya nulis ratusan ribu file per hari, bisa cepet kadaluarsa itu sdcard.

Btw, scriptnya gak saya ganti, silakan ganti sendiri, gampang kok, tinggal tambahin path /dev/shm/apa-gitu didepan semua path untuk nyimpen file dan videonya.

#!/bin/bash
LOGF=/home/pi/.timelapse.log
END=1000
while true; do
    FIL="TL.$(date +%Y.%m.%d-%H.%M.%S)"
    echo "$(date +%Y.%m.%d-%H.%M.%S) Capturing $FIL" >> $LOGF 2>&1
    mkdir $FIL
    cd $FIL
    for i in $(seq -w 1 $END); do
        cp /dev/shm/mjpeg/cam.jpg "./${FIL}.${i}.jpg" 2>/dev/null
        if [ $? -ne 0 ]; then
            echo "$(date +%Y.%m.%d-%H.%M.%S) Retrying copy cam.jpg #${i}" >> $LOGF 2>&1
            cp /dev/shm/mjpeg/cam.jpg "./${FIL}.${i}.jpg"
        fi
        sleep .3
    done
    cd ..
    ./lt.sh $FIL &
done
cd ..

#!/bin/bash
LOGF=/home/pi/.timelapse.log
echo "$(date +%Y.%m.%d-%H.%M.%S) Merging $1" >> $LOGF 2>&1
ffmpeg -hide_banner -loglevel panic -nostats -r 15 -i $1/$1.%04d.jpg -c:v libx264 -vf fps=25 -pix_fmt yuv420p CAM-$1.mp4
rm -rf $1
echo "$(date +%Y.%m.%d-%H.%M.%S) Done Merging $1" >> $LOGF 2>&1
./mega.sh $1
#!/bin/bash
LOGF=/home/pi/.timelapse.log
echo "$(date +%Y.%m.%d-%H.%M.%S) Uploading $1" >> $LOGF 2>&1
mega-put CAM-$1.mp4 /motion/ >/dev/null 2>&1
rm CAM-$1.mp4
echo "$(date +%Y.%m.%d-%H.%M.%S) Success Uploading $1" >> $LOGF 2>&1

Note: script di atas kalo ada tulisan &amp itu sebenernya cuma karaketer “&”, keubah otomatis jadi kode htmlnya.

Dapet hibahan Raspberry Pi 4 Model B Ram 2GB. Karena istri mau nonton youtube “layar lebar”, akhirnya dicolokin ke TV, padahal niatnya untuk CCTV. Dan tv 24″ saya jadi smart tv deh 🙂 Rencananya nanti mau dibeliin IR receiver + Remote, atau mungkin lebih enak pake wireless keyboard+mouse yg kecil yah? Maklum, jiwa programmer, jadi maunya bikin program utk receiver remote biar bisa gerakin kursor mouse. Dan untuk keyboardnya rencananya mau pake cara sms jaman dulu, pake keypad angka 0-9.

Belum punya casingnya, jadi ditaro di kardus.

Tapi dari sisi software, udah ada beberapa tambahan:

  • Apache2
  • MySQL Server
  • Motion (untuk motion capture cctv)
  • NodeJS (upgrade versi 13)
  • TIddlyWiki (versi nodejs)
  • Fossil (utk hosting version control)
  • ICEcoder (self-hosted web based text editor)
  • PhpMyAdmin
  • TOR (biar bisa diakses dari luar).

Service yg di-open cuma SSH. Jadi saya ssh lewat TOR, abis itu daftarin client2server port forwarding untuk VNC, TIddlyWiki, Fossil, MySQL, Web (motion + icecoder + dll).

Awalnya mau self-hosting file2 program web yg saya buat, karena kalo tiap edit harus download, edit, lalu upload saya rasa agak ribet saya mau langsung edit remotely aja. Saya belum familiar pake VIM (yg udah terinstall), dan saya rasa nano terlalu “plain” untuk editor source-code. Mau masang slap (teks editor di terminal yg mirip sublime text) ternyata error terus, katanya cuma bisa masang kalo downgrade nodejs ke versi 6.

Akhirnya karena sudah mentok sana-sini saya pasang aja ICEcoder, web based text editor yg lumayan bagus, apalagi saya cuma mau edit file javascript atau php aja. Dan karena saya aksesnya lewat port forwarding ssh + tor jadi dijamin aman. Udah gitu ssh saya set cuma bisa masuk pake public+private key.

Sebenernya saya mau masang sync folder ke cloud storage, tapi belum dpt yg enak utk Raspbian, biar file-file fossil bisa backup otomatis.

Kaya’nya saya harus punya server nih, soalnya kalo mau make Raspberry Pi untuk server tuh gimana gitu.. Saya seneng pake Raspberry Pi cuma karena bentuknya bener2 compact, bisa ditaro dimana aja, kalo server beneran kan menyita ruang yg sudah sangat sempit, apalagi saya punya banyak kucing (baca: 23 ekor) jadi kalo ada benda2 yg gede dikit, pasti didudukin. Dan Raspberry Pi yg bisa digantung di dinding jadi solusi alternatif, toh file2 yang mau saya simpen di “server” saya cuma source-code yang tidak memakan banyak storage.

Beli servernya nanti aja, kalo udah punya ruangan sendiri untuk server. Udah ah.