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.