Transcoding H264 to H265 / HEVC using Google Compute Engine with 24 CPU cores

Have you ever want to try the ludicrous power of 24 CPU cores? I sure have! In this post, I am experimenting with Google cloud engine to transcode H264 files to H265.

I have a lot of 1080p H264 movies. This takes too much space. A 30 minutes movies took almost 1GB of storage. However, I found out that we can save more than 70% of the space with the same quality by converting those file to H265. Good news right? Yeah right, The hard pill is that we are trading space for computing complexity. On my laptop, with Intel core I7 6500U with 2 cores, 4 thread and 8 gigabytes of memory, It takes twice the time of the movies to encode. For example, in 1-hour long movie, it will take 2 hours to encode one file. I have 24, 30 minutes long files that I want to convert. That means it will take one day to convert everything!

Surely there is a better solution, right? For example by leveraging GPU capabilities. I got 2x speed up by using Intel encoding solution, Intel QuickSync. The problem is, GPU based encoding tends to produce lower quality images and bigger file size. When I tried to encode a 1 GB file, I got an 80MB file from CPU encoding and 300MB from Intel QuickSync. All in similar preset. 220MB might be not much, but if we have a lot of files, that will pile up quickly. Another option might be to buy GPU with the newer, better, faster chipset. I am stingy though, I can’t justify the money to buy a new GPU.

Fortunately, I heard that Google gives us free credit (300 Euro) for testing their service. Therefore, why don’t we use google cloud engine for doing the encoding? After all, we can select a virtual machine with a powerful CPU. For most people, their internet upload speed might make this solution already impractical even before we test it. Regardless, I am just curious whether Google Cloud Engine can give me good speed encoding H264 file to H265.

Experiment Setup

First, let’s decide which type of virtual machine that we can choose in Google Cloud Engine. You can view it through here https://cloud.google.com/compute/docs/machine-types. I choose to use the high CPU machine type to perform the experiment because H265 encoding is CPU-bounded process. I opt for the spot instance https://medium.com/google-cloud/google-clouds-spot-instances-win-big-and-you-should-too-5b244ca3facf because it’s cheaper than the on-demand instance and suitable for batch processing such as this one. The machine region is Europe-west4-a I perform the experiment using various core size. The table below shows the exact machine configuration that I use for encoding:

Core SizeMemory Size
43.6 GB
87.2 GB
1614.4 GB
2421.3 GB

You might ask, this might not be a valid test because I use different memory size. However, if you increase the core size, the number of minimum memory size that you can pick is also increasing.

I use FFMPEG version 4.0.2 to encode the file is 30 minutes long, with the following settings:

ffmpeg -i input.mkv -c:v libx265 -q:v 22 -c:a libopus output.mkv

The option -c:v is used to select the video codec. In this case, we choose the x265 library provided by FFMPEG. the -q:v is used to select the target video quality. Lower value means higher video quality at the expense of increased space requirements. The recommended value for this is actually 28. I choose 22 because using the value 28 gives me unpleasant artifact.

The option -c: a is used to select the audio codec. Libopus is an audio encoding engine for the OPUS codec. Opus is a high-performance format for audio, which has a better sound quality and lower bitrate requirements than MP3, OGG or AAC. For your information, MP3 typically need 320kb/s to produce CD-like quality, while with Opus, you can achieve the same result with only 96kb/s.

The Result

From the graph, we can see that only when the CPU core is more than 24 we get faster than real-time decoding. the biggest jump in performance is when we increase the core number from 4 to 8 CPU cores. At 4 cores, the encoding speed is actually two times slower than my laptop with 2 core CPU. This is interesting because Google Compute Engine uses a much faster Intel Xeon Skylake processor on its base machine. This suggests the “CPU Core” performance is not the same as the “base CPU core”. Probably this is because the base machine is shared with other tenants.

The rest of the performance jump is not as significant as when we switch from 4 CPU core to 8 CPU cores. Switching from 8 CPU cores to 16 CPU cores only improve approximately 0.33 times. Further increasing the number of CPU from 16 to 24 only improve 0.25 times. This could be caused by the encoder cannot take more benefit from more CPU core due to the algorithm design. The following pictures show that when we enable 24 CPU cores, The CPU Cores load was lower than 16 CPU cores machine. Starting from 16 CPU Cores, the CPU is not used 100%.

24 Core Machine
16 Cores Machine
8 Cores Machine

Conclusion

The High-CPU Google Compute engine can be used to perform accelerate transcoding task. However, this is only true when we use more than 8 CPU cores. Lower than that then it might be better just to use your own computer if you just striving for encoding speed. The price for a machine with more than 8 CPU cores is prohibitively expensive, not including the time and money necessary to transfer your file to the Google Cloud Engine. In conclusion? It is impractical. Don’t do it.

You should note that in this experiment, I used the same FFMPEG parameters for every machine. A more optimized parameter for multi-core transcoding might exist. Your miles might vary.


https://www.gilangcp.com/tutorial-encode-video-menjadi-h264-dengan-ffmpeg

5 Webapp Gratis Untuk Manajemen Proyek

Pernahkah kamu bingung saat melakukan sebuah proyek,bagaimana caranya mengatur merencanakan dan menyimpan catatan tugas-tugas yang kamu dan timmu akan lakukan?

Lima webapps gratis dibawah ini akan membantu kamu melakukan tugas tersebut

1. Zoho Project

Harga : Gratis untuk 1 proyek, mulai dari 417.564 rupiah per bulan untuk fitur opsional
Fitur : 5/5
User Interface : 4/5

Secara pribadi, software ini adalah favorit saya. Fitur-fiturnya lengkap dan fleksibel! Dari mulai perencanaan harian menggunakan metode Kanban hingga perencanaan jangka panjang dengan dependensi tugas yang rumit menggunakan gantt chart. Tugas dapat dikatagorikan menggunakan apa yang mereka sebut sebagai task list, dan milestone. Milestone dapat digunakan untuk mengukur seberapa dekat kamu dengan selesainya proyek.

Tidak hanya itu, fitur kolaborasinya pun sangat mumpuni. Kamu bisa menambahkan rekan kerja atau teman kamu kedalam proyek, lalu menugaskan mereka ke salah satu tugas yang telah kamu buat. Tim kamu lalu dapat membuat komentar dan update status tugas tersebut. Tidak hanya itu, integrasi dengan kalendarnya sangat baik. Kamu bisa melakukan sinkronisasi kalendar pribadimu dengan tools ini. Apa yang dikerjakan tim kamu lalu bisa dilihat dalam bentuk statistik.

User interface webapp ini menurut saya cukup intuitif dan modern. walau terkadang, karena banyaknya fitur, sedikit sulit untuk melakukan navigasi ke fitur yang kita inginkan. Satu hal yang saya kurang suka juga, Kanban tidak di filter berdasarkan milestone. Kita harus melakukan filter untuk melihat tugas-tugas dalam satu milestone.

Kekurangan lain adalah harga. Walaupun seluruh fiturnya gratis, tapi hanya untuk 1 proyek saja. Kamu harus membayar sekitar 420.000 rupiah per bulan untuk proyek lainnya. Bayangkan kamu harus mengerjakan beberapa proyek dalam satu waktu.

Kesimpulannya, kalau kamu hanya butuh untuk satu proyek saja, Zoho Project adalah pilihan yang menurut saya paling oke. Fiturnya lengkap dan user interfacenya intuitif.

2. Taiga.io

Harga: gratis untuk 1 proyek, 85.000 rupiah perbulan
Fitur : 3/5
User interface: 5/5

Kalau kamu senang dengan metodologi agile / scrum, maka kamu akan jatuh cinta pada web app ini. Seluruh artifak scrum seperti backlog, epic, user stories bisa kamu masukan dan kelola dalam aplikasi ini.

Tampilan aplikasinya sangat menarik dan minimalis, sehingga memudahkan pengguna baru dalam menggunakan web app ini.  Harganya yang masuk akal juga bisa menjadi salah satu pertimbangan dalam menggunakan webapp ini apabila kamu butuh lebih dari 1 proyek.

Sayangnya, taiga.io ditujukan kepada pengguna metodologi agile, sehingga hanya memuat fitur-fitur yang berguna dalam methodologi tersebut. Contohnya adalah tidak adanya gantt chart dan perencanaan waktu terhadap tugas. Hal ini terjadi karena dalam methodologi agile, tim didorong untuk mengambil tugas yang ada tanpa di tuntut deadline. Tugas selesai ketika tugas selesai.

Kesimpulanya, Taiga.io cocok untuk kamu yang menggunakan metodologi agile.

3. Odoo

Harga: Gratis, 270.000 rupiah perbulan untuk fitur tambahan.
Fitur: 4/5
User Interface: 4/5

Hebatnya Odoo adalah dia open source. Jadi kalau kamu punya server sendiri, kamu bisa coba install di server kamu secara gratis.

Fitur yang dimiliki webapp ini cukup lengkap. Kamu bisa melakukan perencanaan, menggunakan kanban untuk melihat tugas dan lain sebagainya. Sayangnya, user interfacenya sedikit kuno, sehingga sedikit sulit untuk memasukan tugas. Kelemahan lainya adalah tidak adanya fitur milestone, sehinga menyulitkan kamu untuk membagi tugas.

Kesimpulan: Gunakan Odoo kalau kamu punya server sendiri dan tidak menggunakan milestone.

4. OpenProject

Harga : Gratis apabila host sendiri, Opensource. 5euro, minimum 25 orang.
Fitur : 5/5
User Interface : 5/5

OpenProject adalah salah satu webb app yang terlengkap. seluruh fitur yang kamu mau ada di sini, gratis pula! sayangnya kamu harus host sendiri aplikasi ini.

5. Trello

Harga: Gratis, berbayar untuk fitr tambahan
Fitur: 2/5
User Interface: 5/5

Sebenarnya trello bukan untuk melakukan manajemen proyek, tetapi kalau kamu cuma butuh papan kanban yang bisa kolaborasi, trello bisa menjadi pilihan. Sayangya, untuk bisa menggunakan fitur penting seperti menetapkan deadline ke tugas kamu harus membayar

Yak, itu adalah 5 webapp gratis untuk melakukan manajemen proyek. Semoga berguna!

Tutorial encode video menjadi h264 dengan FFmpeg

FFmpeg adalah program yang bertujuan untuk mengubah format video. Kelebihan FFmpeg selain dukungan format nya yang sangat luas, program ini juga mendukung proses encode dengan akselerasi hardware, membuat proses perubahan format video lebih cepat.  Sayangnya, program ini tidak memiliki GUI resmi, (Walaupun yang tidak resmi bisa di download disini: http://winff.org) dan memiliki banyak sekali opsi.

Tulisan ini akan membantu anda mengubah format video lewat CLI:

  1. Download versi terakhir disini: http://ffmpeg.zeranoe.com/builds/
  2. Extract zip ke desktop
  3. Buka command prompt
  4. Ketik
     cd Desktop/ffmpeg/bin

    (Sesuaikan ‘ffmpeg ‘ dengan nama folder hasil extract)

  5. Ketik :
    ffmpeg -h

    lalu klik enter. Apabila hasil output seperti dibawah, maka anda siap menggunakan program ini. Apabila belum ,coba cek nama folder terextract.

  6. Ketik
    ffmpeg -i 
    

    lalu klik spasi dan drag video yang mau di ubah formatnya

  7. Pilih format output audio dan video
    -c:v h264_qsv -c:a aac
    

    -c:v berarti codec:video , -c:a berarti codec audio. h264_qsv adalah codec h264 dengan akselerasi Intel QSV. Tidak semua prosesor mendukung QSV! kamu bisa melihat apakah computer kamu mendukung akselerasi hardware disini: http://ark.intel.com/. Apabila kamu memiliki GPU NVidia, kamu bisa mencoba ubah codec videonya menjadi h264_nvenc. Apabila computer kamu tidak mendukung akselerasi sama sekali, atau kamu membutuhkan kualitas gambar terbaik, kamu bisa gunakan libx264. Kamu juga bias memilih codec lain. daftar codec yang bisa dipilih bisa dilihat disini: https://www.ffmpeg.org/ffmpeg-codecs.html#Video-Encoders . AAC adalah format audio yang popular, dan memiliki kualitas suara lebih baik dari MP3.Daftar codec audio bisa dilihat disini: https://www.ffmpeg.org/ffmpeg-codecs.html#Audio-Encoders

  8. Set kualitas video yang diinginkan,
    -profile:v high -preset:v medium

    Setting ini sudah cukup baik sehingga anda tidak bisa membedakan video sebelum di encode dan setelah di encode. Silahkan lihat daftar setting kualitas video disini : https://trac.ffmpeg.org/wiki/Encode/H.264

  9. Set lokasi output.
    output.mp4

    Selain mp4, kamu bisa juga menggunakan .mkv maupun . webm

  10. Klik enter untuk memulai encoding.
    ffmpeg -i source.avi -c:v h264_qsv -c:a aac -profile:v high -preset:v medium output.mp4

    Selamat, kamu berhasil mengubah format video menggunakan FFmpeg!

Tutorial Database MySQL dengan PHP (Bagian 2)

Kali ini saya mau menjelaskan bagaimana caranya melakukan select data dari database lalu menampilkan hasilnya menjadi table menggunakan PHP. Sebelum menjalankan tutorial ini, ada baiknya anda melakukan tutorial bagian 1 (https://www.gilangcp.com/2017/02/09/tutorial-mysql-dengan-php-bagian-1/). Hal ini perlu dilakukan karena disitu dijelaskan cara membuat database dan mengisi data contoh yang akan digunakan di tutorial ini.

Selamat mencoba!

1. Buka kembali file tutorial.php yang anda buat di tutorial sebelumnya

2. Ketik baris kode dibawah setelah  “?>” pada line 25.

<?php 
//Persiapkan query yang ingin dilakukan
$sql = "SELECT Nama FROM table_test";

//Lakukan request ke server MySQL Tampung hasilnya di variabel $result
$result = $conn->query($sql);
?>

Baris code ini di gunakan untuk melakukan query ke database.

SELECT Nama FROM table_test

adalah perintah SQL yang dijalankan. Kamu bisa ubah ini menjadi query yang kamu mau.

3. Saatnya untuk menampilkan data menjadi tabel! ketik baris dibawah ini setelah “?>” yang terakhir:

<table>

  <!-- Digunakan untuk menampilkan judul kolom-->
  <!-- tr digunakan untuk merepresentasikan 1 baris-->
  <!-- td digunakan untuk merepresentasikan kolom-->
  <tr>
    <td>Nama</td> <!-- Kita hanya memiliki 1 kolom yang ingin ditampilkan -->
  </tr>

  <!-- Iterasi tiap baris data yang di ambil dari database menjadi baris di database-->
  <?php while($row = $result->fetch_assoc()):?>

    <tr> 
      <!-- tanda <?= digunakan untuk print variable php-->
      <!-- Kita mau print kolom "Nama" dari database-->
      <td><?=$row["Nama"]?></td> 
    </tr>
  <?php endwhile;?>
</table>

 

4. Tutup koneksi MySQL

<?php $conn->close()?>

5. Test hasilnya dengan mengetik http://localhost/tutorial.php

Apabila keluar hasil seperti diatas, maka selamat! anda telah berhasil melakukan query select di PHP dengan database MySQL! apabila belum, coba cek kode lengkapnya disini:
https://gist.github.com/gilangcp/032c275c7b6cd59233396b25bc1ca604

Link bacaan lanjutan:

http://www.tutorialrepublic.com/php-tutorial/php-mysql-select-query.php
http://codular.com/php-mysqli
https://www.binpress.com/tutorial/using-php-with-mysql-the-right-way/17
http://www.phptuts.nl/view/26/

Nantikan tutorial ketiga, mengenai Insert data ke dalam database!

 

 

 

Tutorial Database MySQL dengan PHP (Bagian 1)

PHP adalah salah satu bahasa pemrograman web yang paling umum di internet. Hampir semua hosting mendukung PHP. Tetapi, bagaimana cara mengintegrasikannya dengan MySQL, Sebuah server database yang sama populernya dengan PHP? Seri tutorial ini akan membantu anda melakukan hal tersebut.

Tutorial ini akan dibagi menjadi 3 bagian. Bagian pertama (tutorial ini) berisi bagaimana caranya membuat database sederhana menggunakan phpMyAdmin, lalu membuat objek PHP yang merepresentasikan koneksi Mysql. Bagian Kedua akan berfokus pada view data yang ada di MySQL menggunakan PHP, sedangkan bagian ketiga akan membahas bagaimana caranya melakukan edit dan delete data.

Selamat menikmati tutorialnya!

Membuat Database menggunakan phpMyAdmin :

1.Klik New pada phpMyAdmin, Saya contohkan dengan membuat database dengan nama ‘Test”, isi name dengan “Test”, lalu klik tombol create.

2. Buat table pada database tersebut dengan nama test_table dan 2 kolom:

3. Berikan nama “Id” Pada baris pertama, klik CheckBox A_I (Auto Increment), berikan nama “Nama” pada baris kedua, Ubah type menjadi varchar, ubah length menjadi 255.

4. Tambahkan data baru dengan cara klik table tersebut lalu klik tab SQL, dan masukan perintah SQL dibawah lalu klik tombol Go:

INSERT INTO `table_test`(`Nama`) VALUES ("Mega Kusuma");
INSERT INTO `table_test`(`Nama`) VALUES ("Putu Sri");
INSERT INTO `table_test`(`Nama`) VALUES ("Sinta Mawar");
INSERT INTO `table_test`(`Nama`) VALUES ("Eko Utari");
INSERT INTO `table_test`(`Nama`) VALUES ("Batario Nirmala");
INSERT INTO `table_test`(`Nama`) VALUES ("Melati Cahyo");
INSERT INTO `table_test`(`Nama`) VALUES ("Tirta Cahya");

Selamat! anda telah berhasil membuat database sederhana dengan phpMyAdmin!

 

Koneksikan MySQL tersebut dengan PHP:

1.  Buat file php baru pada folder htdocs anda, saya menggunakan nama tutorial.php

2. Ketik baris berikut pada file yang baru anda buat

<?php

// gunakan localhost apabila MySQL terletak di komputer yang sama
$namaserver = "localhost"; 
$username = "username"; //ini adalah username MySQL anda
$password = "password"; //ini adalah password MySQL anda

//ini adalah nama database yang anda buat pada step sebelumbya.
//Dalam hal ini maka nama databasenya adalah Test
$namadatabase = "test";

// Memulai Koneksi
$conn = new mysqli($namaserver, $username, $password);

// Cek apakah koneksi ke mysql berhasil
if ($conn->connect_error) {
 die("Koneksi gagal: " . $conn->connect_error);
} 

//Cek apakah bisa terkoneksi dengan database
$selected = mysqli_select_db($conn,$namadatabase) 
 or die("Database tidak ditemukan");

echo "Koneksi sukses";
?>

3. Buka tutorial.php pada browser. Pada komputer saya, http://127.0.0.1/tutorial.php. Apabila terprint tulisan “Koneksi sukses”, maka selamat, anda sudah berhasil mengkoneksikan MySql dengan aplikasi PHP anda!

Berikut adalah bahan bacaan lebih lanjut mengenai topik ini:

https://www.siteground.com/tutorials/php-mysql/database_connection.htm
http://webcheatsheet.com/php/connect_mysql_database.php
https://www.tutorialspoint.com/mysql/mysql-connection.htm
http://www.w3schools.com/php/php_mysql_connect.asp
https://coolestguidesontheplanet.com/how-to-connect-to-a-mysql-database-with-php/

Bagian 2 akan membahas bagaimana melakukan query data menggunakan koneksi yang dibahas pada tutorial ini. Nantikan!

Update: baca bagian ke-2 disini : https://www.gilangcp.com/2017/02/17/tutorial-database-mysql-select/

Instalasi bahasa pemrograman scala, Windows 10

Scala adalah sebuah bahasa pemrograman yang menganut paham pemrograman fungsional. Bahasa ini berjalan pada Java Virtual Machine, sehingga bisa dengan mudah menggunakan library – library yang tersedia pada bahasa pemrograman Java. Artikel ini berisi tutorial bagaimana melakukan instalasi dan menjalankan program scala pada windows 10.

Bahasa pemrograman ini umumnya digunakan untuk menganalisa Big Data, Cluster Computing, dan tugas-tugas lainnya yang berhubungan dengan Concurrency dan Distributed Computing.

Tutorial ini akan menjelaskan bagaimana caranya menginstall Bahasa pemrograman Scala pada komputer dengan sistem operasi Windows 10.

Selamat mencoba!

1. Pastikan anda terkoneksi dengan internet.
2.Buka Command Prompt dari start menu, dengan mengetik cmd, lalu klik kanan dan  run as administrator

capture

3. ketik cmd lalu tekan tombol enter

capture

4. Install Chocolatey, Chocolatey adalah manajer aplikasi untuk windows. Copy dan paste baris kode dibawah ke command prompt, lalu klik enter

@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

capture

5. Pastikan Choco sudah terinstall dengan benar dengan cara mengetik

choco --version

Pada Command Prompt. Apabila sudah seperti screenshot dibawah, maka anda sudah berhasil menginstall Choco.

capture

6. Install Scala dengan mengetik:

choco install scala

7. Anda akan ditanyakan beberapa kali apakah ingin melanjutkan menginstall. Ketik y dan tekan tombol enter.

capture

8. Test Apakah scala sudah terinstall dengan benar dengan mengetik scala, lalu menekan tombol enter. Apabila terjadi kesalahan “not recognized as an internal or external command”, coba tutup command prompt lalu buka kembali.

capture

10. Apabila sudah seperti screenshot diatas, Maka selamat! anda sudah berhasil melakukan instalasi Scala pada komputer anda.

Selanjutnya anda bisa membaca dokumentasi dan tutorial lain mengenai topik ini menggunakan link dibawah:

https://www.scala-lang.org/documentation/
https://www.tutorialspoint.com/scala/
https://twitter.github.io/scala_school/

Selamat mencoba!

Server MQTT, Instalasi dan contoh penggunaan untuk IOT

MQTT

Lanjutan dari artikel sebelumnya, tulisan ini berisi cara instalasi dan contoh sederhana penggunaan server MQTT.

Sebelum melanjutkan, anda sudah harus memiliki server dengan sistem operasi linux. Apabila anda belum punya, anda bisa coba dengan virtualbox. Sistem operasi yang saya gunakan adalah Ubuntu 16.04 yang bisa di unduh disini: http://www.ubuntu.com/download

Berikut tutorialnya:
1. Tambahkan PPA Mosquitto

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update

2. Install Mosquitto

Sudo apt install mosquitto

Untuk mengetes, saya akan menggunakan Node.JS sebagai client MQTT.

1. Install Node.JS

sudo apt install nodejs
sudo apt install npm

2. Install requirement MQTT clientside untuk node.JS

npm install mqtt --save

3. Buat file baru dengan mengetik

touch testmqtt.js
nano testmqtt.js

4. Masukan baris code dibawah

var mqtt    = require('mqtt');
var client  = mqtt.connect('mqtt://localhost');

client.on('connect', function () {
  client.subscribe('contohtopik');
  client.publish('contohtopik', 'Halo dunia');
});

client.on('message', function (topic, message) {
  console.log(message.toString());
  client.end();
});

5. Quit nano dengan ctrl+o, lalu ctrl+x

6. Jalankan client dengan mengetik

nodejs testmqtt.js

Output program
Output program

Output dari program client diatas seharusnya seperti ini:

Apabila muncul seperti baris diatas, maka selamat ! anda telah berhasil menginstall mosquitto, server MQTT !

Selanjutnya mari kita membedah sedikit client yang saya berikan.

var client  = mqtt.connect('mqtt://localhost');

Digunakan untuk mengkoneksikan client, dalam hal ini program node.js ke server MQTT. apabila server MQTT dan client dalam komputer yang berbeda, silahkan ubah localhost menjadi IP dimana server MQTT berada.

client.on('connect', function () {
  client.subscribe('contohtopik');
  client.publish('contohtopik', 'Halo dunia');
});

akan otomatis dijalankan, ketika client berhasil terkoneksi ke server MQTT, dalam hal ini melakukan dua hal, yang pertama:

  client.subscribe('contohtopik');

Fungsi ini memberitahu server MQTT , bahwa program ini ingin menerima semua pesan dalam topik ‘contohtopik’

  client.publish('contohtopik', 'Halo dunia');

Fungsi ini memberitahu server MQTT bahwa program ini akan mengirimkan pesan ‘Halo dunia’ ke seluruh pengguna server MQTT yang melakukan subscribe ke topik ‘contohtopik’

client.on('message', function (topic, message) {
  console.log(message.toString());
  client.end();
});

Baris ini digunakan untuk melakukan sesuatu terhadap pesan-pesan yang diterima oleh client ini setelah di subscribe. message adalah pesannya, sementara topic adalah topik asal pesan tersebut. Pada program ini, yang dilakukan adalah mengeprint pesan ke console.

Alur lengkap program adalah:
1. program mengkoneksikan diri ke server MQTT
2. program akan subscribe ke topik ‘contohtopik’
3. program mengirimkan ‘Halo dunia’ ke topik ‘contohtopik’
4. server MQTT meneruskan pesan ‘Halo dunia’ ke seluruh subscriber topik.
5. program menerima pesan baru
6. program memprint pesan yang diterima
7. Halo dunia dimunculkan ke console.

Yang perlu di note adalah, client MQTT ini tidak terbatas hanya di Node.JS saja. Anda bisa menggunakan bahasa pemrograman apapun seperti PHP, C , C++ , Java di platform apapun misalnya web, desktop, mobile dan embedded  seperti arduino dan ESP 8266.   Hanya saja, library client yang digunakan berbeda dan memiliki cara pemrograman yang  berbeda juga, walaupun konsep dasar publish-subscribenya tetap sama.

Berikut adalah beberapa library dalam berbagai bahasa pemrogramman, dan biasanya sudah ada tutorial penggunaanya di link tersebut.

PHP : http://www.hivemq.com/blog/mqtt-client-library-encyclopedia-mosquitto-php
C# : https://github.com/ppatierno/m2mqtt
Java : https://github.com/fusesource/mqtt-client
C/C++: https://eclipse.org/paho/
Ruby : https://github.com/njh/ruby-mqtt
Python: https://pypi.python.org/pypi/paho-mqtt/1.1

Selamat mencoba 🙂

Arsitektur Sistem Saklar Internet Of Things dengan ESP8266

Tulisan ini adalah kelanjutan dari tulisan Rencana Proyek Kontrol Lampu Rumah dengan internet. Tulisan ini akan membahas terutama arsitektur sistem.

Untuk merancang arsitektur, kita harus menganalisa terlebih dahulu masalah-masalah apa yang akan muncul. Kita harus melihat sistem yang akan di rancang dari berbagai sudut.

Berikut adalah list pertanyaan yang menurut saya sangat krusial:

  1. Bagaimana membuat komunikasi antara modul saklar dan server reliable?
  2. Bagaimana mengautentikasi pengguna modul saklar?
  3. Bagaimana cara menghandle lebih dari satu saklar sekaligus ?

Solusi yang saya gunakan adalah memecah problem diatas menjadi 2. Masalah nomor 1 dan 3 bisa dipecahkan menggunakan protokol MQTT. Protokol ini di gunakan untuk mengelola koneksi saklar. MQTT adalah sistem transportasi pesan berbasis publish/subscribe. Kita bisa membayangkan sistem ini seperti langganan koran. Seperti sebuah penerbit koran, Saklar melakukan broadcast bahwa dirinya bisa menerbitkan berita / pesan. Setelah itu, client bisa melakukan request langganan berita tersebut ke server MQTT. Hal ini juga berlaku 2 arah, saklar bisa berlangganan berita yang bertujuan mengubah status saklar. Tugas MQTT memanage objek apa berlangganan / menerbitkan berita apa. MQTT juga bisa di berikan password, sehingga hanya saklar & client tertentu yang dapat terkoneksi.

Berikut adalah diagram mengenai arsitektur ini:Screen Shot 2016-03-11 at 12.08.14 PM

Saklar akan mengkoneksikan diri ke server, bukan server yang mencoba mengkoneksian diri ke client. Saat saklar terkoneksi, dia akan mencoba menghubungi MQTT di VPS. Selanjutnya saklar akan mempublikasi eksistensi dirinya dan berlangganan beberapa pesan:

#Saklar akan mempublish message ini setelah terkoneksi: 
announcement,deviceName|status On/Off

#Ketika saklar menerima ini, akan mengubah status saklar
"command/"+deviceName+"/write"   

#Ketika saklar menerima ini, akan mengirim ulang pesan "announcement"
"command/"+deviceName+"/read"
    
#Ketika saklar menerima ini, akan mereset saklar
"command/"+deviceName+"/reset"

Sedangkan Server kontrol cukup berlangganan sebuah pesan:

announcement

Server kontrol berfungsi untuk  merender status masing-masing saklar sebagai situs HTML , manajemen autentikasi pengguna dan mengontrol penjadwalan. WebSocket digunakan agar semua saklar bisa dilihat statusnya secara realtime.  Saat pengguna mengubah status sebuah saklar, server kontrol akan mengirimkan pesan ke server MQTT sebagai berikut:

#Menyalakan Saklar
"command/"+deviceName+"/write",1

#Mematikan Saklar
"command/"+deviceName+"/write",0

Hal lain yang perlu di perhatikan adalah apa yang terjadi saat saklar offline. Yang kita bahas sampai saat ini adalah apa yang terjadi saat saklar online. Mekanisma sederhana yang saya lakukan adalah, mengirimkan pesan “Read” setiap beberapa menit sekali, lalu menghapus presensi di server kontrol apabila saklar tidak menjawab. Hal ini berarti saklar terdeteksi offline tidak real time, tapi saya rasa hal itu sudah lebih dari cukup untuk saat ini.

Sebagai penutup, Saya menggunakan MQTT sebagai server manajemen koneksi, Node.JS sebagai server kontrol, VPS OVH https://www.ovh.com/us/vps/ (karena harganya sangat murah) , sistem operasi Ubuntu 15.10. Tulisan selanjutnya adalah mengenai koding untuk implementasi arsitektur ini di ESP8266.

Cara melakukan programming pada ESP8266

Tulisan ini adalah kelanjutan dari tulisan saya yang berjudul Rencana Proyek Kontrol Lampu Rumah Terintegrasi Internet dengan ESP8266. di tulisan ini akan dibahas bagaimana melakukan programming dan contoh sederhana programnya.

Melakukan programming pada ESP8266 sangatlah mudah. Kamu hanya perlu menyiapkan ESP8266 kamu seperti di tulisan ini : https://www.gilangcp.com/2016/02/27/cara-berkomunikasi-dengan-esp8266-menggunakan-arduino/.

Lalu kamu harus menyiapkan programnya. Berikut ini adalah program sederhana untuk menyalakan pin GPIO nomor 2.

//Fungsi ini di jalankan 1 kali
void setup() {
  //Digunakan untuk mengeset GPIO pin ke 2 sebagai keluaran.
  pinMode(2,OUTPUT);
}

//Fungsi ini dijalankan berulang-ulang
void loop() {
  //Digunakan untuk set voltase GPIO pin 2 menjadi High
  digitalWrite(2,HIGH);
}

Kamu harus copy paste code tersebut ke IDE Arduino, pastikan board type sudah dipilih sebagai “Generic ESP8266 Module.”

Screen Shot 2016-03-03 at 10.20.49 AM

Selanjutnya adalah memasukan Pin RESET & pin GPIO0 ke GND di arduino. Berikut adalah diagram untuk membantu kamu melihat pin di modul.

Pin Out ESP8266
Pin Out ESP8266.

Klik Upload di Arduino IDE. Ketika tulisan status berubah menjadi uploading, lepas pin RESET dari GND nya arduino. Biarkan pin GPIO0 tetap di colok.  Pastikan pin GPIO2 tidak tercolok. Apabila error, ulangi dari awal, masukan pin RESET ke GND dan klik tombol upload, lepas pin RESET ketika status berubah menjadi uploading. proses ini tricky dan mungkin membutuhkan beberapa kali percobaan sebelum sukses.

Screen Shot 2016-03-03 at 11.04.16 AM

Ketika status sudah menjadi Done Uploading, cabut pin GPIO0 dan masukan pin RESET ke Ground, lalu cabut untuk mereset ESP8266. Anda bisa test dengan LED , dengan GPIO2 ke kaki positif LED, dan GND ke kaki negatif LED. Karena di program kita set bahwa GPIO2 HIGH, maka LED akan menyala.

GPIO menyalakan LED

Selamat! anda telah berhasil melakukan programming sederhana ESP8266. Perlu diketahui bahwa firmware AT Command bawaan akan di gantikan oleh program anda, sehingga anda tidak bisa lagi mengirim AT command ke module. Anda bisa memprogram dengan firmware bawaan, dengan mengikuti tutorial ini:

http://www.allaboutcircuits.com/projects/update-the-firmware-in-your-esp8266-wi-fi-module/

Tulisan selanjutnya akan membahas mengenai arsitektur perangkat lunak dan jaringan sistem saklar otomatis ini.

Cara Berkomunikasi Dengan ESP8266 Menggunakan Arduino

Tulisan ini adalah kelanjutan dari tulisan saya yang berjudul Rencana Proyek Kontrol Lampu Rumah Terintegrasi Internet dengan ESP8266. Silahkan baca tulisan tersebut untuk melihat apa tujuan, dan dimana bisa membeli bahan-bahan untuk mengikuti tulisan ini.

Hal yang paling pertama saya lakukan ketika menerima modul-modul tersebut adalah mencari tahu bagaimana cara mengkoneksikan Arduino ke komputer, dan bagaimana mengkoneksikan ESP8266 ke Arduino.

Setelah saya browsing lebih lanjut, saya salah mengira bahwa ESP8266 itu hanya sebuah modul wifi untuk Arduino. ESP8266 ternyata adalah sebuah mikrokontroler seperti Arduino, yang bisa di program dan memiliki port GPIO. Hal ini berarti modul itu bisa di koneksikan langsung ke komputer dan diprogram.

Yang menjadi masalah adalah, modul tersebut tidak memiliki port USB seperti Arduino, sehingga harus menggunakan adapter TTL serial ke USB seperti FT232RL. Kamu bisa membeli FT232RL disini seharga 80.000.

Untungnya, setelah saya pelajari lebih lanjut, Arduino bisa di hack sebagai adapter serial, sehingga kita bisa mengkoneksikan modul tanpa FT232RL. Masalahnya adalah, ESP8266 menggunakan voltase 3.3v, sedangkan voltase arduino adalah 5v. Hal ini berarti kamu beresiko merusak modul ESP8266 kamu, apabila menggunakan cara yang saya jelaskan dibawah, walaupun, saya sudah buktikan sukses melakukan hal ini.

Yang perlu di persiapkan:
1. Instalasi Arduino IDE (https://www.arduino.cc/en/Main/Software)
2. Konfigurasi SDK ESP8266 di Arduino IDE (Tutorial)

  1. Persiapkan Arduino dalam mode serial, Dengan cara menyambungkan pin RESET ke pin GROUND. (Pin ke 3 dengan pin ke 6)
    Reset-Pin
  2. Sambungkan Pin RX di modul dengan RX Arduino, TX dengan TX. Gunakan Gambar di bawah untuk melihat mana pin RX dan TX.Pin Out ESP8266
  3. Gunakan Breadboard, Sambungkan 3.3 volt (Penting! jangan gunakan VCC 5.5 Volt agar tidak merusak ESP8266 anda) Ke bagian + di breadboard, dan GND di arduino ke – di breadboard
    .Breadboard Connection
  4. Koneksikan VCC, CH_PD di ESP8266 ke + di breadboard, Sedangkan GND di modul ke – di breadboard.
  5. Silahkan koneksikan Arduino anda ke komputer, dengan Arduino IDE terbuka. Pilih Tools->Port di menu utama, sesuaikan dengan COM port Arduino anda. Setelah itu, pilih Tools->SerialMonitor. Pilih Both NL & CR, dengan BaudRate 115200. Lalu ketik “AT” dan klik Send.
    Screen Shot 2016-02-27 at 2.20.28 PM

Apabila tulisan OK, hal tersebut berarti anda telah berhasil berkomunikasi dengan ESP8266. Apabila belum, anda mungkin harus memeriksa sambungan kabel dan mencoba merubah baud rate menjadi lebih rendah. Anda bisa mencoba mencari Wifi, Koneksi ke Wifi dengan perintah-perintah AT command di bawah. Cara menuliskan perintahnya menggunakan SerialMonitor seperti diatas.

Kamu bisa melihat command command apa saja yang bisa di kirim di sini : http://wiki.iteadstudio.com/ESP8266_Serial_WIFI_Module

Selamat Mencoba!

Tulisan selanjutnya akan berfokus ke bagaimana cara memprogram dan memainkan port GPIOnya.